Build on your firm's own data.
A REST API for the records your firm already keeps in Accupe: clients, jobs, tasks, invoices and signature requests. Bearer keys, a scope on every key, a rate limit on every key, and one click to revoke.
curl "https://www.accupe.com/api/v1/clients?limit=2" \
-H "Authorization: Bearer acc_live_..."{
"data": [
{ "id": "...", "business_name": "Hartley Ltd" },
{ "id": "...", "business_name": "Nova Ventures Ltd" }
],
"pagination": { "limit": 2, "offset": 0, "total": 47 }
}Quickstart
- Sign in as a firm admin and open Settings, API keys. Create a key and pick the smallest set of scopes that covers what you need. The key is shown once, so store it straight away.
- Send it as a Bearer token on every request to
https://www.accupe.com/api/v1. - Watch the
X-RateLimit-Remainingheader. At zero the next call is a 429 with aRetry-After.
curl "https://www.accupe.com/api/v1/clients?limit=10" \
-H "Authorization: Bearer acc_live_xxxxxxxxxxxxxxxxxxxxxxxx"Every list answers in the same envelope:
{
"data": [
{ "id": "...", "business_name": "Hartley Ltd", "...": "..." }
],
"pagination": { "limit": 10, "offset": 0, "total": 47 }
}Authentication
Send the key in the Authorization header as Bearer acc_live_.... Keys start with acc_live_, are stored only as a hash on our side, and can carry an expiry date. A missing, wrong, expired or revoked key gets a 401.
Keys belong to your firm, not to a person: whatever the scopes allow, the key can read for the whole firm. See Keep keys safe.
Scopes
A key can only do what its scopes allow. An endpoint called without its scope answers 403.
| Scope | Grants |
|---|---|
read:all | Read every resource above |
read:clients | GET /api/v1/clients and /api/v1/clients/{id} |
read:jobs | GET /api/v1/jobs and /api/v1/jobs/{id} |
read:tasks | GET /api/v1/tasks |
write:tasks | POST /api/v1/tasks (create only, there is no update) |
read:invoices | GET /api/v1/invoices |
read:signatures | GET /api/v1/signatures |
write:all | Every read and every write. Avoid: it is the widest key there is |
Endpoints
Every path starts with https://www.accupe.com. Records are always limited to your own firm; an id from another firm answers 404.
Clients
Scoperead:clients- GET
/api/v1/clientsList clients. Query: limit, offset, search - GET
/api/v1/clients/{id}Retrieve one client
Jobs
Scoperead:jobs- GET
/api/v1/jobsList jobs. Query: limit, offset, status, client_name - GET
/api/v1/jobs/{id}Retrieve one job
Tasks
Scoperead:tasks / write:tasks- GET
/api/v1/tasksList tasks. Query: limit, offset, status - POST
/api/v1/tasksCreate a task. Body: { title, client_name?, priority?, due_date? }
Invoices
Scoperead:invoices- GET
/api/v1/invoicesList invoices. Query: limit, offset, status, search
Signatures
Scoperead:signatures- GET
/api/v1/signaturesList signature requests. Query: limit, offset, status
Create a task
title is required. priority is low, medium (the default) or high. The call answers 201 with the new task. There is no update or delete: tasks created here are changed in Accupe.
curl -X POST "https://www.accupe.com/api/v1/tasks" \
-H "Authorization: Bearer acc_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "title": "Chase signed engagement letter", "client_name": "Hartley Ltd", "priority": "high", "due_date": "2026-11-03" }'{
"data": {
"id": "...",
"title": "Chase signed engagement letter",
"status": "...",
"priority": "high",
"client_name": "Hartley Ltd",
"due_date": "2026-11-03",
"created_at": "..."
}
}Pagination
List endpoints take limit (1 to 100, default 20) and offset (default 0). The reply carries pagination.total, the number of matching records, so you can page until offset reaches it. An offset past the end is an empty page, not an error.
Rate limits
Each key has its own per-minute limit, 60 by default and set when the key is created (1 to 600). Every response carries X-RateLimit-Limit and X-RateLimit-Remaining. Over the limit you get a 429 with Retry-After: 60.
Errors
Errors are JSON with an error message and the status codes below.
| Status | Meaning |
|---|---|
400 | The request body is not valid, for example a task with no title |
401 | Missing, invalid, expired or revoked API key |
403 | The key does not carry the scope this endpoint needs |
404 | Resource not found (or not in your firm) |
429 | Rate limit exceeded: wait for the Retry-After seconds |
500 | Server error: retry, and tell us if it keeps happening |
Keep keys safe
- A key acts for your firm, not for a person. It sees what its scopes allow across all of your clients, whoever created it. Give it the smallest scopes and a short expiry.
- Do not give a key to an AI assistant or paste it into one. Anything that can read the key can read your clients. A key that is in a chat is a key that has left your firm.
- Keep it out of code and browsers. Call the API from your server or a scheduled job, store the key as a secret, and never ship it in a web page or app.
- Revoke on doubt. Revoking a key in Settings stops it on the next request. Create a new one; there is nothing to migrate.
Client personal data you fetch is still personal data: keep it inside the systems your firm already has a lawful basis and a contract for.
Need an endpoint that is not here?
Tell us what you are building and we will say what is possible. The reference lists everything that exists today.