Assentt API

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.

PrefixUse
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."
  }
}
CodeWhen
invalid-argumentA field is missing or not usable. Fix the body and send it again.
unauthenticatedNo key, or the key is not recognized.
permission-deniedThe key does not include the permission for this call.
not-foundThat record is not on this account.
already-existsA record with that identity is already stored.
failed-preconditionThe account needs credits or a plan, or that product is not open yet.
resource-exhaustedThe key sent too many calls. Wait a minute.
unavailableThe product could not be reached. Try again.
internalSomething 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.

PermissionProductStatus
taxes.estimates:readRead tax estimatesLive
taxes.estimates:writeCreate and update tax estimatesLive
taxes.organizers:readRead tax organizersLive
taxes.organizers:writeCreate and update tax organizersLive
accountant.clients:readRead practice clients (curated)Live
accountant.summary:readRead practice summary for the linked firmLive
ai.chat:writeSend Assentt AI chat turnsNext
finance.transactions:readRead categorized finance transactionsNext
webhooks:readList webhook endpointsLive
webhooks:writeManage webhook endpointsLive

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.

ParameterInTypeDetail
limitquerynumberHow 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

ParameterInTypeDetail
taxYearquerynumberOptional. 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

ParameterInTypeDetail
provincebodystringRequired. AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, or YT.
yearbodynumberRequired. Also accepted as taxYear. 2000–2100.
incomebodynumberEmployment and other ordinary income, in dollars.
eligibleDividendsbodynumberEligible dividends. Defaults to 0.
nonEligibleDividendsbodynumberNon-eligible dividends. Defaults to 0.
rrspDeductionbodynumberRRSP deduction. Defaults to 0.
cppSalarybodynumberOptional salary used for CPP.
selfEmployedbodybooleanWhen true, both shares of CPP are included.
clientIdbodystringOptional 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

ParameterInTypeDetail
provincebodystringRequired. Same codes as a personal estimate.
yearbodynumberRequired tax year.
activeIncomebodynumberActive business income in dollars. profit is accepted as the same field.
limitSharebodynumberShare of the small-business limit, from 0 to 1. Default 1.
clientIdbodystringOptional 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

ParameterInTypeDetail
taxYearbodynumberRequired. 2000–2100.
templatebodystringpersonal or corporate. Defaults to personal.
clientIdbodystringOptional id from your own system.
dueDatebodystringOptional date, YYYY-MM-DD.
sendbodybooleanWhen 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

MeterPriceStatus
Taxes estimate / call$0.02Live
Taxes organizer / call$0.01Live
Accountant read / call$0.01Live
Other API call / call$0.01Live
AI input / 1,000 tokens$0.15Next
AI output / 1,000 tokens$0.60Next

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

ParameterInTypeDetail
urlbodystringRequired. Must start with https://.
eventsbodystring[]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.

Plans and engagement