The Request Flow
When you submit a criminal record for evaluation, the service processes it through three stages and returns a complete compliance decision in a single API response. Stage 1 — Parse and normalize. The raw screening data (XML or mapped JSON) is parsed into a structured format. Charge descriptions, dates, and disposition values are standardized so compliance rules can be applied consistently. Stage 2 — Verify identity. The candidate you’re screening is compared against the person named in the criminal record. The service checks name, date of birth, SSN, and address to determine whether the record actually belongs to your candidate. Stage 3 — Apply compliance rules. Each charge is evaluated against federal rules, state rules (all 50 US states, DC, and territories AS / GU / MP / PR / VI), and local (county) context from the record, plus any client- / tenant-specific rules configured for your organization. The service returns reportable / not reportable / manual review and a routing recommendation (Automation* / Auditor* / Insufficient Data*). *Automation = no human review needed. Auditor = human review recommended (optional). Insufficient Data = human review required. Details: Glossary. All three stages happen behind a singlePOST /evaluate call. The response contains the complete decision.
Order → Search → Evaluate contract
Background screening follows a hierarchy: Orders contain Searches. Each search gets its own compliance Decision fromPOST /evaluate.
Required identifiers on every request
Send these as top-level fields onrecord (never inside record_json or record_json.search):
Relationship in practice:
Multi-search example
Same candidate, one order, two searches → two API calls:
Each response is independent. You merge or route results in your system using
order_id / order_number / search_id.
Common mistakes
What You Send
The service accepts criminal records in two formats:
Companion fields on
record (same for both formats):
- Candidate info — required with
record_json; recommended with XML (name, DOB; optional SSN/address) - Search metadata —
search_id,search_date,order_id,order_number - Charge mapping (
cases[], optional) — maps each charge to your court/offense IDs; omit or[]to evaluate all charges without the count gate
record_json.
Resubmission — optional
Most integrations only need the first evaluate. Resubmission is optional — skip it until you have a reason to use it.
Details when you need them: Resubmission Workflow.
What You Get Back
Every response follows the same structure, regardless of whether you submitted XML or JSON:Charge decision and queue
For day-to-day integration, focus on two fields per charge:
*Automation — no human review needed. Auditor — human review recommended (optional). Insufficient Data — human review required. Full matrix: Routing & Queues.
Use queue or decision — one is usually enough; both only if routing and report labeling are separate jobs. Ops guide: Queue & Decision → Next Action.
Hierarchy (rollup)
The response nests Record → Courts → Cases → Charges. Parent levels roll up child queues; aggregated*_decision labels mirror those queues.
Queue rollup priority:
Insufficient Data > Auditor > Automation.
Response status codes
Data quality issues
Usedata.validation when a charge lands in Insufficient Data or you need to see what was wrong with the source record.
Clean data ≠ every charge is reportable. Reportability still comes from compliance rules.
End-to-End Example
Typical single-search flow:- Authenticate — Exchange your API key for a JWT token (
POST /auth/token). Use the returnedexpires_in(currently 3600 seconds / 1 hour). - Check status (optional) — Confirm the service is up (
GET /health). - Evaluate — Call
POST /evaluatewith eitherrecord.xmlorrecord.record_json, pluscandidate_infoand search metadata. - Process the decision — For each charge in the response:
NOT_REPORTABLE→ Automation* — exclude from the background reportREPORTABLE→ Auditor* — verify per your processMANUAL_REVIEW→ Insufficient Data* — investigate incomplete data
- Resubmit (optional) — Only if you corrected mapped data or candidate info after the first run: call
POST /evaluateagain withrecord_json+submission_type: "resubmit"(no XML). Skip this if one evaluate is enough. See Resubmission — optional and Resubmission Workflow. - Handle errors — If a request fails, follow the Retry Logic guidelines.
Related
- Quickstart — Run your first evaluation in 5 minutes
- Supported XML Schemas — XML formats accepted by the service
- API Reference — Complete endpoint documentation
- Routing & Queues — Detailed routing matrix and rollup logic
