curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/roe_sat_agreements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_entity_id": "<string>",
"business_number": "<string>",
"signer_name": "<string>",
"signer_title": "<string>",
"signed_on": "2023-12-25",
"business_legal_name": "<string>",
"letter": "<string>"
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/roe_sat_agreements"
payload = {
"business_entity_id": "<string>",
"business_number": "<string>",
"signer_name": "<string>",
"signer_title": "<string>",
"signed_on": "2023-12-25",
"business_legal_name": "<string>",
"letter": "<string>"
}
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: '<string>',
business_number: '<string>',
signer_name: '<string>',
signer_title: '<string>',
signed_on: '2023-12-25',
business_legal_name: '<string>',
letter: '<string>'
})
};
fetch('https://sandbox.nmbr.co/services/payroll/roe_sat_agreements', 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/roe_sat_agreements",
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' => '<string>',
'business_number' => '<string>',
'signer_name' => '<string>',
'signer_title' => '<string>',
'signed_on' => '2023-12-25',
'business_legal_name' => '<string>',
'letter' => '<string>'
]),
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/roe_sat_agreements"
payload := strings.NewReader("{\n \"business_entity_id\": \"<string>\",\n \"business_number\": \"<string>\",\n \"signer_name\": \"<string>\",\n \"signer_title\": \"<string>\",\n \"signed_on\": \"2023-12-25\",\n \"business_legal_name\": \"<string>\",\n \"letter\": \"<string>\"\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/roe_sat_agreements")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_entity_id\": \"<string>\",\n \"business_number\": \"<string>\",\n \"signer_name\": \"<string>\",\n \"signer_title\": \"<string>\",\n \"signed_on\": \"2023-12-25\",\n \"business_legal_name\": \"<string>\",\n \"letter\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/roe_sat_agreements")
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\": \"<string>\",\n \"business_number\": \"<string>\",\n \"signer_name\": \"<string>\",\n \"signer_title\": \"<string>\",\n \"signed_on\": \"2023-12-25\",\n \"business_legal_name\": \"<string>\",\n \"letter\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "roe_sat_agreement",
"data": {
"business_entity": {
"id": "<id>",
"object": "business_entity",
"links": {
"self": "/business_entities/<id>"
}
},
"business_number": "123456782RP0001",
"business_legal_name": "Bobs Burgers (#39616)",
"signer_name": "Bob Belcher",
"signer_title": "Owner",
"signed_on": "2026-01-01",
"revoked_at": null,
"locale": "en",
"letter_was_uploaded": false,
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/roe_sat_agreements/<id>"
}
}Create an ROE SAT agreement
curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/roe_sat_agreements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"business_entity_id": "<string>",
"business_number": "<string>",
"signer_name": "<string>",
"signer_title": "<string>",
"signed_on": "2023-12-25",
"business_legal_name": "<string>",
"letter": "<string>"
}
'import requests
url = "https://sandbox.nmbr.co/services/payroll/roe_sat_agreements"
payload = {
"business_entity_id": "<string>",
"business_number": "<string>",
"signer_name": "<string>",
"signer_title": "<string>",
"signed_on": "2023-12-25",
"business_legal_name": "<string>",
"letter": "<string>"
}
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: '<string>',
business_number: '<string>',
signer_name: '<string>',
signer_title: '<string>',
signed_on: '2023-12-25',
business_legal_name: '<string>',
letter: '<string>'
})
};
fetch('https://sandbox.nmbr.co/services/payroll/roe_sat_agreements', 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/roe_sat_agreements",
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' => '<string>',
'business_number' => '<string>',
'signer_name' => '<string>',
'signer_title' => '<string>',
'signed_on' => '2023-12-25',
'business_legal_name' => '<string>',
'letter' => '<string>'
]),
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/roe_sat_agreements"
payload := strings.NewReader("{\n \"business_entity_id\": \"<string>\",\n \"business_number\": \"<string>\",\n \"signer_name\": \"<string>\",\n \"signer_title\": \"<string>\",\n \"signed_on\": \"2023-12-25\",\n \"business_legal_name\": \"<string>\",\n \"letter\": \"<string>\"\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/roe_sat_agreements")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"business_entity_id\": \"<string>\",\n \"business_number\": \"<string>\",\n \"signer_name\": \"<string>\",\n \"signer_title\": \"<string>\",\n \"signed_on\": \"2023-12-25\",\n \"business_legal_name\": \"<string>\",\n \"letter\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/roe_sat_agreements")
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\": \"<string>\",\n \"business_number\": \"<string>\",\n \"signer_name\": \"<string>\",\n \"signer_title\": \"<string>\",\n \"signed_on\": \"2023-12-25\",\n \"business_legal_name\": \"<string>\",\n \"letter\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<id>",
"object": "roe_sat_agreement",
"data": {
"business_entity": {
"id": "<id>",
"object": "business_entity",
"links": {
"self": "/business_entities/<id>"
}
},
"business_number": "123456782RP0001",
"business_legal_name": "Bobs Burgers (#39616)",
"signer_name": "Bob Belcher",
"signer_title": "Owner",
"signed_on": "2026-01-01",
"revoked_at": null,
"locale": "en",
"letter_was_uploaded": false,
"created_at": "2026-01-01T00:00:00.000000Z",
"updated_at": "2026-01-01T00:00:00.000000Z"
},
"links": {
"self": "/roe_sat_agreements/<id>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The Business Entity the agreement is recorded under.
The CRA payroll account number (BN15, e.g. 123456782RP0001) the agreement covers. Only one non-revoked agreement may cover a business number at a time.
The person who signed the letter on the client's behalf.
255The signer's job title.
255The date written on the signed letter.
The client's legal name as written on the letter. Defaults to the Business Entity's legal name when omitted.
255The language of the letter (en or fr). Defaults to the Business Entity's language when omitted.
en, fr The client's signed copy of the letter as a PDF. When omitted, a copy of the letter recording the acceptance is generated and attached automatically.
10240Response
Created
The unique identifier of the object in Nmbr.
The type of the object in Nmbr ("roe_sat_agreement").
Hide child attributes
Hide child attributes
The CRA payroll account number (BN15) the agreement covers. ROEs issued under this number are filed with Service Canada automatically while the agreement is not revoked.
15The client's legal name as written on the letter.
255The person who signed the letter on the client's behalf.
255The signer's job title.
255The date written on the signed letter.
When the agreement was revoked. Null while the agreement is in effect.
The language of the letter (en or fr).
en, fr 2Whether the attached letter is the client's uploaded signed copy (true) or a copy generated from the recorded details (false). Download it from /roe_sat_agreements/{id}/letter.
The date and time the object was created in Nmbr.
The date and time the object was last updated in Nmbr.

