Replace a proposal
curl --request PUT \
--url https://anzapi.onboardme.app/api/v1/proposals/{key} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"userKey": "11111111-2222-3333-4444-555555555555",
"entityKey": "2c4f6a88-1b3d-5e7f-90ab-cdef12345678",
"name": "FY26 tax engagement",
"sendToClient": false,
"startOnAcceptance": true,
"note": "Adhoc proposal with custom services and jobs.",
"services": [
{
"serviceID": 12040,
"quantity": 1,
"packageNumber": 1
}
],
"xpmJobs": [
{
"name": "Income tax return",
"templateUuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
}
],
"fyiJobs": [
{
"jobName": "Income tax return",
"fyiTemplateId": "10492",
"state": "Planned",
"managerEmail": "[email protected]",
"partnerEmail": "[email protected]"
}
],
"invoices": [
{
"billDate": "2026-07-01",
"dueDate": "2026-07-31",
"billNow": 1,
"lineItems": [
{
"amount": 2450,
"taxPercent": 10,
"narration": "Annual tax return",
"serviceID": 12040
}
]
}
],
"requestPaymentDetails": true,
"paymentDetailsType": 1,
"terms": 42,
"stpID": 7,
"documents": [
{
"documentID": 15
}
],
"attachmentID": 3,
"businessSignatoryUserKey": "11111111-2222-3333-4444-555555555555",
"requiresApproval": true,
"approverUserKey": "66666666-7777-8888-9999-000000000000",
"packages": [
{
"packageNumber": 1,
"name": "Compliance"
}
],
"emailSubject": "Your FY26 engagement",
"emailContent": "<p>Please review and accept: [Link]</p>",
"ethicalLetter": {
"templateID": 4,
"sendWhen": 89,
"accountantName": "Previous Accountant",
"accountantEmail": "[email protected]"
},
"checklist": {
"templateID": 21,
"signOffRequired": false
}
}
'import requests
url = "https://anzapi.onboardme.app/api/v1/proposals/{key}"
payload = {
"userKey": "11111111-2222-3333-4444-555555555555",
"entityKey": "2c4f6a88-1b3d-5e7f-90ab-cdef12345678",
"name": "FY26 tax engagement",
"sendToClient": False,
"startOnAcceptance": True,
"note": "Adhoc proposal with custom services and jobs.",
"services": [
{
"serviceID": 12040,
"quantity": 1,
"packageNumber": 1
}
],
"xpmJobs": [
{
"name": "Income tax return",
"templateUuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
}
],
"fyiJobs": [
{
"jobName": "Income tax return",
"fyiTemplateId": "10492",
"state": "Planned",
"managerEmail": "[email protected]",
"partnerEmail": "[email protected]"
}
],
"invoices": [
{
"billDate": "2026-07-01",
"dueDate": "2026-07-31",
"billNow": 1,
"lineItems": [
{
"amount": 2450,
"taxPercent": 10,
"narration": "Annual tax return",
"serviceID": 12040
}
]
}
],
"requestPaymentDetails": True,
"paymentDetailsType": 1,
"terms": 42,
"stpID": 7,
"documents": [{ "documentID": 15 }],
"attachmentID": 3,
"businessSignatoryUserKey": "11111111-2222-3333-4444-555555555555",
"requiresApproval": True,
"approverUserKey": "66666666-7777-8888-9999-000000000000",
"packages": [
{
"packageNumber": 1,
"name": "Compliance"
}
],
"emailSubject": "Your FY26 engagement",
"emailContent": "<p>Please review and accept: [Link]</p>",
"ethicalLetter": {
"templateID": 4,
"sendWhen": 89,
"accountantName": "Previous Accountant",
"accountantEmail": "[email protected]"
},
"checklist": {
"templateID": 21,
"signOffRequired": False
}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
userKey: '11111111-2222-3333-4444-555555555555',
entityKey: '2c4f6a88-1b3d-5e7f-90ab-cdef12345678',
name: 'FY26 tax engagement',
sendToClient: false,
startOnAcceptance: true,
note: 'Adhoc proposal with custom services and jobs.',
services: [{serviceID: 12040, quantity: 1, packageNumber: 1}],
xpmJobs: [
{
name: 'Income tax return',
templateUuid: 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
}
],
fyiJobs: [
{
jobName: 'Income tax return',
fyiTemplateId: '10492',
state: 'Planned',
managerEmail: '[email protected]',
partnerEmail: '[email protected]'
}
],
invoices: [
{
billDate: '2026-07-01',
dueDate: '2026-07-31',
billNow: 1,
lineItems: [
{amount: 2450, taxPercent: 10, narration: 'Annual tax return', serviceID: 12040}
]
}
],
requestPaymentDetails: true,
paymentDetailsType: 1,
terms: 42,
stpID: 7,
documents: [{documentID: 15}],
attachmentID: 3,
businessSignatoryUserKey: '11111111-2222-3333-4444-555555555555',
requiresApproval: true,
approverUserKey: '66666666-7777-8888-9999-000000000000',
packages: [{packageNumber: 1, name: 'Compliance'}],
emailSubject: 'Your FY26 engagement',
emailContent: '<p>Please review and accept: [Link]</p>',
ethicalLetter: {
templateID: 4,
sendWhen: 89,
accountantName: 'Previous Accountant',
accountantEmail: '[email protected]'
},
checklist: {templateID: 21, signOffRequired: false}
})
};
fetch('https://anzapi.onboardme.app/api/v1/proposals/{key}', 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://anzapi.onboardme.app/api/v1/proposals/{key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'userKey' => '11111111-2222-3333-4444-555555555555',
'entityKey' => '2c4f6a88-1b3d-5e7f-90ab-cdef12345678',
'name' => 'FY26 tax engagement',
'sendToClient' => false,
'startOnAcceptance' => true,
'note' => 'Adhoc proposal with custom services and jobs.',
'services' => [
[
'serviceID' => 12040,
'quantity' => 1,
'packageNumber' => 1
]
],
'xpmJobs' => [
[
'name' => 'Income tax return',
'templateUuid' => 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
]
],
'fyiJobs' => [
[
'jobName' => 'Income tax return',
'fyiTemplateId' => '10492',
'state' => 'Planned',
'managerEmail' => '[email protected]',
'partnerEmail' => '[email protected]'
]
],
'invoices' => [
[
'billDate' => '2026-07-01',
'dueDate' => '2026-07-31',
'billNow' => 1,
'lineItems' => [
[
'amount' => 2450,
'taxPercent' => 10,
'narration' => 'Annual tax return',
'serviceID' => 12040
]
]
]
],
'requestPaymentDetails' => true,
'paymentDetailsType' => 1,
'terms' => 42,
'stpID' => 7,
'documents' => [
[
'documentID' => 15
]
],
'attachmentID' => 3,
'businessSignatoryUserKey' => '11111111-2222-3333-4444-555555555555',
'requiresApproval' => true,
'approverUserKey' => '66666666-7777-8888-9999-000000000000',
'packages' => [
[
'packageNumber' => 1,
'name' => 'Compliance'
]
],
'emailSubject' => 'Your FY26 engagement',
'emailContent' => '<p>Please review and accept: [Link]</p>',
'ethicalLetter' => [
'templateID' => 4,
'sendWhen' => 89,
'accountantName' => 'Previous Accountant',
'accountantEmail' => '[email protected]'
],
'checklist' => [
'templateID' => 21,
'signOffRequired' => false
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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://anzapi.onboardme.app/api/v1/proposals/{key}"
payload := strings.NewReader("{\n \"userKey\": \"11111111-2222-3333-4444-555555555555\",\n \"entityKey\": \"2c4f6a88-1b3d-5e7f-90ab-cdef12345678\",\n \"name\": \"FY26 tax engagement\",\n \"sendToClient\": false,\n \"startOnAcceptance\": true,\n \"note\": \"Adhoc proposal with custom services and jobs.\",\n \"services\": [\n {\n \"serviceID\": 12040,\n \"quantity\": 1,\n \"packageNumber\": 1\n }\n ],\n \"xpmJobs\": [\n {\n \"name\": \"Income tax return\",\n \"templateUuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n }\n ],\n \"fyiJobs\": [\n {\n \"jobName\": \"Income tax return\",\n \"fyiTemplateId\": \"10492\",\n \"state\": \"Planned\",\n \"managerEmail\": \"[email protected]\",\n \"partnerEmail\": \"[email protected]\"\n }\n ],\n \"invoices\": [\n {\n \"billDate\": \"2026-07-01\",\n \"dueDate\": \"2026-07-31\",\n \"billNow\": 1,\n \"lineItems\": [\n {\n \"amount\": 2450,\n \"taxPercent\": 10,\n \"narration\": \"Annual tax return\",\n \"serviceID\": 12040\n }\n ]\n }\n ],\n \"requestPaymentDetails\": true,\n \"paymentDetailsType\": 1,\n \"terms\": 42,\n \"stpID\": 7,\n \"documents\": [\n {\n \"documentID\": 15\n }\n ],\n \"attachmentID\": 3,\n \"businessSignatoryUserKey\": \"11111111-2222-3333-4444-555555555555\",\n \"requiresApproval\": true,\n \"approverUserKey\": \"66666666-7777-8888-9999-000000000000\",\n \"packages\": [\n {\n \"packageNumber\": 1,\n \"name\": \"Compliance\"\n }\n ],\n \"emailSubject\": \"Your FY26 engagement\",\n \"emailContent\": \"<p>Please review and accept: [Link]</p>\",\n \"ethicalLetter\": {\n \"templateID\": 4,\n \"sendWhen\": 89,\n \"accountantName\": \"Previous Accountant\",\n \"accountantEmail\": \"[email protected]\"\n },\n \"checklist\": {\n \"templateID\": 21,\n \"signOffRequired\": false\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.put("https://anzapi.onboardme.app/api/v1/proposals/{key}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"userKey\": \"11111111-2222-3333-4444-555555555555\",\n \"entityKey\": \"2c4f6a88-1b3d-5e7f-90ab-cdef12345678\",\n \"name\": \"FY26 tax engagement\",\n \"sendToClient\": false,\n \"startOnAcceptance\": true,\n \"note\": \"Adhoc proposal with custom services and jobs.\",\n \"services\": [\n {\n \"serviceID\": 12040,\n \"quantity\": 1,\n \"packageNumber\": 1\n }\n ],\n \"xpmJobs\": [\n {\n \"name\": \"Income tax return\",\n \"templateUuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n }\n ],\n \"fyiJobs\": [\n {\n \"jobName\": \"Income tax return\",\n \"fyiTemplateId\": \"10492\",\n \"state\": \"Planned\",\n \"managerEmail\": \"[email protected]\",\n \"partnerEmail\": \"[email protected]\"\n }\n ],\n \"invoices\": [\n {\n \"billDate\": \"2026-07-01\",\n \"dueDate\": \"2026-07-31\",\n \"billNow\": 1,\n \"lineItems\": [\n {\n \"amount\": 2450,\n \"taxPercent\": 10,\n \"narration\": \"Annual tax return\",\n \"serviceID\": 12040\n }\n ]\n }\n ],\n \"requestPaymentDetails\": true,\n \"paymentDetailsType\": 1,\n \"terms\": 42,\n \"stpID\": 7,\n \"documents\": [\n {\n \"documentID\": 15\n }\n ],\n \"attachmentID\": 3,\n \"businessSignatoryUserKey\": \"11111111-2222-3333-4444-555555555555\",\n \"requiresApproval\": true,\n \"approverUserKey\": \"66666666-7777-8888-9999-000000000000\",\n \"packages\": [\n {\n \"packageNumber\": 1,\n \"name\": \"Compliance\"\n }\n ],\n \"emailSubject\": \"Your FY26 engagement\",\n \"emailContent\": \"<p>Please review and accept: [Link]</p>\",\n \"ethicalLetter\": {\n \"templateID\": 4,\n \"sendWhen\": 89,\n \"accountantName\": \"Previous Accountant\",\n \"accountantEmail\": \"[email protected]\"\n },\n \"checklist\": {\n \"templateID\": 21,\n \"signOffRequired\": false\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://anzapi.onboardme.app/api/v1/proposals/{key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userKey\": \"11111111-2222-3333-4444-555555555555\",\n \"entityKey\": \"2c4f6a88-1b3d-5e7f-90ab-cdef12345678\",\n \"name\": \"FY26 tax engagement\",\n \"sendToClient\": false,\n \"startOnAcceptance\": true,\n \"note\": \"Adhoc proposal with custom services and jobs.\",\n \"services\": [\n {\n \"serviceID\": 12040,\n \"quantity\": 1,\n \"packageNumber\": 1\n }\n ],\n \"xpmJobs\": [\n {\n \"name\": \"Income tax return\",\n \"templateUuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n }\n ],\n \"fyiJobs\": [\n {\n \"jobName\": \"Income tax return\",\n \"fyiTemplateId\": \"10492\",\n \"state\": \"Planned\",\n \"managerEmail\": \"[email protected]\",\n \"partnerEmail\": \"[email protected]\"\n }\n ],\n \"invoices\": [\n {\n \"billDate\": \"2026-07-01\",\n \"dueDate\": \"2026-07-31\",\n \"billNow\": 1,\n \"lineItems\": [\n {\n \"amount\": 2450,\n \"taxPercent\": 10,\n \"narration\": \"Annual tax return\",\n \"serviceID\": 12040\n }\n ]\n }\n ],\n \"requestPaymentDetails\": true,\n \"paymentDetailsType\": 1,\n \"terms\": 42,\n \"stpID\": 7,\n \"documents\": [\n {\n \"documentID\": 15\n }\n ],\n \"attachmentID\": 3,\n \"businessSignatoryUserKey\": \"11111111-2222-3333-4444-555555555555\",\n \"requiresApproval\": true,\n \"approverUserKey\": \"66666666-7777-8888-9999-000000000000\",\n \"packages\": [\n {\n \"packageNumber\": 1,\n \"name\": \"Compliance\"\n }\n ],\n \"emailSubject\": \"Your FY26 engagement\",\n \"emailContent\": \"<p>Please review and accept: [Link]</p>\",\n \"ethicalLetter\": {\n \"templateID\": 4,\n \"sendWhen\": 89,\n \"accountantName\": \"Previous Accountant\",\n \"accountantEmail\": \"[email protected]\"\n },\n \"checklist\": {\n \"templateID\": 21,\n \"signOffRequired\": false\n }\n}"
response = http.request(request)
puts response.read_body{
"engagementKey": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"statusName": "<string>",
"billingNeedsReview": true,
"pricing": {
"engagementKey": "8f9e2b1c-3d4a-5e6f-7890-abcdef012345",
"name": "FY25 tax engagement – Acme Pty Ltd",
"statusName": "Accepted",
"createBills": true,
"servicesTotal": 2695,
"invoicesTotal": 2695,
"services": [
{
"serviceID": 12040,
"serviceName": "Annual compliance — company",
"price": 2450,
"quantity": 1,
"taxAmount": 245,
"lineTotal": 2695
}
]
},
"section": null
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}Proposal updates
Replace a proposal
Replace every section of a proposal. Anything you leave out is removed.
PUT
/
api
/
v1
/
proposals
/
{key}
Replace a proposal
curl --request PUT \
--url https://anzapi.onboardme.app/api/v1/proposals/{key} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"userKey": "11111111-2222-3333-4444-555555555555",
"entityKey": "2c4f6a88-1b3d-5e7f-90ab-cdef12345678",
"name": "FY26 tax engagement",
"sendToClient": false,
"startOnAcceptance": true,
"note": "Adhoc proposal with custom services and jobs.",
"services": [
{
"serviceID": 12040,
"quantity": 1,
"packageNumber": 1
}
],
"xpmJobs": [
{
"name": "Income tax return",
"templateUuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
}
],
"fyiJobs": [
{
"jobName": "Income tax return",
"fyiTemplateId": "10492",
"state": "Planned",
"managerEmail": "[email protected]",
"partnerEmail": "[email protected]"
}
],
"invoices": [
{
"billDate": "2026-07-01",
"dueDate": "2026-07-31",
"billNow": 1,
"lineItems": [
{
"amount": 2450,
"taxPercent": 10,
"narration": "Annual tax return",
"serviceID": 12040
}
]
}
],
"requestPaymentDetails": true,
"paymentDetailsType": 1,
"terms": 42,
"stpID": 7,
"documents": [
{
"documentID": 15
}
],
"attachmentID": 3,
"businessSignatoryUserKey": "11111111-2222-3333-4444-555555555555",
"requiresApproval": true,
"approverUserKey": "66666666-7777-8888-9999-000000000000",
"packages": [
{
"packageNumber": 1,
"name": "Compliance"
}
],
"emailSubject": "Your FY26 engagement",
"emailContent": "<p>Please review and accept: [Link]</p>",
"ethicalLetter": {
"templateID": 4,
"sendWhen": 89,
"accountantName": "Previous Accountant",
"accountantEmail": "[email protected]"
},
"checklist": {
"templateID": 21,
"signOffRequired": false
}
}
'import requests
url = "https://anzapi.onboardme.app/api/v1/proposals/{key}"
payload = {
"userKey": "11111111-2222-3333-4444-555555555555",
"entityKey": "2c4f6a88-1b3d-5e7f-90ab-cdef12345678",
"name": "FY26 tax engagement",
"sendToClient": False,
"startOnAcceptance": True,
"note": "Adhoc proposal with custom services and jobs.",
"services": [
{
"serviceID": 12040,
"quantity": 1,
"packageNumber": 1
}
],
"xpmJobs": [
{
"name": "Income tax return",
"templateUuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
}
],
"fyiJobs": [
{
"jobName": "Income tax return",
"fyiTemplateId": "10492",
"state": "Planned",
"managerEmail": "[email protected]",
"partnerEmail": "[email protected]"
}
],
"invoices": [
{
"billDate": "2026-07-01",
"dueDate": "2026-07-31",
"billNow": 1,
"lineItems": [
{
"amount": 2450,
"taxPercent": 10,
"narration": "Annual tax return",
"serviceID": 12040
}
]
}
],
"requestPaymentDetails": True,
"paymentDetailsType": 1,
"terms": 42,
"stpID": 7,
"documents": [{ "documentID": 15 }],
"attachmentID": 3,
"businessSignatoryUserKey": "11111111-2222-3333-4444-555555555555",
"requiresApproval": True,
"approverUserKey": "66666666-7777-8888-9999-000000000000",
"packages": [
{
"packageNumber": 1,
"name": "Compliance"
}
],
"emailSubject": "Your FY26 engagement",
"emailContent": "<p>Please review and accept: [Link]</p>",
"ethicalLetter": {
"templateID": 4,
"sendWhen": 89,
"accountantName": "Previous Accountant",
"accountantEmail": "[email protected]"
},
"checklist": {
"templateID": 21,
"signOffRequired": False
}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
userKey: '11111111-2222-3333-4444-555555555555',
entityKey: '2c4f6a88-1b3d-5e7f-90ab-cdef12345678',
name: 'FY26 tax engagement',
sendToClient: false,
startOnAcceptance: true,
note: 'Adhoc proposal with custom services and jobs.',
services: [{serviceID: 12040, quantity: 1, packageNumber: 1}],
xpmJobs: [
{
name: 'Income tax return',
templateUuid: 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
}
],
fyiJobs: [
{
jobName: 'Income tax return',
fyiTemplateId: '10492',
state: 'Planned',
managerEmail: '[email protected]',
partnerEmail: '[email protected]'
}
],
invoices: [
{
billDate: '2026-07-01',
dueDate: '2026-07-31',
billNow: 1,
lineItems: [
{amount: 2450, taxPercent: 10, narration: 'Annual tax return', serviceID: 12040}
]
}
],
requestPaymentDetails: true,
paymentDetailsType: 1,
terms: 42,
stpID: 7,
documents: [{documentID: 15}],
attachmentID: 3,
businessSignatoryUserKey: '11111111-2222-3333-4444-555555555555',
requiresApproval: true,
approverUserKey: '66666666-7777-8888-9999-000000000000',
packages: [{packageNumber: 1, name: 'Compliance'}],
emailSubject: 'Your FY26 engagement',
emailContent: '<p>Please review and accept: [Link]</p>',
ethicalLetter: {
templateID: 4,
sendWhen: 89,
accountantName: 'Previous Accountant',
accountantEmail: '[email protected]'
},
checklist: {templateID: 21, signOffRequired: false}
})
};
fetch('https://anzapi.onboardme.app/api/v1/proposals/{key}', 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://anzapi.onboardme.app/api/v1/proposals/{key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'userKey' => '11111111-2222-3333-4444-555555555555',
'entityKey' => '2c4f6a88-1b3d-5e7f-90ab-cdef12345678',
'name' => 'FY26 tax engagement',
'sendToClient' => false,
'startOnAcceptance' => true,
'note' => 'Adhoc proposal with custom services and jobs.',
'services' => [
[
'serviceID' => 12040,
'quantity' => 1,
'packageNumber' => 1
]
],
'xpmJobs' => [
[
'name' => 'Income tax return',
'templateUuid' => 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
]
],
'fyiJobs' => [
[
'jobName' => 'Income tax return',
'fyiTemplateId' => '10492',
'state' => 'Planned',
'managerEmail' => '[email protected]',
'partnerEmail' => '[email protected]'
]
],
'invoices' => [
[
'billDate' => '2026-07-01',
'dueDate' => '2026-07-31',
'billNow' => 1,
'lineItems' => [
[
'amount' => 2450,
'taxPercent' => 10,
'narration' => 'Annual tax return',
'serviceID' => 12040
]
]
]
],
'requestPaymentDetails' => true,
'paymentDetailsType' => 1,
'terms' => 42,
'stpID' => 7,
'documents' => [
[
'documentID' => 15
]
],
'attachmentID' => 3,
'businessSignatoryUserKey' => '11111111-2222-3333-4444-555555555555',
'requiresApproval' => true,
'approverUserKey' => '66666666-7777-8888-9999-000000000000',
'packages' => [
[
'packageNumber' => 1,
'name' => 'Compliance'
]
],
'emailSubject' => 'Your FY26 engagement',
'emailContent' => '<p>Please review and accept: [Link]</p>',
'ethicalLetter' => [
'templateID' => 4,
'sendWhen' => 89,
'accountantName' => 'Previous Accountant',
'accountantEmail' => '[email protected]'
],
'checklist' => [
'templateID' => 21,
'signOffRequired' => false
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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://anzapi.onboardme.app/api/v1/proposals/{key}"
payload := strings.NewReader("{\n \"userKey\": \"11111111-2222-3333-4444-555555555555\",\n \"entityKey\": \"2c4f6a88-1b3d-5e7f-90ab-cdef12345678\",\n \"name\": \"FY26 tax engagement\",\n \"sendToClient\": false,\n \"startOnAcceptance\": true,\n \"note\": \"Adhoc proposal with custom services and jobs.\",\n \"services\": [\n {\n \"serviceID\": 12040,\n \"quantity\": 1,\n \"packageNumber\": 1\n }\n ],\n \"xpmJobs\": [\n {\n \"name\": \"Income tax return\",\n \"templateUuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n }\n ],\n \"fyiJobs\": [\n {\n \"jobName\": \"Income tax return\",\n \"fyiTemplateId\": \"10492\",\n \"state\": \"Planned\",\n \"managerEmail\": \"[email protected]\",\n \"partnerEmail\": \"[email protected]\"\n }\n ],\n \"invoices\": [\n {\n \"billDate\": \"2026-07-01\",\n \"dueDate\": \"2026-07-31\",\n \"billNow\": 1,\n \"lineItems\": [\n {\n \"amount\": 2450,\n \"taxPercent\": 10,\n \"narration\": \"Annual tax return\",\n \"serviceID\": 12040\n }\n ]\n }\n ],\n \"requestPaymentDetails\": true,\n \"paymentDetailsType\": 1,\n \"terms\": 42,\n \"stpID\": 7,\n \"documents\": [\n {\n \"documentID\": 15\n }\n ],\n \"attachmentID\": 3,\n \"businessSignatoryUserKey\": \"11111111-2222-3333-4444-555555555555\",\n \"requiresApproval\": true,\n \"approverUserKey\": \"66666666-7777-8888-9999-000000000000\",\n \"packages\": [\n {\n \"packageNumber\": 1,\n \"name\": \"Compliance\"\n }\n ],\n \"emailSubject\": \"Your FY26 engagement\",\n \"emailContent\": \"<p>Please review and accept: [Link]</p>\",\n \"ethicalLetter\": {\n \"templateID\": 4,\n \"sendWhen\": 89,\n \"accountantName\": \"Previous Accountant\",\n \"accountantEmail\": \"[email protected]\"\n },\n \"checklist\": {\n \"templateID\": 21,\n \"signOffRequired\": false\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.put("https://anzapi.onboardme.app/api/v1/proposals/{key}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"userKey\": \"11111111-2222-3333-4444-555555555555\",\n \"entityKey\": \"2c4f6a88-1b3d-5e7f-90ab-cdef12345678\",\n \"name\": \"FY26 tax engagement\",\n \"sendToClient\": false,\n \"startOnAcceptance\": true,\n \"note\": \"Adhoc proposal with custom services and jobs.\",\n \"services\": [\n {\n \"serviceID\": 12040,\n \"quantity\": 1,\n \"packageNumber\": 1\n }\n ],\n \"xpmJobs\": [\n {\n \"name\": \"Income tax return\",\n \"templateUuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n }\n ],\n \"fyiJobs\": [\n {\n \"jobName\": \"Income tax return\",\n \"fyiTemplateId\": \"10492\",\n \"state\": \"Planned\",\n \"managerEmail\": \"[email protected]\",\n \"partnerEmail\": \"[email protected]\"\n }\n ],\n \"invoices\": [\n {\n \"billDate\": \"2026-07-01\",\n \"dueDate\": \"2026-07-31\",\n \"billNow\": 1,\n \"lineItems\": [\n {\n \"amount\": 2450,\n \"taxPercent\": 10,\n \"narration\": \"Annual tax return\",\n \"serviceID\": 12040\n }\n ]\n }\n ],\n \"requestPaymentDetails\": true,\n \"paymentDetailsType\": 1,\n \"terms\": 42,\n \"stpID\": 7,\n \"documents\": [\n {\n \"documentID\": 15\n }\n ],\n \"attachmentID\": 3,\n \"businessSignatoryUserKey\": \"11111111-2222-3333-4444-555555555555\",\n \"requiresApproval\": true,\n \"approverUserKey\": \"66666666-7777-8888-9999-000000000000\",\n \"packages\": [\n {\n \"packageNumber\": 1,\n \"name\": \"Compliance\"\n }\n ],\n \"emailSubject\": \"Your FY26 engagement\",\n \"emailContent\": \"<p>Please review and accept: [Link]</p>\",\n \"ethicalLetter\": {\n \"templateID\": 4,\n \"sendWhen\": 89,\n \"accountantName\": \"Previous Accountant\",\n \"accountantEmail\": \"[email protected]\"\n },\n \"checklist\": {\n \"templateID\": 21,\n \"signOffRequired\": false\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://anzapi.onboardme.app/api/v1/proposals/{key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userKey\": \"11111111-2222-3333-4444-555555555555\",\n \"entityKey\": \"2c4f6a88-1b3d-5e7f-90ab-cdef12345678\",\n \"name\": \"FY26 tax engagement\",\n \"sendToClient\": false,\n \"startOnAcceptance\": true,\n \"note\": \"Adhoc proposal with custom services and jobs.\",\n \"services\": [\n {\n \"serviceID\": 12040,\n \"quantity\": 1,\n \"packageNumber\": 1\n }\n ],\n \"xpmJobs\": [\n {\n \"name\": \"Income tax return\",\n \"templateUuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n }\n ],\n \"fyiJobs\": [\n {\n \"jobName\": \"Income tax return\",\n \"fyiTemplateId\": \"10492\",\n \"state\": \"Planned\",\n \"managerEmail\": \"[email protected]\",\n \"partnerEmail\": \"[email protected]\"\n }\n ],\n \"invoices\": [\n {\n \"billDate\": \"2026-07-01\",\n \"dueDate\": \"2026-07-31\",\n \"billNow\": 1,\n \"lineItems\": [\n {\n \"amount\": 2450,\n \"taxPercent\": 10,\n \"narration\": \"Annual tax return\",\n \"serviceID\": 12040\n }\n ]\n }\n ],\n \"requestPaymentDetails\": true,\n \"paymentDetailsType\": 1,\n \"terms\": 42,\n \"stpID\": 7,\n \"documents\": [\n {\n \"documentID\": 15\n }\n ],\n \"attachmentID\": 3,\n \"businessSignatoryUserKey\": \"11111111-2222-3333-4444-555555555555\",\n \"requiresApproval\": true,\n \"approverUserKey\": \"66666666-7777-8888-9999-000000000000\",\n \"packages\": [\n {\n \"packageNumber\": 1,\n \"name\": \"Compliance\"\n }\n ],\n \"emailSubject\": \"Your FY26 engagement\",\n \"emailContent\": \"<p>Please review and accept: [Link]</p>\",\n \"ethicalLetter\": {\n \"templateID\": 4,\n \"sendWhen\": 89,\n \"accountantName\": \"Previous Accountant\",\n \"accountantEmail\": \"[email protected]\"\n },\n \"checklist\": {\n \"templateID\": 21,\n \"signOffRequired\": false\n }\n}"
response = http.request(request)
puts response.read_body{
"engagementKey": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"statusName": "<string>",
"billingNeedsReview": true,
"pricing": {
"engagementKey": "8f9e2b1c-3d4a-5e6f-7890-abcdef012345",
"name": "FY25 tax engagement – Acme Pty Ltd",
"statusName": "Accepted",
"createBills": true,
"servicesTotal": 2695,
"invoicesTotal": 2695,
"services": [
{
"serviceID": 12040,
"serviceName": "Annual compliance — company",
"price": 2450,
"quantity": 1,
"taxAmount": 245,
"lineTotal": 2695
}
]
},
"section": null
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}Authorizations
Swagger / Postman only: Client ID as username, Client secret as password. In Postman, set this once on the collection (Authorization → Basic Auth) so all requests inherit. For production server-to-server code, prefer X-OM-Auth-ID and X-OM-Auth-Key headers.
Path Parameters
Proposal key.
Body
application/jsontext/jsonapplication/*+json
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
OK
Show child attributes
Show child attributes
Example:
{
"engagementKey": "8f9e2b1c-3d4a-5e6f-7890-abcdef012345",
"name": "FY25 tax engagement – Acme Pty Ltd",
"statusName": "Accepted",
"createBills": true,
"servicesTotal": 2695,
"invoicesTotal": 2695,
"services": [
{
"serviceID": 12040,
"serviceName": "Annual compliance — company",
"price": 2450,
"quantity": 1,
"taxAmount": 245,
"lineTotal": 2695
}
]
}