An API token lets your own scripts, a CI job or an automation tool do what you do in Invio: draft invoices, add clients, record expenses and read what you are owed. It runs on the same engine as the Invio AI connector, so the same safety rules apply.
Download for AI assistants
Building with an AI assistant? Give it this file in Claude, ChatGPT or Cursor and it can write correct code against the API.
One Markdown file with the base URL, authentication, limits, errors and every endpoint with its parameters and examples, including the rule that sending an invoice needs {"confirm": true}. It is generated from the same definitions as this page and the OpenAPI document, so it never disagrees with them.
What it is
Plain JSON over HTTPS. One token belongs to one business.
Get a token
Tokens are for paid plans. Free accounts can see the card but not create one.
Open Settings
Go to Settings, then AI connections, and stay on the Invio tab.
Create a token
Under API tokens choose Create token and give it a name that says what will use it, such as "Nightly export". The name is how you tell your tokens apart later.
Copy it now
The token is shown once. Invio keeps only a fingerprint of it, so it cannot be shown again. Store it where you keep passwords or CI secrets.
Revoke it when you are done
Revoke it from the same card. Anything using it stops working straight away. If a token leaks, revoke it and create a new one.
Send the token as Authorization: Bearer <token>. Never put it in a web address. A business can hold up to 10 live tokens.
Your first request
List the five most recent unpaid invoices.
curl "https://www.invio.co.nz/api/v1/invoices?status=unpaid&limit=5" \ -H "Authorization: Bearer <your-api-token>"
The answer is a JSON object with the matching invoices in rows, the totals for every match, and the filters Invio actually applied. List endpoints return at most 20 rows; narrow the window with dateFrom and dateTo to read further back.
Create an invoice
Name the client, list the work. The client is matched by name or created from the email address.
curl -X POST "https://www.invio.co.nz/api/v1/invoices" \
-H "Authorization: Bearer <your-api-token>" \
-H "Content-Type: application/json" \
-d '{"clientName":"Acme Plumbing","clientEmail":"accounts@acme.example","items":[{"description":"Callout and repair","quantity":2,"rate":95}]}'The response includes the invoice id, its number and the total Invio calculated. If a client with that name already exists, it is used and nothing is duplicated.
Send an invoice
The one call that emails a client, so it asks you to confirm.
curl -X POST "https://www.invio.co.nz/api/v1/invoices/<invoice-id>/send" \
-H "Authorization: Bearer <your-api-token>" \
-H "Content-Type: application/json" \
-d '{"confirm":true}'Without {"confirm": true} nothing happens and you get a 400. With it, the same checks as a send from the app apply and cannot be skipped. If the issue date is in the future the invoice is scheduled instead of sent. Every send is written to your account's audit log with the token that made it.
All endpoints
Base path /api/v1. Every request needs the Authorization header.
Errors
Every error has the same shape, so a script can branch on the code.
{
"error": {
"code": "validation_error",
"message": "items.0.rate: Required"
}
}Limits and what is left out
Each token can make 600 requests an hour.
The API covers what Invio's AI connector can do, and nothing it cannot. These are not available:
OpenAPI document
Generate a client library or import the API into your own tools.
The full description of every endpoint, parameter and body is an OpenAPI 3.1 file: https://www.invio.co.nz/api/v1/openapi.json. It is generated from the same definitions the API validates with, so it matches what the API accepts.
Building with an AI coding assistant? Download the same documentation as a single Markdown file to give it: