Curcle API · v1

Connect every job, invoiceand certificate.

A stable, read-only REST contract for partner integrations, with scoped keys, per-key rate limits and signed event delivery.

Base URLhttps://app.curcle.co.uk/api/public/v1

Quick start

Your first request

Create a key in Admin → API Keys, grant the narrowest scopes your integration needs, then send it as a bearer token. Keys may also be restricted to one customer or an IP allow-list.

1. Create a key

The secret is shown once. Store it in a secret manager.

2. Add the header

Send Authorization: Bearer <api-key> on every request.

3. Read the headers

Use rate-limit headers to pace requests and retries.

cURL
curl "https://app.curcle.co.uk/api/public/v1/jobs?limit=20" \
  --header "Authorization: Bearer <api-key>"

REST reference

Seven versioned endpoints

All paths are under /api/public/v1. Collection responses use a data array; jobs, invoices and certificates include limit and offset pagination metadata.

GET
/meIdentify the calling API keybearer token
GET
/jobsList visible jobsread:jobs
GET
/jobs/{id}Get a job and its appliancesread:jobs
GET
/invoicesList visible invoicesread:invoices
GET
/certificatesList visible certificatesread:certificates
GET
/customersList visible customersread:customers
GET
/healthzCheck API availabilitybearer token

Least privilege

Choose focused scopes

Resource scopes can be combined as a comma-separated list. Write scopes imply read access, while customer-bound keys cannot escape their customer restriction.

read

Read access to every public resource.

read:jobs

Read job summaries and job detail.

read:invoices

Read invoice records.

read:certificates

Read certificate links.

read:customers

Read customer records.

write

Reserved for future write endpoints; implies read access.

admin

Full access to every public resource.

Rate limits

Predictable, per-key windows

Each API key has its own requests-per-minute allowance. Successful and rejected responses report the current allowance; a 429 also tells you when to retry.

X-RateLimit-Limit

Maximum requests in the one-minute window.

X-RateLimit-Remaining

Requests remaining in the current window.

X-RateLimit-Reset

Unix timestamp when the window resets.

Retry-After

Seconds to wait after a 429 response.

Signed delivery

React to business events

Create an HTTPS subscription in Admin → Webhooks. Curcle sends the exact JSON body withX-HK-Signature: sha256=<HMAC>and retries failed deliveries with exponential backoff.

Job completed

Sent when a job is marked complete.

job.completed payload
{
  "event": "job.completed",
  "data": {
    "id": 123,
    "certificateNumber": "HK-2026-00123",
    "customerId": 42,
    "siteId": 7,
    "completedAt": "2026-06-15T10:30:00.000Z"
  },
  "timestamp": "2026-06-15T10:30:00.000Z"
}

Verify the lowercase hex HMAC-SHA256 digest against the raw request body before parsing JSON. Delivery attempts use backoff intervals of 10 seconds, 30 seconds, 2 minutes, 10 minutes, 30 minutes and 2 hours.

Errors

Small, consistent envelopes

The API returns 401 for missing or invalid credentials, 403 for missing scopes or an IP allow-list denial, 404 for records outside the key's visibility, and 429 for rate limits.

403 response
{
  "error": "Missing required scope: read:jobs"
}
Build with the record
A clear API boundary for your own tools.

Build around a record you can trust.

Review the API boundary, scopes and webhook behaviour with the Curcle team.