curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/pay_rates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"work_assignment_id": "<id>",
"title": "Marketing Manager",
"type": "hourly",
"rate": "15",
"expected_hours_per_week": "40",
"effective_from": "2026-01-01",
"tag_assignment": {
"unit": "percentage",
"tag_allocations": [
{
"tags": [
"<id>"
],
"value": 100
}
]
}
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/pay_rates"
payload = {
"work_assignment_id": "<id>",
"title": "Marketing Manager",
"type": "hourly",
"rate": "15",
"expected_hours_per_week": "40",
"effective_from": "2026-01-01",
"tag_assignment": {
"unit": "percentage",
"tag_allocations": [
{
"tags": ["<id>"],
"value": 100
}
]
}
}
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({
work_assignment_id: '<id>',
title: 'Marketing Manager',
type: 'hourly',
rate: '15',
expected_hours_per_week: '40',
effective_from: '2026-01-01',
tag_assignment: {unit: 'percentage', tag_allocations: [{tags: ['<id>'], value: 100}]}
})
};
fetch('https://sandbox.nmbr.co/services/payroll/pay_rates', 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/pay_rates",
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([
'work_assignment_id' => '<id>',
'title' => 'Marketing Manager',
'type' => 'hourly',
'rate' => '15',
'expected_hours_per_week' => '40',
'effective_from' => '2026-01-01',
'tag_assignment' => [
'unit' => 'percentage',
'tag_allocations' => [
[
'tags' => [
'<id>'
],
'value' => 100
]
]
]
]),
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/pay_rates"
payload := strings.NewReader("{\n \"work_assignment_id\": \"<id>\",\n \"title\": \"Marketing Manager\",\n \"type\": \"hourly\",\n \"rate\": \"15\",\n \"expected_hours_per_week\": \"40\",\n \"effective_from\": \"2026-01-01\",\n \"tag_assignment\": {\n \"unit\": \"percentage\",\n \"tag_allocations\": [\n {\n \"tags\": [\n \"<id>\"\n ],\n \"value\": 100\n }\n ]\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/pay_rates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"work_assignment_id\": \"<id>\",\n \"title\": \"Marketing Manager\",\n \"type\": \"hourly\",\n \"rate\": \"15\",\n \"expected_hours_per_week\": \"40\",\n \"effective_from\": \"2026-01-01\",\n \"tag_assignment\": {\n \"unit\": \"percentage\",\n \"tag_allocations\": [\n {\n \"tags\": [\n \"<id>\"\n ],\n \"value\": 100\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/pay_rates")
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 \"work_assignment_id\": \"<id>\",\n \"title\": \"Marketing Manager\",\n \"type\": \"hourly\",\n \"rate\": \"15\",\n \"expected_hours_per_week\": \"40\",\n \"effective_from\": \"2026-01-01\",\n \"tag_assignment\": {\n \"unit\": \"percentage\",\n \"tag_allocations\": [\n {\n \"tags\": [\n \"<id>\"\n ],\n \"value\": 100\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "pay_rate",
"data": {
"work_assignment": {
"id": "<id>",
"object": "work_assignment",
"links": {
"self": "/work_assignments/<id>"
}
},
"title": "Marketing Manager",
"title_translations": null,
"title_translated": "Marketing Manager",
"type": "hourly",
"rate": 15,
"expected_hours_per_week": 40,
"is_editable": true,
"is_deletable": true,
"effective_from": "2026-01-01",
"earliest_valid_effective_to": "2026-01-01",
"effective_to": null,
"business_preset": null,
"expense_accounting_code": null,
"liability_accounting_code": null,
"external_ref": null,
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/pay_rates/<id>"
}
}Create a pay rate
curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/pay_rates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"work_assignment_id": "<id>",
"title": "Marketing Manager",
"type": "hourly",
"rate": "15",
"expected_hours_per_week": "40",
"effective_from": "2026-01-01",
"tag_assignment": {
"unit": "percentage",
"tag_allocations": [
{
"tags": [
"<id>"
],
"value": 100
}
]
}
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/pay_rates"
payload = {
"work_assignment_id": "<id>",
"title": "Marketing Manager",
"type": "hourly",
"rate": "15",
"expected_hours_per_week": "40",
"effective_from": "2026-01-01",
"tag_assignment": {
"unit": "percentage",
"tag_allocations": [
{
"tags": ["<id>"],
"value": 100
}
]
}
}
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({
work_assignment_id: '<id>',
title: 'Marketing Manager',
type: 'hourly',
rate: '15',
expected_hours_per_week: '40',
effective_from: '2026-01-01',
tag_assignment: {unit: 'percentage', tag_allocations: [{tags: ['<id>'], value: 100}]}
})
};
fetch('https://sandbox.nmbr.co/services/payroll/pay_rates', 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/pay_rates",
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([
'work_assignment_id' => '<id>',
'title' => 'Marketing Manager',
'type' => 'hourly',
'rate' => '15',
'expected_hours_per_week' => '40',
'effective_from' => '2026-01-01',
'tag_assignment' => [
'unit' => 'percentage',
'tag_allocations' => [
[
'tags' => [
'<id>'
],
'value' => 100
]
]
]
]),
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/pay_rates"
payload := strings.NewReader("{\n \"work_assignment_id\": \"<id>\",\n \"title\": \"Marketing Manager\",\n \"type\": \"hourly\",\n \"rate\": \"15\",\n \"expected_hours_per_week\": \"40\",\n \"effective_from\": \"2026-01-01\",\n \"tag_assignment\": {\n \"unit\": \"percentage\",\n \"tag_allocations\": [\n {\n \"tags\": [\n \"<id>\"\n ],\n \"value\": 100\n }\n ]\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/pay_rates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"work_assignment_id\": \"<id>\",\n \"title\": \"Marketing Manager\",\n \"type\": \"hourly\",\n \"rate\": \"15\",\n \"expected_hours_per_week\": \"40\",\n \"effective_from\": \"2026-01-01\",\n \"tag_assignment\": {\n \"unit\": \"percentage\",\n \"tag_allocations\": [\n {\n \"tags\": [\n \"<id>\"\n ],\n \"value\": 100\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/pay_rates")
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 \"work_assignment_id\": \"<id>\",\n \"title\": \"Marketing Manager\",\n \"type\": \"hourly\",\n \"rate\": \"15\",\n \"expected_hours_per_week\": \"40\",\n \"effective_from\": \"2026-01-01\",\n \"tag_assignment\": {\n \"unit\": \"percentage\",\n \"tag_allocations\": [\n {\n \"tags\": [\n \"<id>\"\n ],\n \"value\": 100\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "pay_rate",
"data": {
"work_assignment": {
"id": "<id>",
"object": "work_assignment",
"links": {
"self": "/work_assignments/<id>"
}
},
"title": "Marketing Manager",
"title_translations": null,
"title_translated": "Marketing Manager",
"type": "hourly",
"rate": 15,
"expected_hours_per_week": 40,
"is_editable": true,
"is_deletable": true,
"effective_from": "2026-01-01",
"earliest_valid_effective_to": "2026-01-01",
"effective_to": null,
"business_preset": null,
"expense_accounting_code": null,
"liability_accounting_code": null,
"external_ref": null,
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/pay_rates/<id>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Must belong to a work assignment associated with an entity of type Employee.
The annual salary when type is salary, or the hourly wage when type is hourly.
For salary pay rates, rate is the annual salary (i.e. amount per year). For wage pay rates, rate is the hourly wage (i.e. amount per hour).
0 <= x <= 9999999The expected number of working hours per week. Must be greater than 0 for salary pay rates. Used to calculate the equivalent hourly rate from salaries for overtime.
0 <= x <= 168The date from which this pay rate is applied to Pay Stubs.
Required unless the business preset referenced by business_preset_id already has a title. Either the pay rate or its preset must have one.
255Whether this is a salary or hourly pay rate. Determines how rate is interpreted.
Must be present when business_preset_id is either empty or not set.
hourly, salary The date after which this pay rate is no longer applied and can no longer be used to create Earning Line Items. null if the pay rate applies indefinitely.
255Hide child attributes
Hide child attributes
Response
Created
The unique identifier of the object in Nmbr.
The type of the object in Nmbr ("pay_rate").
Hide child attributes
Hide child attributes
255The translation of the title property for the request locale. Computed using the values in title and title_translations and the value of the request's Accept-Language header.
Whether this is a salary or hourly pay rate. Determines how rate is interpreted.
hourly, salary The annual salary when type is salary, or the hourly wage when type is hourly.
The expected number of working hours per week. Must be greater than 0 for salary pay rates. Used to calculate the equivalent hourly rate from salaries for overtime.
Whether the pay rate's type, rate, and effective_from can be modified. Once the pay rate has been used on a non-draft Payroll, these fields are locked.
Whether the pay rate can be deleted. A pay rate may not be deleted once it has been used on a non-draft Payroll.
The date from which this pay rate is applied to Pay Stubs.
The earliest date that effective_to may be set to, based on the most recent non-draft Payroll period in which this pay rate was active.
The date after which this pay rate is no longer applied and can no longer be used to create Earning Line Items. null if the pay rate applies indefinitely.
A reference to the object in an external system, e.g. the primary key of the object in your application's database. Nmbr doesn't use, validate, parse, or require this value to be unique - it simply stores it for your reference.
255The date and time the object was created in Nmbr.
The date and time the object was last updated in Nmbr.

