curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/employer_benefits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"work_assignment_id": "<id>",
"employer_benefit_type": "health",
"frequency": "per_payroll",
"amount": 50,
"amount_type": "fixed",
"effective_from": "2026-01-01",
"title": "Health Benefit",
"tag_assignment": {
"unit": "percentage",
"tag_allocations": [
{
"tags": [
"<id>"
],
"value": 100
}
]
}
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/employer_benefits"
payload = {
"work_assignment_id": "<id>",
"employer_benefit_type": "health",
"frequency": "per_payroll",
"amount": 50,
"amount_type": "fixed",
"effective_from": "2026-01-01",
"title": "Health Benefit",
"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>',
employer_benefit_type: 'health',
frequency: 'per_payroll',
amount: 50,
amount_type: 'fixed',
effective_from: '2026-01-01',
title: 'Health Benefit',
tag_assignment: {unit: 'percentage', tag_allocations: [{tags: ['<id>'], value: 100}]}
})
};
fetch('https://sandbox.nmbr.co/services/payroll/employer_benefits', 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/employer_benefits",
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>',
'employer_benefit_type' => 'health',
'frequency' => 'per_payroll',
'amount' => 50,
'amount_type' => 'fixed',
'effective_from' => '2026-01-01',
'title' => 'Health Benefit',
'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/employer_benefits"
payload := strings.NewReader("{\n \"work_assignment_id\": \"<id>\",\n \"employer_benefit_type\": \"health\",\n \"frequency\": \"per_payroll\",\n \"amount\": 50,\n \"amount_type\": \"fixed\",\n \"effective_from\": \"2026-01-01\",\n \"title\": \"Health Benefit\",\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/employer_benefits")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"work_assignment_id\": \"<id>\",\n \"employer_benefit_type\": \"health\",\n \"frequency\": \"per_payroll\",\n \"amount\": 50,\n \"amount_type\": \"fixed\",\n \"effective_from\": \"2026-01-01\",\n \"title\": \"Health Benefit\",\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/employer_benefits")
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 \"employer_benefit_type\": \"health\",\n \"frequency\": \"per_payroll\",\n \"amount\": 50,\n \"amount_type\": \"fixed\",\n \"effective_from\": \"2026-01-01\",\n \"title\": \"Health Benefit\",\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": "employer_benefit",
"data": {
"work_assignment": {
"id": "<id>",
"object": "work_assignment",
"links": {
"self": "/work_assignments/<id>"
}
},
"business_preset": null,
"employer_benefit_type": {
"id": "<id>",
"object": "employer_benefit_type",
"data": {
"type": "health",
"label": "Health"
},
"links": {
"self": "/employer_benefit_types/health"
}
},
"employee_benefit": null,
"title": "Health Benefit",
"title_translations": null,
"title_translated": "Health Benefit",
"apply_sales_tax": false,
"income_basis": "regular_earnings",
"income_includes": [],
"remittance_account_id": null,
"remittance_account": null,
"amount": 50,
"amount_type": "fixed",
"hours_basis": "all_earnings",
"hours_includes": [],
"coverage_multiplier": 1,
"max_annual_contribution": null,
"max_annual_contribution_basis": "this_benefit",
"frequency": "per_payroll",
"date_basis": null,
"pay_period_cadence": null,
"effective_from": "2026-01-01",
"effective_to": 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": "/employer_benefits/<id>"
}
}Create an employer benefit
curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/employer_benefits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"work_assignment_id": "<id>",
"employer_benefit_type": "health",
"frequency": "per_payroll",
"amount": 50,
"amount_type": "fixed",
"effective_from": "2026-01-01",
"title": "Health Benefit",
"tag_assignment": {
"unit": "percentage",
"tag_allocations": [
{
"tags": [
"<id>"
],
"value": 100
}
]
}
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/employer_benefits"
payload = {
"work_assignment_id": "<id>",
"employer_benefit_type": "health",
"frequency": "per_payroll",
"amount": 50,
"amount_type": "fixed",
"effective_from": "2026-01-01",
"title": "Health Benefit",
"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>',
employer_benefit_type: 'health',
frequency: 'per_payroll',
amount: 50,
amount_type: 'fixed',
effective_from: '2026-01-01',
title: 'Health Benefit',
tag_assignment: {unit: 'percentage', tag_allocations: [{tags: ['<id>'], value: 100}]}
})
};
fetch('https://sandbox.nmbr.co/services/payroll/employer_benefits', 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/employer_benefits",
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>',
'employer_benefit_type' => 'health',
'frequency' => 'per_payroll',
'amount' => 50,
'amount_type' => 'fixed',
'effective_from' => '2026-01-01',
'title' => 'Health Benefit',
'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/employer_benefits"
payload := strings.NewReader("{\n \"work_assignment_id\": \"<id>\",\n \"employer_benefit_type\": \"health\",\n \"frequency\": \"per_payroll\",\n \"amount\": 50,\n \"amount_type\": \"fixed\",\n \"effective_from\": \"2026-01-01\",\n \"title\": \"Health Benefit\",\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/employer_benefits")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"work_assignment_id\": \"<id>\",\n \"employer_benefit_type\": \"health\",\n \"frequency\": \"per_payroll\",\n \"amount\": 50,\n \"amount_type\": \"fixed\",\n \"effective_from\": \"2026-01-01\",\n \"title\": \"Health Benefit\",\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/employer_benefits")
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 \"employer_benefit_type\": \"health\",\n \"frequency\": \"per_payroll\",\n \"amount\": 50,\n \"amount_type\": \"fixed\",\n \"effective_from\": \"2026-01-01\",\n \"title\": \"Health Benefit\",\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": "employer_benefit",
"data": {
"work_assignment": {
"id": "<id>",
"object": "work_assignment",
"links": {
"self": "/work_assignments/<id>"
}
},
"business_preset": null,
"employer_benefit_type": {
"id": "<id>",
"object": "employer_benefit_type",
"data": {
"type": "health",
"label": "Health"
},
"links": {
"self": "/employer_benefit_types/health"
}
},
"employee_benefit": null,
"title": "Health Benefit",
"title_translations": null,
"title_translated": "Health Benefit",
"apply_sales_tax": false,
"income_basis": "regular_earnings",
"income_includes": [],
"remittance_account_id": null,
"remittance_account": null,
"amount": 50,
"amount_type": "fixed",
"hours_basis": "all_earnings",
"hours_includes": [],
"coverage_multiplier": 1,
"max_annual_contribution": null,
"max_annual_contribution_basis": "this_benefit",
"frequency": "per_payroll",
"date_basis": null,
"pay_period_cadence": null,
"effective_from": "2026-01-01",
"effective_to": 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": "/employer_benefits/<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 frequency at which this benefit is applied to Pay Stubs. When per_month, the amount is distributed across the selected Payrolls in the calendar month. per_month requires amount_type to be fixed.
once, per_month, per_payroll The contribution amount per pay period. When amount_type is percent, this is interpreted as a percentage of the income basis (0-100). When fixed_per_hour, it is multiplied by the hours on the Pay Stub's earning line items selected by hours_basis and hours_includes. Otherwise it is a fixed dollar amount.
Up to 2 decimal places.
x >= 0Must be a multiple of 0.01Whether amount is a fixed dollar value (fixed), a dollar value per hour worked (fixed_per_hour), or a percentage of the income basis (percent).
fixed, fixed_per_hour, percent The date from which this benefit is applied to Pay Stubs.
The type of employer benefit, which determines how it is categorized and reported.
Must be present when business_preset_id is either empty or not set.
accident_insurance_plan, board_and_lodging_insurable, board_and_lodging_non_insurable, critical_illness, debt_relief, dental, employee_assistance_program, fondaction, fondaction_rrsp, fonds_solidarite_ftq, fonds_solidarite_ftq_rrsp, gift_near_cash, gift_non_cash_non_taxable, gift_non_cash_taxable, group_dependent_life_insurance, group_term_life_insurance, health, health_spending_account, long_term_disability, meals_subsidized_non_cash, non_group_long_term_disability, non_group_short_term_disability, parking, pension_dbpp, pension_dcpp, pension_mfpp, pension_prpp, pension_restricted_rrsp, pension_rrsp, pension_unregistered_prpp, pension_vrsp, professional_membership, profit_sharing_dpsp, savings_tfsa, second_opinion_medical_consultation, short_term_disability, transit_pass, transportation_to_from_work, vehicle_employer_provided, virtual_health_service, wellness_spending_account Which earnings' hours a fixed_per_hour benefit multiplies amount by. all_earnings includes the hours on all earnings. regular_earnings includes only the hours on salary and wage earnings. none doesn't include any earnings, and can be used with hours_includes to count only the hours on specific earnings. Defaults to all_earnings, and can only be changed when amount_type is fixed_per_hour.
all_earnings, none, regular_earnings An optional list of earnings whose hours are counted in addition to those included via hours_basis. Each entry has a type of earning and a subtype. Can only be changed when amount_type is fixed_per_hour.
Determines the income used as the base for percentage-based benefit calculations. regular_earnings includes only salary and wage earnings. all_earnings includes all earnings. total_income includes all earnings, taxable allowances, and taxable reimbursements. none doesn't include any line items, and can be used with income_includes for completely custom definitions of income.
all_earnings, none, regular_earnings, total_income The most this benefit will contribute in a tax year, including sales tax when apply_sales_tax is true. Once the contributions on approved payrolls in the tax year reach this maximum, contributions stop until the next tax year, and the Pay Stub that reaches it contributes only the remainder. Changing it later changes the limit, not the remaining amount: contributions already made in the tax year still count toward it.
Up to 2 decimal places.
0 <= x <= 99999Must be a multiple of 0.01Which earlier contributions count toward max_annual_contribution. this_benefit counts only the contributions on line items created by this benefit earlier in the tax year. all_line_items_of_type counts every contribution of the same type on the Work Assignment earlier in the tax year, including those created by other benefits and those added directly to a Pay Stub.
all_line_items_of_type, this_benefit A multiplier applied to the Employee's earnings to determine the benefit coverage amount, used for coverage-based benefits such as life insurance.
Up to 2 decimal places.
0 <= x <= 100Must be a multiple of 0.01The date after which this benefit is no longer applied. null if the benefit applies indefinitely.
Whether provincial sales tax is applied to the benefit amount.
The remittance account to which collected benefit amounts are remitted.
255255Up to 4 decimal places.
Hide child attributes
Hide child attributes
percentage Which payroll date determines the calendar month for the allocation. Applies only to per_month benefits.
by_pay_date, by_period_end_date, by_period_start_date Which pay periods within the month receive the allocation. An array of 1-based positions; -1 is the final period. Applies only to per_month benefits.
1Response
Created
The unique identifier of the object in Nmbr.
The type of the object in Nmbr ("employer_benefit").
Hide child attributes
Hide child attributes
The type of employer benefit, which determines how it is categorized and reported.
Hide child attributes
Hide child attributes
The unique identifier of the object in Nmbr.
The type of the object in Nmbr ("employer_benefit_type").
Hide child attributes
Hide child attributes
The string identifier for this employer benefit type.
The human-readable display name for this employer benefit type.
Hide child attributes
Hide child attributes
The payroll calculation this entry describes.
eht, grossable, income_tax, insurable, money_moving, pensionable, stat_payable, vacationable, wcb Human-readable name for the payroll calculation.
How this type affects the calculation, broken down by jurisdiction. Jurisdictions where it does not apply are omitted.
Hide child attributes
Hide child attributes
The jurisdiction this applies to (e.g. ca_federal, ca_on, ca_qc).
How this type affects the payroll calculation in this jurisdiction.
accrues_vacation_pay, included_in_gross_pay, included_in_stat_holiday_pay, moves_money, reduces_base, tax_credit, withholding Plain-language explanation of how this type affects the calculation in this jurisdiction.
The program that applies in this jurisdiction, for calculations that use different programs by jurisdiction (e.g. CPP federally, QPP in Quebec; EI federally, QPIP in Quebec).
Hide child attributes
Hide child attributes
The form code (e.g. t4).
Human-readable form name.
The boxes on the form this type contributes to in at least one province.
Hide child attributes
Hide child attributes
The box or line identifier on the form.
Plain-language explanation of the box, when available.
The provinces of employment where amounts of this type are reported in this box. RL-1 boxes apply only in Quebec. Most T4 and T4A boxes apply in every province; a few, such as for Quebec tips, do not.
The province of employment (e.g. ca_on, ca_qc).
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 provincial sales tax is applied to the benefit amount.
Determines the income used as the base for percentage-based benefit calculations. regular_earnings includes only salary and wage earnings. all_earnings includes all earnings. total_income includes all earnings, taxable allowances, and taxable reimbursements. none doesn't include any line items, and can be used with income_includes for completely custom definitions of income.
all_earnings, none, regular_earnings, total_income An optional list of specific earnings, allowances, and other line item types to include in the income calculation in addition to those included via income_basis.
The remittance account to which collected benefit amounts are remitted.
32The contribution amount per pay period. When amount_type is percent, this is interpreted as a percentage of the income basis (0-100). When fixed_per_hour, it is multiplied by the hours on the Pay Stub's earning line items selected by hours_basis and hours_includes. Otherwise it is a fixed dollar amount.
Whether amount is a fixed dollar value (fixed), a dollar value per hour worked (fixed_per_hour), or a percentage of the income basis (percent).
fixed, fixed_per_hour, percent Which earnings' hours a fixed_per_hour benefit multiplies amount by. all_earnings includes the hours on all earnings. regular_earnings includes only the hours on salary and wage earnings. none doesn't include any earnings, and can be used with hours_includes to count only the hours on specific earnings. Defaults to all_earnings, and can only be changed when amount_type is fixed_per_hour.
all_earnings, none, regular_earnings An optional list of earnings whose hours are counted in addition to those included via hours_basis. Each entry has a type of earning and a subtype. Can only be changed when amount_type is fixed_per_hour.
A multiplier applied to the Employee's earnings to determine the benefit coverage amount, used for coverage-based benefits such as life insurance.
The most this benefit will contribute in a tax year, including sales tax when apply_sales_tax is true. Once the contributions on approved payrolls in the tax year reach this maximum, contributions stop until the next tax year, and the Pay Stub that reaches it contributes only the remainder. Changing it later changes the limit, not the remaining amount: contributions already made in the tax year still count toward it.
Which earlier contributions count toward max_annual_contribution. this_benefit counts only the contributions on line items created by this benefit earlier in the tax year. all_line_items_of_type counts every contribution of the same type on the Work Assignment earlier in the tax year, including those created by other benefits and those added directly to a Pay Stub.
all_line_items_of_type, this_benefit The frequency at which this benefit is applied to Pay Stubs. When per_month, the amount is distributed across the selected Payrolls in the calendar month. per_month requires amount_type to be fixed.
once, per_month, per_payroll Which payroll date determines the calendar month for the allocation. Applies only to per_month benefits.
by_pay_date, by_period_end_date, by_period_start_date Which pay periods within the month receive the allocation. An array of 1-based positions; -1 is the final period. Applies only to per_month benefits.
The date from which this benefit is applied to Pay Stubs.
The date after which this benefit is no longer applied. null if the benefit 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.

