API reference
The Checkbox REST API — base URL, authentication, versioning, errors, pagination, idempotency and expansion. Every operation is listed by resource.
The API is REST over HTTPS with JSON in and out, at https://app.checkbox.site/v1. It follows the conventions you know from Stripe: secret keys in the Authorization header, test and live mode chosen by the key, prefixed ids, cursor pagination, Idempotency-Key on POST, dated versions and errors with stable codes. The machine-readable contract is OpenAPI 3.1 at /v1/openapi.json (also /v1/openapi.yaml).
Authentication
Send a secret key as a Bearer token, or as the HTTP Basic user name (curl's -u "$KEY:"):
curl https://app.checkbox.site/v1/account \
-H "Authorization: Bearer $CHECKBOX_SECRET_KEY"| Key | Use |
|---|---|
ck_test_…, ck_live_… | Secret keys, server side. They carry a role (admin, member or viewer) |
rk_test_…, rk_live_… | Restricted keys with per-resource scopes ({ "checks": "read" }) |
pk_test_…, pk_live_… | Publishable keys for the browser (Elements); refused elsewhere |
A missing or wrong key is 401 (api_key_missing, api_key_invalid); a key without the scope is 403 (insufficient_scope). See test and live mode.
Conventions
- Objects have
id,object(the type) andlivemode; timestamps are Unix seconds (created); fields are snake_case. - Ids are
<prefix>_<32 hex>(site_…,scan_…,fnd_…,task_…,evt_…). Inputs also accept the raw UUID. - Lists return
{ "object": "list", "data": [...], "has_more": true, "url": "/v1/..." }. Page withlimit(1–100, default 10),starting_afterandending_before(object ids). - Expansion:
expand[]=latest_scanorexpand[]=domain_verificationonretrieveSiteincludes the related object. - Request ids: every response has a
Request-Idheader (req_…), also inside error bodies. Include it when you contact support.
curl -G https://app.checkbox.site/v1/sites \
-u "$CHECKBOX_SECRET_KEY:" \
-d limit=2Errors
Errors have an HTTP status and a body with a stable code:
{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "price (major units, e.g. 19.99) or amount (minor units) is required",
"param": "price",
"doc_url": "https://checkbox.site/docs/api/errors#parameter_invalid",
"request_id": "req_1eead3177abc4ebc906a8af0fddcc0c4",
"next_action": { "type": "fix_request", "message": "Correct price and call the check again." }
}
}type is one of invalid_request_error, authentication_error, permission_error, rate_limit_error, idempotency_error, api_error. Codes are never renamed or reused; every code is documented. next_action, when present, tells an agent what to do about it.
Idempotency
Every POST accepts an Idempotency-Key header (up to 255 characters). The same key with the same body within 24 hours returns the stored response with Idempotent-Replayed: true; with a different body it is 400 idempotency_key_reused; while the first request is still running, 409 idempotency_key_in_use. Server errors are not stored, so retrying with the same key is always safe. The SDKs send a key on every POST automatically.
curl https://app.checkbox.site/v1/sites \
-u "$CHECKBOX_SECRET_KEY:" \
-H "Idempotency-Key: create-joybox-site" \
-H "Content-Type: application/json" \
-d '{ "url": "https://joybox.example" }'Versioning
Versions are dates. Send Checkbox-Version: 2026-10-30 to pin a request; without it, the account's pinned version is used (set on first use; change it with updateAccount). Responses echo Checkbox-Version and Checkbox-Mode. Known versions: 2026-10-30.
Rate limits
300 requests per minute per account and mode, with RateLimit-* headers. Over the limit: 429 rate_limit_exceeded with Retry-After. Some routes have their own limits (preflight checks 120 per minute; scans and evaluations 60 per hour per site).
Resources
| Resource | What it is |
|---|---|
| Agent setup | Device login and setup sessions behind setup_checkbox and checkbox init |
| Account | Mode, activation, limits, next step |
| Sites | The businesses Checkbox monitors; snippet; domain verification |
| Scans | Synthetic-shopper runs |
| Evaluations | Score, insurable flag, blockers |
| Findings | Latest result of each legal check, with citations |
| Compliance plans | Ordered tasks, verification, human answers |
| Fixes | Engine-verified platform-specific fixes |
| Evidence | The tamper-evident vault |
| Certificates | Signed monitoring certificates |
| Notices | Required lifecycle emails sent for you |
| Law updates | Changes in the law and their effect |
| Checks | Stateless preflight checks |
| Elements | The disclosure element, disclosures and consents |
| Test runs | Synthetic test subscriptions |
| Webhook endpoints and Events | Signed event delivery |
Checkbox is compliance software, not a law firm; nothing in these docs is legal advice (details). For AI agents: every page is available as Markdown at the same URL plus .md; the index is /llms.txt.