Registry API v1

Authentication

Every endpoint requires an API key. Keys are server-to-server credentials tied to one partner organisation and a fixed set of scopes.

Passing your key

Either header works; use the bearer form unless your HTTP client makes that awkward.

Headers
Authorization: Bearer c24_live_<48 hex>
# or
x-api-key: c24_live_<48 hex>
curl
curl https://collect24.art/api/v1 \
  -H "Authorization: Bearer c24_live_..."

Collect24 stores only a SHA-256 hash of your key: it is displayed once, at creation, and cannot be recovered. If it is lost or exposed, ask us to revoke it and we issue a new one. Keys may carry an expiry date, and every authenticated call records the moment the key was last used.

Key errors

StatusCodeMeaning
401missing_api_keyNo key was presented.
401invalid_api_keyThe key is unknown or not linked to an organisation.
401revoked_api_keyThe key was revoked.
401expired_api_keyThe key passed its expiry date.
403organisation_inactiveThe organisation's API access is not active.
403missing_scopeThe key does not carry the scope the endpoint requires.

Scopes

Scopes are fixed per key. Requesting an endpoint outside your scopes returns 403 missing_scope.

ScopeGrants
artworks:readRead and search artworks, including collection, gallery and museum listings.
artworks:writeCreate and update artworks inside your own organisation profile.
artists:readRead artist records and biographies.
artists:writeReserved for verified artist and representation partners.
galleries:readRead gallery profiles.
museums:readRead museum profiles.
certificates:readRead certificate metadata for works in your own profile.
provenance:readRead public provenance statements.
webhooks:manageRequired for webhook-related access on your organisation.

Write permission is more than a scope

artworks:write allows writing, but never outside your own data. Your key's organisation maps to exactly one collection profile (and optionally one gallery profile). A POST lands inside that profile; a PATCH is refused with 403 not_permitted unless the target artwork already sits in it. Fields that determine ownership or placement are rejected outright with 422 protected_field.

If your organisation has no linked profile yet, publishing returns 403 no_write_target — contact us to link your gallery, museum or collection.

Rate limits

Per key, per minute, with a default of 120 requests per minute. The counter is incremented atomically, so parallel requests cannot exceed the ceiling.

HeaderMeaning
x-ratelimit-limitRequests allowed in the current minute.
x-ratelimit-remainingRequests left in the window.
x-ratelimit-resetUnix seconds at which the window resets.
Retry-AfterSeconds to wait, sent with 429 responses.
429 response
{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Retry after the current minute window.",
    "limit": 120,
    "retry_after_seconds": 24
  }
}

Handling keys safely

The API sets no Access-Control-Allow-Origin header, so browser JavaScript on other origins cannot read responses. Keep keys on your server, in environment variables or a secret manager — never in a browser bundle, mobile app or public repository. Every call is logged with method, path, status, duration, a truncated hash of the calling IP and the user agent; request and response bodies are never stored and credential-shaped query parameters are redacted before logging.

Need a key? Request access.