curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/accounting_code_rules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_entity_id": "<id>",
"type": "earning",
"expense_accounting_code_id": "<id>",
"liability_accounting_code_id": "<id>",
"expense_segment_template": {
"segments": [
{
"type": "accounting_code",
"id": "<id>",
"prefix": "GL-"
},
{
"type": "tag_group",
"tag_group_id": "<id>",
"prefix": "-",
"transform": [
"uppercase"
],
"fallback": "0000"
}
]
},
"subtypes": [
"wage",
"salary"
]
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/accounting_code_rules"
payload = {
"business_entity_id": "<id>",
"type": "earning",
"expense_accounting_code_id": "<id>",
"liability_accounting_code_id": "<id>",
"expense_segment_template": { "segments": [
{
"type": "accounting_code",
"id": "<id>",
"prefix": "GL-"
},
{
"type": "tag_group",
"tag_group_id": "<id>",
"prefix": "-",
"transform": ["uppercase"],
"fallback": "0000"
}
] },
"subtypes": ["wage", "salary"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
business_entity_id: '<id>',
type: 'earning',
expense_accounting_code_id: '<id>',
liability_accounting_code_id: '<id>',
expense_segment_template: {
segments: [
{type: 'accounting_code', id: '<id>', prefix: 'GL-'},
{
type: 'tag_group',
tag_group_id: '<id>',
prefix: '-',
transform: ['uppercase'],
fallback: '0000'
}
]
},
subtypes: ['wage', 'salary']
})
};
fetch('https://sandbox.nmbr.co/services/payroll/accounting_code_rules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.nmbr.co/services/payroll/accounting_code_rules",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'business_entity_id' => '<id>',
'type' => 'earning',
'expense_accounting_code_id' => '<id>',
'liability_accounting_code_id' => '<id>',
'expense_segment_template' => [
'segments' => [
[
'type' => 'accounting_code',
'id' => '<id>',
'prefix' => 'GL-'
],
[
'type' => 'tag_group',
'tag_group_id' => '<id>',
'prefix' => '-',
'transform' => [
'uppercase'
],
'fallback' => '0000'
]
]
],
'subtypes' => [
'wage',
'salary'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.nmbr.co/services/payroll/accounting_code_rules"
payload := strings.NewReader("{\n \"business_entity_id\": \"<id>\",\n \"type\": \"earning\",\n \"expense_accounting_code_id\": \"<id>\",\n \"liability_accounting_code_id\": \"<id>\",\n \"expense_segment_template\": {\n \"segments\": [\n {\n \"type\": \"accounting_code\",\n \"id\": \"<id>\",\n \"prefix\": \"GL-\"\n },\n {\n \"type\": \"tag_group\",\n \"tag_group_id\": \"<id>\",\n \"prefix\": \"-\",\n \"transform\": [\n \"uppercase\"\n ],\n \"fallback\": \"0000\"\n }\n ]\n },\n \"subtypes\": [\n \"wage\",\n \"salary\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.nmbr.co/services/payroll/accounting_code_rules")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_entity_id\": \"<id>\",\n \"type\": \"earning\",\n \"expense_accounting_code_id\": \"<id>\",\n \"liability_accounting_code_id\": \"<id>\",\n \"expense_segment_template\": {\n \"segments\": [\n {\n \"type\": \"accounting_code\",\n \"id\": \"<id>\",\n \"prefix\": \"GL-\"\n },\n {\n \"type\": \"tag_group\",\n \"tag_group_id\": \"<id>\",\n \"prefix\": \"-\",\n \"transform\": [\n \"uppercase\"\n ],\n \"fallback\": \"0000\"\n }\n ]\n },\n \"subtypes\": [\n \"wage\",\n \"salary\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/accounting_code_rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"business_entity_id\": \"<id>\",\n \"type\": \"earning\",\n \"expense_accounting_code_id\": \"<id>\",\n \"liability_accounting_code_id\": \"<id>\",\n \"expense_segment_template\": {\n \"segments\": [\n {\n \"type\": \"accounting_code\",\n \"id\": \"<id>\",\n \"prefix\": \"GL-\"\n },\n {\n \"type\": \"tag_group\",\n \"tag_group_id\": \"<id>\",\n \"prefix\": \"-\",\n \"transform\": [\n \"uppercase\"\n ],\n \"fallback\": \"0000\"\n }\n ]\n },\n \"subtypes\": [\n \"wage\",\n \"salary\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "accounting_code_rule",
"data": {
"business_entity": {
"id": "<id>",
"object": "business_entity",
"links": {
"self": "/business_entities/<id>"
}
},
"tag_group": null,
"tag": null,
"type": "earning",
"subtype": "wage",
"subtypes": [
"wage",
"salary"
],
"business_preset": null,
"expense_accounting_code": {
"id": "<id>",
"object": "accounting_code",
"links": {
"self": "/accounting_codes/<id>"
}
},
"liability_accounting_code": {
"id": "<id>",
"object": "accounting_code",
"links": {
"self": "/accounting_codes/<id>"
}
},
"expense_segment_template": {
"segments": [
{
"type": "accounting_code",
"id": "<id>",
"prefix": "GL-"
},
{
"type": "tag_group",
"tag_group_id": "<id>",
"prefix": "-",
"transform": [
"uppercase"
],
"fallback": "0000"
}
]
},
"liability_segment_template": null,
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/accounting_code_rules/<id>"
}
}Create an accounting code rule
curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/accounting_code_rules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_entity_id": "<id>",
"type": "earning",
"expense_accounting_code_id": "<id>",
"liability_accounting_code_id": "<id>",
"expense_segment_template": {
"segments": [
{
"type": "accounting_code",
"id": "<id>",
"prefix": "GL-"
},
{
"type": "tag_group",
"tag_group_id": "<id>",
"prefix": "-",
"transform": [
"uppercase"
],
"fallback": "0000"
}
]
},
"subtypes": [
"wage",
"salary"
]
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/accounting_code_rules"
payload = {
"business_entity_id": "<id>",
"type": "earning",
"expense_accounting_code_id": "<id>",
"liability_accounting_code_id": "<id>",
"expense_segment_template": { "segments": [
{
"type": "accounting_code",
"id": "<id>",
"prefix": "GL-"
},
{
"type": "tag_group",
"tag_group_id": "<id>",
"prefix": "-",
"transform": ["uppercase"],
"fallback": "0000"
}
] },
"subtypes": ["wage", "salary"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
business_entity_id: '<id>',
type: 'earning',
expense_accounting_code_id: '<id>',
liability_accounting_code_id: '<id>',
expense_segment_template: {
segments: [
{type: 'accounting_code', id: '<id>', prefix: 'GL-'},
{
type: 'tag_group',
tag_group_id: '<id>',
prefix: '-',
transform: ['uppercase'],
fallback: '0000'
}
]
},
subtypes: ['wage', 'salary']
})
};
fetch('https://sandbox.nmbr.co/services/payroll/accounting_code_rules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.nmbr.co/services/payroll/accounting_code_rules",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'business_entity_id' => '<id>',
'type' => 'earning',
'expense_accounting_code_id' => '<id>',
'liability_accounting_code_id' => '<id>',
'expense_segment_template' => [
'segments' => [
[
'type' => 'accounting_code',
'id' => '<id>',
'prefix' => 'GL-'
],
[
'type' => 'tag_group',
'tag_group_id' => '<id>',
'prefix' => '-',
'transform' => [
'uppercase'
],
'fallback' => '0000'
]
]
],
'subtypes' => [
'wage',
'salary'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.nmbr.co/services/payroll/accounting_code_rules"
payload := strings.NewReader("{\n \"business_entity_id\": \"<id>\",\n \"type\": \"earning\",\n \"expense_accounting_code_id\": \"<id>\",\n \"liability_accounting_code_id\": \"<id>\",\n \"expense_segment_template\": {\n \"segments\": [\n {\n \"type\": \"accounting_code\",\n \"id\": \"<id>\",\n \"prefix\": \"GL-\"\n },\n {\n \"type\": \"tag_group\",\n \"tag_group_id\": \"<id>\",\n \"prefix\": \"-\",\n \"transform\": [\n \"uppercase\"\n ],\n \"fallback\": \"0000\"\n }\n ]\n },\n \"subtypes\": [\n \"wage\",\n \"salary\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.nmbr.co/services/payroll/accounting_code_rules")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_entity_id\": \"<id>\",\n \"type\": \"earning\",\n \"expense_accounting_code_id\": \"<id>\",\n \"liability_accounting_code_id\": \"<id>\",\n \"expense_segment_template\": {\n \"segments\": [\n {\n \"type\": \"accounting_code\",\n \"id\": \"<id>\",\n \"prefix\": \"GL-\"\n },\n {\n \"type\": \"tag_group\",\n \"tag_group_id\": \"<id>\",\n \"prefix\": \"-\",\n \"transform\": [\n \"uppercase\"\n ],\n \"fallback\": \"0000\"\n }\n ]\n },\n \"subtypes\": [\n \"wage\",\n \"salary\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/accounting_code_rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"business_entity_id\": \"<id>\",\n \"type\": \"earning\",\n \"expense_accounting_code_id\": \"<id>\",\n \"liability_accounting_code_id\": \"<id>\",\n \"expense_segment_template\": {\n \"segments\": [\n {\n \"type\": \"accounting_code\",\n \"id\": \"<id>\",\n \"prefix\": \"GL-\"\n },\n {\n \"type\": \"tag_group\",\n \"tag_group_id\": \"<id>\",\n \"prefix\": \"-\",\n \"transform\": [\n \"uppercase\"\n ],\n \"fallback\": \"0000\"\n }\n ]\n },\n \"subtypes\": [\n \"wage\",\n \"salary\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "accounting_code_rule",
"data": {
"business_entity": {
"id": "<id>",
"object": "business_entity",
"links": {
"self": "/business_entities/<id>"
}
},
"tag_group": null,
"tag": null,
"type": "earning",
"subtype": "wage",
"subtypes": [
"wage",
"salary"
],
"business_preset": null,
"expense_accounting_code": {
"id": "<id>",
"object": "accounting_code",
"links": {
"self": "/accounting_codes/<id>"
}
},
"liability_accounting_code": {
"id": "<id>",
"object": "accounting_code",
"links": {
"self": "/accounting_codes/<id>"
}
},
"expense_segment_template": {
"segments": [
{
"type": "accounting_code",
"id": "<id>",
"prefix": "GL-"
},
{
"type": "tag_group",
"tag_group_id": "<id>",
"prefix": "-",
"transform": [
"uppercase"
],
"fallback": "0000"
}
]
},
"liability_segment_template": null,
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/accounting_code_rules/<id>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
A tag group to scope this rule to. When set without tag_id, creates a tag-group-level rule that applies to all tags in the group.
A tag from the business entity's accounting code tag group. Optional — when omitted, the rule matches line items by type/subtype or business_preset_id alone.
The line item type to scope this rule to (e.g. earning, deduction). Mutually exclusive with business_preset_id.
allowance, deduction, earning, employee_benefit, employer_benefit, employer_statutory_withholding, reimbursement, statutory_withholding This attribute is deprecated and will be removed.
Use subtypes. Still accepted, meaning a single-member set, and rejected against a rule that already holds several subtypes rather than truncating it. Sending both fields with values that disagree is rejected.
The line item subtypes to further scope this rule to (e.g. wage, salary). A rule matches a line item whose subtype is any member of the set. Every subtype must belong to type, which a non-empty set requires. Supplying the set replaces it outright — there is no add-one or remove-one. No two rules in the same scope (same tag, same tag group, or both global) and on the same type may share a subtype.
A business preset to scope this rule to. Provides the highest specificity match. Mutually exclusive with type and subtypes.
A rule with none of tag_id, tag_group_id, type, or business_preset_id is the catch-all: it matches any line item as the last resort when no other rule applies. At most one catch-all may exist per business entity.
Assembles a formatted accounting code for the journal entry report: each segment resolves to a value, is wrapped and transformed, and the results are concatenated in order. Only valid on rules with no tag and no tag group; null when unset.
Hide child attributes
Hide child attributes
Ordered segments concatenated into the generated code.
1 - 20 elementsEmits the referenced accounting code's code.
- Fixed accounting code
- Tag group code
- Literal text
Hide child attributes
Hide child attributes
accounting_code Id of an accounting code in this business entity.
Literal text prepended to the resolved value.
255Literal text appended to the resolved value.
255Transforms applied to the resolved value in the order listed.
alphanumeric, lowercase, uppercase Truncates the resolved value to this many characters.
x >= 1Substituted when the resolved value is empty. When absent or empty, an empty segment is dropped instead — prefix and suffix included.
255Assembles a formatted accounting code for the journal entry report: each segment resolves to a value, is wrapped and transformed, and the results are concatenated in order. Only valid on rules with no tag and no tag group; null when unset.
Hide child attributes
Hide child attributes
Ordered segments concatenated into the generated code.
1 - 20 elementsEmits the referenced accounting code's code.
- Fixed accounting code
- Tag group code
- Literal text
Hide child attributes
Hide child attributes
accounting_code Id of an accounting code in this business entity.
Literal text prepended to the resolved value.
255Literal text appended to the resolved value.
255Transforms applied to the resolved value in the order listed.
alphanumeric, lowercase, uppercase Truncates the resolved value to this many characters.
x >= 1Substituted when the resolved value is empty. When absent or empty, an empty segment is dropped instead — prefix and suffix included.
255Response
Created
The unique identifier of the object in Nmbr.
The type of the object in Nmbr ("accounting_code_rule").
Hide child attributes
Hide child attributes
The line item type this rule applies to (e.g. earning, deduction). When combined with subtypes, narrows the rule to specific line item categories. Mutually exclusive with business_preset.
255This attribute is deprecated and will be removed.
Use subtypes. The first member of the set, or null when the set is empty.
255The line item subtypes this rule applies to (e.g. wage, salary). The rule matches a line item whose subtype is any member of the set. Every member belongs to type, which a non-empty set requires. Empty when the rule is not scoped to a subtype.
A business preset this rule applies to. Provides the highest specificity match. Mutually exclusive with type and subtypes.
The liability accounting code assigned when this rule matches.
Assembles a formatted accounting code for the journal entry report: each segment resolves to a value, is wrapped and transformed, and the results are concatenated in order. Only valid on rules with no tag and no tag group; null when unset.
Hide child attributes
Hide child attributes
Ordered segments concatenated into the generated code.
1 - 20 elementsEmits the referenced accounting code's code.
- Fixed accounting code
- Tag group code
- Literal text
Hide child attributes
Hide child attributes
accounting_code Id of an accounting code in this business entity.
Literal text prepended to the resolved value.
255Literal text appended to the resolved value.
255Transforms applied to the resolved value in the order listed.
alphanumeric, lowercase, uppercase Truncates the resolved value to this many characters.
x >= 1Substituted when the resolved value is empty. When absent or empty, an empty segment is dropped instead — prefix and suffix included.
255Assembles a formatted accounting code for the journal entry report: each segment resolves to a value, is wrapped and transformed, and the results are concatenated in order. Only valid on rules with no tag and no tag group; null when unset.
Hide child attributes
Hide child attributes
Ordered segments concatenated into the generated code.
1 - 20 elementsEmits the referenced accounting code's code.
- Fixed accounting code
- Tag group code
- Literal text
Hide child attributes
Hide child attributes
accounting_code Id of an accounting code in this business entity.
Literal text prepended to the resolved value.
255Literal text appended to the resolved value.
255Transforms applied to the resolved value in the order listed.
alphanumeric, lowercase, uppercase Truncates the resolved value to this many characters.
x >= 1Substituted when the resolved value is empty. When absent or empty, an empty segment is dropped instead — prefix and suffix included.
255The date and time the object was created in Nmbr.
The date and time the object was last updated in Nmbr.

