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.
codeis stable and safe to branch on;messageis for people and may be reworded between releases. Quoterequest_idwhen 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
429and aRetry-Afterheader. 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 existingcodemeans. 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
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/alert-rules | List alert rulesNeeds viewer or above. |
| POST | /v1/orgs/{org}/alert-rules | Create 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
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/alerts | List occurrencesNeeds viewer or above. |
| POST | /v1/orgs/{org}/alerts/{id}/acknowledge | Acknowledge occurrenceNeeds technician or above. |
api-keys
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/api-keys | List API keysNeeds admin or above. API keys are refused. |
| POST | /v1/orgs/{org}/api-keys | Create 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
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/assets | List assetsNeeds viewer or above. |
| POST | /v1/orgs/{org}/assets | Create 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}/restore | Restore assetNeeds admin or above. |
| POST | /v1/orgs/{org}/assets/bulk | Bulk assetsNeeds admin or above. |
| GET | /v1/orgs/{org}/assets/by-tag/{tag} | Find asset by tagNeeds viewer or above. |
| POST | /v1/orgs/{org}/assets/import | Commit importNeeds admin or above. |
| POST | /v1/orgs/{org}/assets/import/preview | Preview importNeeds technician or above. |
billing
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/billing | Get billingNeeds viewer or above. |
| POST | /v1/orgs/{org}/billing/checkout | Create checkoutNeeds owner or above. |
| POST | /v1/orgs/{org}/billing/portal | Create portalNeeds owner or above. |
bulk
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/bulk | List bulk actionsNeeds viewer or above. |
| POST | /v1/orgs/{org}/bulk/{id}/undo | Undo bulkNeeds admin or above. |
calendar-feed
| Method | Path | What it does |
|---|---|---|
| DELETE | /v1/orgs/{org}/calendar-feed | Revoke calendar feedNeeds viewer or above. |
| GET | /v1/orgs/{org}/calendar-feed | Get calendar feedNeeds viewer or above. |
| POST | /v1/orgs/{org}/calendar-feed | Create calendar feedNeeds viewer or above. |
channels
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/channels | List channelsNeeds admin or above. |
| POST | /v1/orgs/{org}/channels | Create channelNeeds admin or above. |
| DELETE | /v1/orgs/{org}/channels/{id} | Delete channelNeeds admin or above. |
| POST | /v1/orgs/{org}/channels/{id}/test | Test channelNeeds admin or above. |
config
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/config | Org configNeeds viewer or above. |
dashboard
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/dashboard | DashboardNeeds viewer or above. |
deliveries
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/deliveries | List deliveriesNeeds admin or above. |
entitlements
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/entitlements | List entitlementsNeeds viewer or above. |
| POST | /v1/orgs/{org}/entitlements | Create 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}/restore | Restore entitlementNeeds admin or above. |
events
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/events | List eventsNeeds viewer or above. |
| POST | /v1/orgs/{org}/events | Create eventNeeds technician or above. |
| GET | /v1/orgs/{org}/events/{id} | Get eventNeeds viewer or above. |
imports
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/imports | List importsNeeds viewer or above. |
| POST | /v1/orgs/{org}/imports/{id}/undo | Undo importNeeds admin or above. |
invitations
| Method | Path | What it does |
|---|---|---|
| GET | /v1/invitations/{token} | Get invitationNeeds a signed-in caller. API keys are refused. |
| POST | /v1/invitations/{token}/accept | Accept invitationNeeds a signed-in caller. API keys are refused. |
| GET | /v1/orgs/{org}/invitations | List invitationsNeeds admin or above. |
| POST | /v1/orgs/{org}/invitations | Create invitationNeeds admin or above. |
| DELETE | /v1/orgs/{org}/invitations/{id} | Revoke invitationNeeds admin or above. |
me
| Method | Path | What it does |
|---|---|---|
| GET | /v1/me | MeNeeds a signed-in caller. API keys are refused. |
members
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/members | List 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
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/onboarding | OnboardingNeeds viewer or above. |
orgs
| Method | Path | What it does |
|---|---|---|
| POST | /v1/orgs | Create orgNeeds a signed-in caller. API keys are refused. |
packs
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/packs | List packsNeeds viewer or above. |
| POST | /v1/orgs/{org}/packs/{code} | Apply packNeeds admin or above. |
| POST | /v1/orgs/{org}/packs/{code}/preview | Preview packNeeds admin or above. |
ping
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/ping | Org pingNeeds viewer or above. |
plans
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/plans | List plansNeeds viewer or above. |
| POST | /v1/orgs/{org}/plans | Create 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
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/reports/assets/{id}/history | Asset dossierNeeds viewer or above. |
| GET | /v1/orgs/{org}/reports/downtime | Downtime reportNeeds viewer or above. |
| GET | /v1/orgs/{org}/reports/expiry-forecast | Expiry forecastNeeds viewer or above. |
| GET | /v1/orgs/{org}/reports/framework-coverage | Coverage reportNeeds viewer or above. |
| GET | /v1/orgs/{org}/reports/spend | Spend reportNeeds viewer or above. |
service
| Method | Path | What it does |
|---|---|---|
| GET | /feeds/{token}/compliance.ics | Calendar feedNo credential required. |
| GET | /healthz | HealthNo credential required. |
| GET | /openapi.json | Open APINo credential required. |
| GET | /readyz | ReadyNo credential required. |
| POST | /webhooks/stripe | Stripe webhookNo credential required. |
settings
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/settings | Get org settingsNeeds viewer or above. |
| PUT | /v1/orgs/{org}/settings | Update org settingsNeeds admin or above. |
views
| Method | Path | What it does |
|---|---|---|
| GET | /v1/orgs/{org}/views | List viewsNeeds viewer or above. |
| POST | /v1/orgs/{org}/views | Create 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. |