Skip to main content

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 single POST /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 from POST /evaluate.
There is no batch evaluate API. One POST /evaluate = one search. An order with three searches requires three separate calls.

Required identifiers on every request

Send these as top-level fields on record (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 metadatasearch_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
See Supported XML Schemas for XML formats, and Evaluate for 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

Use data.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:
  1. Authenticate — Exchange your API key for a JWT token (POST /auth/token). Use the returned expires_in (currently 3600 seconds / 1 hour).
  2. Check status (optional) — Confirm the service is up (GET /health).
  3. Evaluate — Call POST /evaluate with either record.xml or record.record_json, plus candidate_info and search metadata.
  4. Process the decision — For each charge in the response:
    • NOT_REPORTABLE → Automation* — exclude from the background report
    • REPORTABLE → Auditor* — verify per your process
    • MANUAL_REVIEW → Insufficient Data* — investigate incomplete data
  5. Resubmit (optional) — Only if you corrected mapped data or candidate info after the first run: call POST /evaluate again with record_json + submission_type: "resubmit" (no XML). Skip this if one evaluate is enough. See Resubmission — optional and Resubmission Workflow.
  6. Handle errors — If a request fails, follow the Retry Logic guidelines.
*Automation = no human review needed. Auditor = human review recommended (optional). Insufficient Data = human review required. If your workflow uses multiple searches under one order, repeat step 3 once per search (see Order → Search → Evaluate contract).