55 operations, contract 1.5.0. Pick one, fill the parameters, and send it against the sandbox or with your own key.
Send Authorization: Bearer ce_live_... on every call. Keys are made at API keys.
The sandbox key is ce_test_sandbox. It reads a fixed dataset and is not metered.
Machine-readable spec: JSON, YAML. Import either into Postman or a client generator.
Every response has X-Request-Id. Quote it when you contact support.
Rate limits
Two limits apply. The monthly quota is calendar month, UTC; a key that reaches it gets 429 quota_exceeded. The burst limit stops a short spike: past it a key gets 429 rate_limited with Retry-After, and the monthly quota is not charged twice for a refused call.
Plan
Per second
Per minute
free
2
60
builder
5
300
growth
10
600
scale
20
1200
enterprise
50
3000
Headers on every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset-At, X-RateLimit-Burst-Limit, X-RateLimit-Burst-Remaining. The burst limit is enforced per serving instance.
Errors
Every error has the same shape. Switch on error, never on the message.
{
"ok": false,
"error": "rate_limited",
"message": "Too many requests in one second. ...",
"docs_url": "https://commonelements.com/developers/docs#errors",
"next_steps": "Wait the number of seconds in the Retry-After header ...",
"request_id": "req_3f9c1a7e5b2d4c8e9a01"
}
Code
Status
Retry
Meaning
validation_error
400
no
Invalid request
invalid_api_key
401
no
Key missing, malformed, or revoked
scope_not_allowed
403
no
Key lacks the required scope
tier_not_allowed
403
no
Plan does not include this endpoint
not_found
404
no
No such record
quota_exceeded
429
no
Monthly request quota used up
rate_limited
429
yes
Too many requests too fast
public_record_allowance_exceeded
429
no
Free association reads used up
not_implemented
501
no
Option accepted by the schema, not yet built
search_timeout
504
yes
Similarity search exceeded the database time limit
internal_error
500
yes
Unexpected server error
service_unavailable
503
yes
Dependency unavailable
Pagination
Collections take limit and either offset or a cursor, and say which in the response. Where a response has next_cursor, pass it back unchanged; it is opaque and expires with the page. Offset paging stops at 10,000 rows: past that, use an export.
Key scopes
A key carries scopes. Each operation names the one it needs; all satisfies any. Create narrower keys for integrations so one leak cannot do everything.
all
Every scope below. The default for a new key.
associations
Association records, lookup, match, by-address, nearby and the record sections.
changes
The change feed and its summary.
statutes
Statute search, sections and by-state.
professionals
Professional and licence reads.
vendors
Vendor reads.
compliance
Compliance scan.
lists:read
Read saved lists, tags and custom fields.
lists:write
Create and change saved lists, tags and custom fields.
views:read
Read and run saved views.
views:write
Create and change saved views and live links.
exports:write
Start and read export jobs.
events:read
Read the replayable change-event stream.
audit:read
Read the organization audit log.
org:admin
Read seats and change member roles.
Endpoints
Dataset catalog
What the platform holds, and what it holds for one association. Start here: the catalog names every resource, the plan it needs, and the caveat that stops an unmatched jurisdiction reading as a clean record.
Change feed
What changed, and when. The rest of the API describes the association graph as it stands today; this describes it moving.
Associations
Statutes
Vendors
Professionals and licenses
Aggregates and compliance
Bulk export
Stream a full dataset as CSV or JSON. Growth plan or higher.
Association resources
Public record joined to one association: parcels, structures, permits, code enforcement, hazards, insurance, legal, financials, governance and documents. Same request shape for every one, so a client written against one works against all ten.
Cross-association collections
The same corpora queried across associations, where the buyer genuinely asks the question that way and an indexed filter exists to answer it.
Bulk delivery
Asynchronous exports for datasets larger than one HTTP response. Request, poll, download a durable artifact with a manifest and a column dictionary beside it — or put it on a schedule and stop asking. Growth plan and above.
Changelog
2026-11-15additive Every error response now carries `request_id` (also the `X-Request-Id` header), `docs_url` and `next_steps`, and a 401 carries `WWW-Authenticate`. A per-key burst limit was added (one second and one minute windows, by plan); a refused request returns 429 `rate_limited` with `Retry-After`, and every response carries `X-RateLimit-Burst-Limit` and `X-RateLimit-Burst-Remaining`. An interactive reference with a try-it console is at /developers/reference.
2026-08-16additive Added the meta namespace: /api/v1/openapi (machine-readable spec), /api/v1/meta/status, /api/v1/meta/dictionary, /api/v1/meta/usage, and a sandbox at /api/v1/meta/sandbox. Error responses on the new endpoints carry `docs_url` and `next_steps` alongside the existing `error` and `message`.
2026-08-16additive `display_name` added to the association record: the canonical rendering of the filed name. `name` is unchanged and still the verbatim registry string.
2026-08-11additive Bulk export gained `format=json` alongside CSV, and `columns=` for selecting a subset of a resource's column spec.
2026-08-10additive Bulk export resources `building-safety` and `report-card` added.
2026-08-03additive Change feed endpoints /api/v1/changes and /api/v1/changes/summary released.