Skip to main content

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.

REST API v1. Keys are created by your firm's admins in Settings.

GET /api/v1/clients
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

  1. 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.
  2. Send it as a Bearer token on every request to https://www.accupe.com/api/v1.
  3. Watch the X-RateLimit-Remaining header. At zero the next call is a 429 with a Retry-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.

ScopeGrants
read:allRead every resource above
read:clientsGET /api/v1/clients and /api/v1/clients/{id}
read:jobsGET /api/v1/jobs and /api/v1/jobs/{id}
read:tasksGET /api/v1/tasks
write:tasksPOST /api/v1/tasks (create only, there is no update)
read:invoicesGET /api/v1/invoices
read:signaturesGET /api/v1/signatures
write:allEvery 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

Scope read:clients
  • GET/api/v1/clientsList clients. Query: limit, offset, search
  • GET/api/v1/clients/{id}Retrieve one client

Jobs

Scope read:jobs
  • GET/api/v1/jobsList jobs. Query: limit, offset, status, client_name
  • GET/api/v1/jobs/{id}Retrieve one job

Tasks

Scope read: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

Scope read:invoices
  • GET/api/v1/invoicesList invoices. Query: limit, offset, status, search

Signatures

Scope read: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.

StatusMeaning
400The request body is not valid, for example a task with no title
401Missing, invalid, expired or revoked API key
403The key does not carry the scope this endpoint needs
404Resource not found (or not in your firm)
429Rate limit exceeded: wait for the Retry-After seconds
500Server 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.

Accupe · SaaS database