Skip to content

One key,
one organisation.

Everything the interface does, a script can do. 81 endpoints over HTTPS, authenticated with an organisation-scoped key, described by a specification generated from the service's own routing table rather than written alongside it.

Document type
API reference
Document
ACT-WEB

Getting a key

An admin creates one under Settings → API keys. It is shown once, at creation: we store only its hash, so nobody — including us — can read it back to you afterwards. Lose it and you mint another, which is what you would want to do anyway.

A key belongs to the organisation rather than to the person who created it, so an integration does not stop working when that person leaves. It carries its own role — read-only, or able to record work, or able to configure — and it is capped below owner: no key can change billing or delete the organisation, whatever role you give it. Keys are also refused by the endpoints that issue keys, so one leaked credential cannot quietly mint its replacement.

# Create a key under Settings → API keys. It is shown once.
export ACT_KEY="act_…"

curl https://api.example.com/v1/orgs/acme/assets \
  -H "Authorization: Bearer $ACT_KEY" \
  -G -d limit=50

# Follow next_cursor, never an offset: a page cannot shift
# under you while a colleague is editing.
curl https://api.example.com/v1/orgs/acme/assets \
  -H "Authorization: Bearer $ACT_KEY" \
  -G -d limit=50 -d cursor="$NEXT_CURSOR"

Scope, errors and limits

Organisation
Every tenant endpoint names the organisation in its path. A key presented against an organisation that is not its own is answered 404, the same answer a person who is not a member gets: the response never distinguishes “not yours” from “does not exist”.
Errors
One envelope, everywhere. code is stable and safe to branch on; message is for people and may be reworded between releases. Quote request_id when you report a fault — it identifies the request in our logs.
{
  "error": {
    "code": "validation_failed",
    "message": "One or more fields are invalid.",
    "request_id": "9f2c1d0a4b6e8f1c",
    "fields": { "expires_on": "An expiry cannot precede the start date." }
  }
}
Rate limits
Counted per caller — per key for a key, per person for a person — so one runaway script cannot spend a colleague’s allowance. Over it, you get 429 and a Retry-After header. Wait for it rather than retrying immediately.
Pagination
Lists are keyset paginated: follow next_cursor, never an offset, so a page cannot shift under you while a colleague is editing.
Dates
An expiry is a calendar date, not an instant. A permit expiring on 31 March expires on the 31st where the site is, and a site in another country keeps its own calendar.
Versioning
This is version 1.0.0, served under /v1. Within a major version we add fields and endpoints; we do not remove or rename them, and we do not change what an existing code means. Decode responses in a way that tolerates a field you have not seen before.

The machine-readable specification is served by every deployment at /openapi.json, without a credential. It is generated from the service’s routing table and checked in CI, so it describes the service that is actually running.

Endpoints

Generated from the routing table. Request and response bodies are deliberately not listed here: those live in the handlers, and a copy of them on this page would be the one part of it that could quietly go stale.

alert-rules

alert-rules endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/alert-rulesList alert rulesNeeds viewer or above.
POST/v1/orgs/{org}/alert-rulesCreate alert ruleNeeds admin or above.
DELETE/v1/orgs/{org}/alert-rules/{id}Delete alert ruleNeeds admin or above.
PUT/v1/orgs/{org}/alert-rules/{id}Update alert ruleNeeds admin or above.

alerts

alerts endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/alertsList occurrencesNeeds viewer or above.
POST/v1/orgs/{org}/alerts/{id}/acknowledgeAcknowledge occurrenceNeeds technician or above.

api-keys

api-keys endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/api-keysList API keysNeeds admin or above. API keys are refused.
POST/v1/orgs/{org}/api-keysCreate API keyNeeds admin or above. API keys are refused.
DELETE/v1/orgs/{org}/api-keys/{id}Revoke API keyNeeds admin or above. API keys are refused.

assets

assets endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/assetsList assetsNeeds viewer or above.
POST/v1/orgs/{org}/assetsCreate assetNeeds technician or above.
DELETE/v1/orgs/{org}/assets/{id}Delete assetNeeds admin or above.
GET/v1/orgs/{org}/assets/{id}Get assetNeeds viewer or above.
PUT/v1/orgs/{org}/assets/{id}Update assetNeeds technician or above.
POST/v1/orgs/{org}/assets/{id}/restoreRestore assetNeeds admin or above.
POST/v1/orgs/{org}/assets/bulkBulk assetsNeeds admin or above.
GET/v1/orgs/{org}/assets/by-tag/{tag}Find asset by tagNeeds viewer or above.
POST/v1/orgs/{org}/assets/importCommit importNeeds admin or above.
POST/v1/orgs/{org}/assets/import/previewPreview importNeeds technician or above.

billing

billing endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/billingGet billingNeeds viewer or above.
POST/v1/orgs/{org}/billing/checkoutCreate checkoutNeeds owner or above.
POST/v1/orgs/{org}/billing/portalCreate portalNeeds owner or above.

bulk

bulk endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/bulkList bulk actionsNeeds viewer or above.
POST/v1/orgs/{org}/bulk/{id}/undoUndo bulkNeeds admin or above.

calendar-feed

calendar-feed endpoints, with the role each one requires
MethodPathWhat it does
DELETE/v1/orgs/{org}/calendar-feedRevoke calendar feedNeeds viewer or above.
GET/v1/orgs/{org}/calendar-feedGet calendar feedNeeds viewer or above.
POST/v1/orgs/{org}/calendar-feedCreate calendar feedNeeds viewer or above.

channels

channels endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/channelsList channelsNeeds admin or above.
POST/v1/orgs/{org}/channelsCreate channelNeeds admin or above.
DELETE/v1/orgs/{org}/channels/{id}Delete channelNeeds admin or above.
POST/v1/orgs/{org}/channels/{id}/testTest channelNeeds admin or above.

config

config endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/configOrg configNeeds viewer or above.

dashboard

dashboard endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/dashboardDashboardNeeds viewer or above.

deliveries

deliveries endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/deliveriesList deliveriesNeeds admin or above.

entitlements

entitlements endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/entitlementsList entitlementsNeeds viewer or above.
POST/v1/orgs/{org}/entitlementsCreate entitlementNeeds technician or above.
DELETE/v1/orgs/{org}/entitlements/{id}Delete entitlementNeeds admin or above.
GET/v1/orgs/{org}/entitlements/{id}Get entitlementNeeds viewer or above.
PUT/v1/orgs/{org}/entitlements/{id}Update entitlementNeeds technician or above.
POST/v1/orgs/{org}/entitlements/{id}/restoreRestore entitlementNeeds admin or above.

events

events endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/eventsList eventsNeeds viewer or above.
POST/v1/orgs/{org}/eventsCreate eventNeeds technician or above.
GET/v1/orgs/{org}/events/{id}Get eventNeeds viewer or above.

imports

imports endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/importsList importsNeeds viewer or above.
POST/v1/orgs/{org}/imports/{id}/undoUndo importNeeds admin or above.

invitations

invitations endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/invitations/{token}Get invitationNeeds a signed-in caller. API keys are refused.
POST/v1/invitations/{token}/acceptAccept invitationNeeds a signed-in caller. API keys are refused.
GET/v1/orgs/{org}/invitationsList invitationsNeeds admin or above.
POST/v1/orgs/{org}/invitationsCreate invitationNeeds admin or above.
DELETE/v1/orgs/{org}/invitations/{id}Revoke invitationNeeds admin or above.

me

me endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/meMeNeeds a signed-in caller. API keys are refused.

members

members endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/membersList membersNeeds viewer or above.
DELETE/v1/orgs/{org}/members/{user}Remove memberNeeds admin or above.
PUT/v1/orgs/{org}/members/{user}Update memberNeeds admin or above.

onboarding

onboarding endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/onboardingOnboardingNeeds viewer or above.

orgs

orgs endpoints, with the role each one requires
MethodPathWhat it does
POST/v1/orgsCreate orgNeeds a signed-in caller. API keys are refused.

packs

packs endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/packsList packsNeeds viewer or above.
POST/v1/orgs/{org}/packs/{code}Apply packNeeds admin or above.
POST/v1/orgs/{org}/packs/{code}/previewPreview packNeeds admin or above.

ping

ping endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/pingOrg pingNeeds viewer or above.

plans

plans endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/plansList plansNeeds viewer or above.
POST/v1/orgs/{org}/plansCreate planNeeds technician or above.
DELETE/v1/orgs/{org}/plans/{id}Delete planNeeds admin or above.
GET/v1/orgs/{org}/plans/{id}Get planNeeds viewer or above.
PUT/v1/orgs/{org}/plans/{id}Update planNeeds technician or above.

reports

reports endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/reports/assets/{id}/historyAsset dossierNeeds viewer or above.
GET/v1/orgs/{org}/reports/downtimeDowntime reportNeeds viewer or above.
GET/v1/orgs/{org}/reports/expiry-forecastExpiry forecastNeeds viewer or above.
GET/v1/orgs/{org}/reports/framework-coverageCoverage reportNeeds viewer or above.
GET/v1/orgs/{org}/reports/spendSpend reportNeeds viewer or above.

service

service endpoints, with the role each one requires
MethodPathWhat it does
GET/feeds/{token}/compliance.icsCalendar feedNo credential required.
GET/healthzHealthNo credential required.
GET/openapi.jsonOpen APINo credential required.
GET/readyzReadyNo credential required.
POST/webhooks/stripeStripe webhookNo credential required.

settings

settings endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/settingsGet org settingsNeeds viewer or above.
PUT/v1/orgs/{org}/settingsUpdate org settingsNeeds admin or above.

views

views endpoints, with the role each one requires
MethodPathWhat it does
GET/v1/orgs/{org}/viewsList viewsNeeds viewer or above.
POST/v1/orgs/{org}/viewsCreate viewNeeds admin or above.
DELETE/v1/orgs/{org}/views/{id}Delete viewNeeds admin or above.
PUT/v1/orgs/{org}/views/{id}Update viewNeeds admin or above.

Back to the documentation