Assentt API reference
Documentation
Base URL https://api.assenttwealth.com/v1. Individuals and companies use it to put Accountant, Finance, and Taxes inside software they already run. Every response is JSON. Amounts in tax results are Canadian dollars.
Quickstart
Create a test key in the console, then confirm the key and run a personal estimate.
curl https://api.assenttwealth.com/v1/me \ -H "Authorization: Bearer sk_test_…"
curl https://api.assenttwealth.com/v1/taxes/estimates/preview/personal \
-H "Authorization: Bearer sk_test_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: est_2025_on_1" \
-d '{"province":"ON","year":2025,"income":120000}'Authentication
Send the key in the Authorization header as Bearer. The console uses your Assentt sign-in. Product calls use a key.
| Prefix | Use |
|---|---|
pk_ | Publishable. Safe to place in a client you ship. Read-only. |
sk_ | Secret. Full access for that key’s mode. Keep it on your server. |
rk_ | Restricted. Only the permissions you list on the key. |
Test keys use the test mode. Live keys use live. A missing or unknown key returns unauthenticated.
Errors
A failed call returns one object. Show message to a person. Branch on code in your client.
{
"error": {
"code": "invalid-argument",
"message": "Choose a Canadian province or territory."
}
}| Code | When |
|---|---|
invalid-argument | A field is missing or not usable. Fix the body and send it again. |
unauthenticated | No key, or the key is not recognized. |
permission-denied | The key does not include the permission for this call. |
not-found | That record is not on this account. |
already-exists | A record with that identity is already stored. |
failed-precondition | The account needs credits or a plan, or that product is not open yet. |
resource-exhausted | The key sent too many calls. Wait a minute. |
unavailable | The product could not be reached. Try again. |
internal | Something failed on our side. Try again. If it keeps happening, contact Assentt with the request id. |
Idempotency
Send Idempotency-Key on writes. The same key replays the first response for 24 hours, including the original status. A replay includes Idempotent-Replayed: true. Reads ignore the header. Use a new key when the request itself is new.
Rate limits
Each key has its own limit. When you pass it, the call returns resource-exhausted and the message “Too many requests. Try again in a minute.” Successful and failed product calls both count.
Every product response includes X-Assentt-Request-Id. Keep it when you ask Assentt about a call.
Permissions
A secret key carries the permissions for its mode. A restricted key only carries the ones you set.
| Permission | Product | Status |
|---|---|---|
taxes.estimates:read | Read tax estimates | Live |
taxes.estimates:write | Create and update tax estimates | Live |
taxes.organizers:read | Read tax organizers | Live |
taxes.organizers:write | Create and update tax organizers | Live |
accountant.clients:read | Read practice clients (curated) | Live |
accountant.summary:read | Read practice summary for the linked firm | Live |
ai.chat:write | Send Assentt AI chat turns | Next |
finance.transactions:read | Read categorized finance transactions | Next |
webhooks:read | List webhook endpoints | Live |
webhooks:write | Manage webhook endpoints | Live |
The public catalog is GET https://api.assenttwealth.com/v1/scopes. It needs no key.
Core
The key
GET/v1/me
Who this key is, which organization it belongs to, and which permissions it holds.
Returns the key id, name, type (pk, sk, or rk), mode, scopes, organization, and app.
curl https://api.assenttwealth.com/v1/me \ -H "Authorization: Bearer sk_test_…"
Usage
GET/v1/usage
Recent calls for the organization that owns this key, newest first.
| Parameter | In | Type | Detail |
|---|---|---|---|
limit | query | number | How many rows to return. Default 50. Maximum 100. |
Each row has an id, method, path, status, permission, product, duration in milliseconds, and the time it was recorded.
curl "https://api.assenttwealth.com/v1/usage?limit=20" \ -H "Authorization: Bearer sk_test_…"
Plans
GET/v1/plans
Public monthly plans in Canadian dollars. No key required.
Use the console to start an engagement. See pricing.
curl https://api.assenttwealth.com/v1/plans
Health
GET/v1/health
Confirms the API is accepting calls. No key required.
curl https://api.assenttwealth.com/v1/health
Accountant
Practice summary
GET/v1/accountant/summary
The linked firm’s live practice: open work, overdue items, receivables, upcoming work, and recent alerts.
Permission accountant.summary:read
The response includes counts, receivables in cents, upcoming work, and recent alerts. Client reads use accountant.clients:read.
curl https://api.assenttwealth.com/v1/accountant/summary \ -H "Authorization: Bearer sk_live_…"
Finance
Spending, cash flow, and categorized transactions. Permission finance.transactions:read. This surface opens with Assentt Finance. Until then a call returns failed-precondition.
Taxes
Estimates and organizers for individuals and companies. Money fields are numbers in dollars, not cents.
List estimates
GET/v1/taxes/estimates
Saved estimates for the linked account, newest first, up to 50.
Permission taxes.estimates:read
| Parameter | In | Type | Detail |
|---|---|---|---|
taxYear | query | number | Optional. Limit the list to one year. |
curl "https://api.assenttwealth.com/v1/taxes/estimates?taxYear=2025" \ -H "Authorization: Bearer sk_test_…"
Personal estimate
POST/v1/taxes/estimates/personal
Runs a personal (T1) estimate and stores it. Province is a two-letter Canadian code.
Permission taxes.estimates:write
| Parameter | In | Type | Detail |
|---|---|---|---|
province | body | string | Required. AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, or YT. |
year | body | number | Required. Also accepted as taxYear. 2000–2100. |
income | body | number | Employment and other ordinary income, in dollars. |
eligibleDividends | body | number | Eligible dividends. Defaults to 0. |
nonEligibleDividends | body | number | Non-eligible dividends. Defaults to 0. |
rrspDeduction | body | number | RRSP deduction. Defaults to 0. |
cppSalary | body | number | Optional salary used for CPP. |
selfEmployed | body | boolean | When true, both shares of CPP are included. |
clientId | body | string | Optional id from your own system, stored with the estimate. |
The result includes taxable income, federal tax, provincial tax, total, CPP, average rate, and the marginal rate on the next dollar.
curl https://api.assenttwealth.com/v1/taxes/estimates/personal \
-H "Authorization: Bearer sk_test_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: est_2025_on_1" \
-d '{
"province": "ON",
"year": 2025,
"income": 120000,
"rrspDeduction": 5000,
"selfEmployed": false
}'Corporate estimate
POST/v1/taxes/estimates/corporate
Runs a corporate (T2) estimate from active business income and stores it.
Permission taxes.estimates:write
| Parameter | In | Type | Detail |
|---|---|---|---|
province | body | string | Required. Same codes as a personal estimate. |
year | body | number | Required tax year. |
activeIncome | body | number | Active business income in dollars. profit is accepted as the same field. |
limitShare | body | number | Share of the small-business limit, from 0 to 1. Default 1. |
clientId | body | string | Optional id from your own system. |
The result splits small-business and general income and returns federal, provincial, and total tax, plus the two rates.
curl https://api.assenttwealth.com/v1/taxes/estimates/corporate \
-H "Authorization: Bearer sk_test_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: corp_2025_on_1" \
-d '{"province":"ON","year":2025,"activeIncome":400000}'Preview
POST/v1/taxes/estimates/preview/personal
Same math as a stored estimate, without saving it. Use it for a what-if inside your product.
Permission taxes.estimates:write
Personal previews use /v1/taxes/estimates/preview/personal with the personal fields. Corporate previews use /v1/taxes/estimates/preview/corporate.
curl https://api.assenttwealth.com/v1/taxes/estimates/preview/corporate \
-H "Authorization: Bearer sk_test_…" \
-H "Content-Type: application/json" \
-d '{"province":"BC","activeIncome":250000,"limitShare":0.5}'Create an organizer
POST/v1/taxes/organizers
Opens a tax organizer for a year. personal and corporate templates are supported.
Permission taxes.organizers:write
| Parameter | In | Type | Detail |
|---|---|---|---|
taxYear | body | number | Required. 2000–2100. |
template | body | string | personal or corporate. Defaults to personal. |
clientId | body | string | Optional id from your own system. |
dueDate | body | string | Optional date, YYYY-MM-DD. |
send | body | boolean | When true, the organizer is marked sent. Otherwise it stays a draft. |
List organizers with GET /v1/taxes/organizers (taxes.organizers:read). Read one with GET /v1/taxes/organizers/{id}. Templates are at GET /v1/taxes/organizers/templates.
curl https://api.assenttwealth.com/v1/taxes/organizers \
-H "Authorization: Bearer sk_test_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: org_2025_1" \
-d '{"taxYear":2025,"template":"personal","send":false}'AGI
Next The next AI in this field. One intelligence across Accountant, Finance, and Taxes, called from the software you already run. Permission ai.chat:write. Prices are listed below and apply when the product opens.
Credits
Product calls draw from a prepaid balance in Canadian cents. Add $20.00, $50.00, $100.00, $250.00 in the console. The balance updates when the payment is confirmed. A call that cannot be paid returns failed-precondition.
Prices
| Meter | Price | Status |
|---|---|---|
| Taxes estimate / call | $0.02 | Live |
| Taxes organizer / call | $0.01 | Live |
| Accountant read / call | $0.01 | Live |
| Other API call / call | $0.01 | Live |
| AI input / 1,000 tokens | $0.15 | Next |
| AI output / 1,000 tokens | $0.60 | Next |
Webhooks
Register an endpoint
POST/v1/webhook_endpoints
Assentt posts signed events to an HTTPS address you control. The signing secret is returned once, on create.
Permission webhooks:write
| Parameter | In | Type | Detail |
|---|---|---|---|
url | body | string | Required. Must start with https://. |
events | body | string[] | Event names you want. An empty list stores the endpoint with no filter. |
List endpoints with GET /v1/webhook_endpoints and webhooks:read. The list does not include the signing secret.
curl https://api.assenttwealth.com/v1/webhook_endpoints \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/assentt","events":["usage.recorded"]}'OpenAPI
Machine-readable spec: https://api.assenttwealth.com/v1/openapi.json. Import it into your client. This page is the guide for how each call behaves.