Skip to main content
Prefer a UI? Use the runnable demo: clone Theary-AI/quick-start, set PUBLIC_RECORDS_API_KEY, and open /public-records. See that repo’s PUBLIC_RECORDS.md for the first successful evaluate path. More payloads: Sample Pack.

Prerequisites

  • Staging API key from Account Setup
  • cURL or your preferred HTTP client
Public Records is synchronous — the decision returns in the same /evaluate response. No webhooks required.
One search per call. order_id, order_number, and search_id identify the order line and this evaluate run. There is no batch API. See Order → Search → Evaluate contract.

Step 1: Configure Environment

Use staging for your first evaluate:

Step 2: Verify Connectivity

Confirm the API is up before proceeding:
Expected response:

Step 3: Get Auth Token

Exchange your API key for a JWT token. Lifetime is in expires_in (currently 3600 seconds / 1 hour). See Authentication for the full guide.
Response:
Save the access_token — you’ll use it in the next step:

Step 4: Evaluate a Record

This smoke test uses mapped JSON (record_json) with no cases[], so every offense in the payload is evaluated and the count-reconciliation gate is not applied. For the XML path, see Supported XML Schemas. After the smoke test, see Optional: map charges with cases[] when you need your own court/offense IDs. Save the following as record.json:
record.json
Then submit it:
Response:

Optional: map charges with cases[]

Omit cases[] for the simplest path. When you need your court_search_id / offense_id values (or is_excluded), send a full mapping — one row per charge, in XML/record_json order. Partial subsets return HTTP 422. Same traffic XML as the sample pack, with mapping:
Full bodies:
Details: Evaluate — cases[].

Step 5: Understand the Response

Every response is wrapped in a { success, data, meta } envelope. The evaluation result is at data.decision. Start here — per charge: Rolled up to the search: Court/case levels expose the same pair (court_decision / court_queue, case_decision / case_queue). See How It Works and Routing. What to do next — pick queue or decision (one is usually enough; both only if routing and report labeling are separate steps): Full ops guide: Queue & Decision → Next Action. Queue rollup priority: Insufficient Data > Auditor > Automation. One charge lacking data can mark the whole case (and court / search) as Insufficient Data. When the source record has data-quality issues (e.g., missing SSN or disposition), the response also includes a structured validation object alongside decision. When the data is clean, validation is omitted entirely.

Next Steps

Queue & Decision → Next Action

One signal is usually enough; both only for separate jobs

API Reference

Explore all available endpoints and options

Code Examples

Working examples in Python, JavaScript, and cURL

Error Handling

Retry logic, failure handling, and troubleshooting

Environments

Production, staging, and dev environment URLs

Need Help?