curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/tag_groups \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_entity_id": "<id>",
"label": "Department",
"description": "Departments within the organization"
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/tag_groups"
payload = {
"business_entity_id": "<id>",
"label": "Department",
"description": "Departments within the organization"
}
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>',
label: 'Department',
description: 'Departments within the organization'
})
};
fetch('https://sandbox.nmbr.co/services/payroll/tag_groups', 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/tag_groups",
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>',
'label' => 'Department',
'description' => 'Departments within the organization'
]),
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/tag_groups"
payload := strings.NewReader("{\n \"business_entity_id\": \"<id>\",\n \"label\": \"Department\",\n \"description\": \"Departments within the organization\"\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/tag_groups")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_entity_id\": \"<id>\",\n \"label\": \"Department\",\n \"description\": \"Departments within the organization\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/tag_groups")
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 \"label\": \"Department\",\n \"description\": \"Departments within the organization\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "tag_group",
"data": {
"label": "Department",
"label_translations": null,
"label_translated": "Department",
"description": "Departments within the organization",
"description_translations": null,
"description_translated": "Departments within the organization",
"color": null,
"archived_at": null,
"is_deletable": null,
"is_component_locked": null,
"is_journal_entry_dimension": null,
"integrations": {
"xero": {
"id": null,
"type": null
},
"quickbooks": {
"type": null
}
},
"business_entity": {
"id": "<id>",
"object": "business_entity",
"links": {
"self": "/business_entities/<id>"
}
},
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/tag_groups/<id>"
}
}Create a tag group
curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/tag_groups \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_entity_id": "<id>",
"label": "Department",
"description": "Departments within the organization"
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/tag_groups"
payload = {
"business_entity_id": "<id>",
"label": "Department",
"description": "Departments within the organization"
}
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>',
label: 'Department',
description: 'Departments within the organization'
})
};
fetch('https://sandbox.nmbr.co/services/payroll/tag_groups', 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/tag_groups",
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>',
'label' => 'Department',
'description' => 'Departments within the organization'
]),
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/tag_groups"
payload := strings.NewReader("{\n \"business_entity_id\": \"<id>\",\n \"label\": \"Department\",\n \"description\": \"Departments within the organization\"\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/tag_groups")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_entity_id\": \"<id>\",\n \"label\": \"Department\",\n \"description\": \"Departments within the organization\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/tag_groups")
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 \"label\": \"Department\",\n \"description\": \"Departments within the organization\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "tag_group",
"data": {
"label": "Department",
"label_translations": null,
"label_translated": "Department",
"description": "Departments within the organization",
"description_translations": null,
"description_translated": "Departments within the organization",
"color": null,
"archived_at": null,
"is_deletable": null,
"is_component_locked": null,
"is_journal_entry_dimension": null,
"integrations": {
"xero": {
"id": null,
"type": null
},
"quickbooks": {
"type": null
}
},
"business_entity": {
"id": "<id>",
"object": "business_entity",
"links": {
"self": "/business_entities/<id>"
}
},
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/tag_groups/<id>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
255A hex colour code for the tag group (e.g. #AABBCC or #ABC). Used for display.
When true, prevents modification of tags in this group through the embedded portal. Tags can still be managed through the API.
When true, marks this tag group as a journal entry dimension. A maximum of three tag groups per business entity can be journal entry dimensions.
Identifiers and object types for this tag group in external accounting integrations, used to sync tag groups imported from those systems. QuickBooks does not expose a group-level identifier, so only the type is accepted for QuickBooks.
Hide child attributes
Hide child attributes
Response
Created
The unique identifier of the object in Nmbr.
The type of the object in Nmbr ("tag_group").
Hide child attributes
Hide child attributes
255The translation of the label property for the request locale. Computed using the values in label and label_translations and the value of the request's Accept-Language header.
The translation of the description property for the request locale. Computed using the values in description and description_translations and the value of the request's Accept-Language header.
A hex colour code for the tag group (e.g. #AABBCC or #ABC). Used for display.
7When set, the tag group is archived and excluded from index listings by default.
A tag group may not be deleted while it is the primary tag group or any of its tags are assigned to active allocations.
When true, the tags within this group cannot be modified through the embedded portal. Tags can still be managed through the API.
When true, this tag group is used as a dimension in journal entry reports. A business entity can have up to three journal entry dimensions.
Identifiers and object types for this tag group in external accounting integrations, used to sync tag groups imported from those systems. QuickBooks does not expose a group-level identifier, so only the type is stored for QuickBooks.
Hide child attributes
Hide child attributes
The date and time the object was created in Nmbr.
The date and time the object was last updated in Nmbr.

