Interactive reference

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.

PlanPer secondPer minute
free260
builder5300
growth10600
scale201200
enterprise503000

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"
}
CodeStatusRetryMeaning
validation_error400noInvalid request
invalid_api_key401noKey missing, malformed, or revoked
scope_not_allowed403noKey lacks the required scope
tier_not_allowed403noPlan does not include this endpoint
not_found404noNo such record
quota_exceeded429noMonthly request quota used up
rate_limited429yesToo many requests too fast
public_record_allowance_exceeded429noFree association reads used up
not_implemented501noOption accepted by the schema, not yet built
search_timeout504yesSimilarity search exceeded the database time limit
internal_error500yesUnexpected server error
service_unavailable503yesDependency 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.

allEvery scope below. The default for a new key.
associationsAssociation records, lookup, match, by-address, nearby and the record sections.
changesThe change feed and its summary.
statutesStatute search, sections and by-state.
professionalsProfessional and licence reads.
vendorsVendor reads.
complianceCompliance scan.
lists:readRead saved lists, tags and custom fields.
lists:writeCreate and change saved lists, tags and custom fields.
views:readRead and run saved views.
views:writeCreate and change saved views and live links.
exports:writeStart and read export jobs.
events:readRead the replayable change-event stream.
audit:readRead the organization audit log.
org:adminRead 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-15 additive 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-16 additive 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-16 additive `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-11 additive Bulk export gained `format=json` alongside CSV, and `columns=` for selecting a subset of a resource's column spec.
  • 2026-08-10 additive Bulk export resources `building-safety` and `report-card` added.
  • 2026-08-03 additive Change feed endpoints /api/v1/changes and /api/v1/changes/summary released.
  • 2026-06-15 additive v1 generally available.

Versioning and deprecation policy: status page.