Business API
Integration Guide
Pull your team's processed receipts into your own accounting, ERP, or reporting system. This API is read-only and scoped to a single business — every request returns only that business's data.
Overview
The Business API lets you fetch processed receipts — the same data available in your Output and master CSV export — as JSON, or pull the export file directly, authenticated by a long-lived API key instead of logging in.
Generate a key from Business Dashboard → API Access (owner/admin only).
Authentication
Every request must include your API key in one of two headers. Use whichever your integration platform makes easier — they're equivalent.
Keys are shown once at creation time and stored by us only as a hash — if you lose one, revoke it and generate a new one. A key is tied to one business and inherits no individual user's permissions beyond read access to that business's processed receipts.
Base URL & Versioning
All endpoints are versioned under /api/v1/. Breaking changes (removed fields, changed
semantics) will ship under a new /api/v2/ path rather than altering v1 in place — additive
changes (new optional fields, new endpoints) may land in v1 without notice.
Rate Limits
600 requests per hour, per API key.
Exceeding it returns 429 Too Many Requests. If you need a higher limit for a legitimate
sync workload, contact us.
Errors
All errors return a JSON body of the form {"success": false, "error": "..."} with a matching HTTP status code.
| Status | Meaning |
|---|---|
401 | Missing, invalid, or revoked API key. |
404 | Receipt not found (wrong UUID, or it belongs to a different business). |
405 | Wrong HTTP method — every endpoint in this API is GET only. |
429 | Rate limit exceeded — see above. |
400 | Invalid query parameter (e.g. malformed updated_since). |
List Receipts
GET/api/v1/receipts
Returns processed (status=done) receipts across every member of your team, newest first. Supports filtering and pagination.
Query parameters
| Param | Type | Description |
|---|---|---|
from | date | Only receipts dated on/after this date. YYYY-MM-DD. |
to | date | Only receipts dated on/before this date. YYYY-MM-DD. |
updated_since | datetime | ISO 8601. For incremental sync — only receipts modified at/after this time. Covers edits made via the Preview/Edit UI too. |
q | string | Free-text search across merchant name, description, and receipt number. |
page | integer | Default 1. |
per_page | integer | Default 50, maximum 100. |
Example request
Example response
Get a Receipt
GET/api/v1/receipts?uuid={uuid}
Fetch a single receipt by its UUID. Returns the same object shape as the list endpoint, under a receipt key instead of receipts.
Export (CSV / Excel)
GET/api/v1/export
Streams the same "master" export file available from the business dashboard — every team member's receipts, with Added By and Designation columns. Useful for systems that ingest a file on a schedule rather than parse JSON.
| Param | Type | Description |
|---|---|---|
format | string | csv (default), xlsx, or pdf. |
from / to | date | Same as the list endpoint. |
q | string | Same as the list endpoint. |
Receipt Object
| Field | Type | Description |
|---|---|---|
uuid | string | Stable identifier for this receipt — use this, not the row order, to de-duplicate across syncs. |
receipt_number | string|null | Receipt/invoice number as printed on the receipt, if detected. |
business_name | string|null | The merchant/vendor name on the receipt (e.g. "Java House") — not your ReceiptAI business account name. |
amount / tax | number|null | Total and tax (VAT) amount, in currency. |
currency | string | 3-letter currency code, e.g. KES. |
added_by.name | string|null | Full name of the team member who uploaded this receipt. |
added_by.designation | string|null | That team member's job title, as set on their account. null if not filled in. |
updated_at | datetime | Bumped whenever the receipt is edited — the field to watch for incremental sync via updated_since. |
Pagination
The list endpoint returns a pagination object alongside receipts. Increment page until page >= total_pages. For ongoing sync, prefer polling with updated_since set to the last time you synced, rather than re-paginating the entire history each run.
Code Examples
Node.js
Python
PHP
Java
Questions or need a rate-limit increase? support@tafity.com