PrimaryCheck

Quickstart

Three steps: get a sandbox key, create a verification, read the verdict per claim. Sandbox requests hit deterministic fake sources that use the same source codes as production.

1. Get a sandbox API key

Open the dashboard, create an account and copy a pc_test_… key. Sandbox base URL: https://sandbox.primarycheck.com/v1. Live keys (pc_live_…) are issued after customer vetting; see Authentication.

2. Create a verification

curl https://api.primarycheck.com/v1/verifications \
  -H "Authorization: Bearer pc_live_…" \
  -H "Idempotency-Key: 6f1c0b5e-…" \
  -H "Content-Type: application/json" \
  -d '{
    "person": { "firstName": "Amy", "middleName": "E", "lastName": "Kowalski", "dob": "1976-02-14" },
    "claims": [
      { "type": "license", "state": "PA", "profession": "rn", "number": "RN353077L", "claimId": "c1" },
      { "type": "npi", "number": "1003000126" },
      { "type": "exclusion_screen", "npi": "1003000126" }
    ],
    "purpose": "employment",
    "consent": { "consentId": "cons_8f1…" },
    "reference": "ATS-48213"
  }'

3. Read the verdict for each claim

The response is 201 with status: pending or complete. Poll GET /v1/verifications/{id}?wait=25 or subscribe to verification.completed webhooks.

{
  "id": "ver_7c1e0b1f2a9d4e8f0b3c",
  "object": "verification",
  "status": "complete",
  "purpose": "employment",
  "reference": "ATS-48213",
  "claims": [
    {
      "index": 0, "claimId": "c1", "type": "license", "verdict": "verified", "reason": null,
      "summary": { "status": "Active - Multistate", "expires": "2028-04-30", "multistate": true, "flags": [] },
      "results": [
        {
          "source": "PA-PALS", "role": "primary", "status": "ok", "verdict": "verified",
          "checkedAt": "2026-11-03T14:05:09Z",
          "fieldChecks": [
            { "field": "license_number", "claimed": "RN353077L", "found": "RN353077L", "match": true },
            { "field": "name", "claimed": "Amy Kowalski", "found": "Amy E Kowalski", "match": true },
            { "field": "license_type", "claimed": "rn", "found": "Registered Nurse", "match": true },
            { "field": "status", "claimed": "active", "found": "Active - Multistate", "match": true },
            { "field": "expires", "claimed": ">= 2026-11-03", "found": "2028-04-30", "match": true }
          ],
          "evidence": ["evd_a1…", "evd_b2…"]
        }
      ]
    },
    { "index": 1, "type": "npi", "verdict": "verified", "results": [ { "source": "US-NPPES", "verdict": "verified" } ] },
    { "index": 2, "type": "exclusion_screen", "verdict": "verified",
      "results": [ { "source": "US-OIG-LEIE", "verdict": "verified", "dataAsOf": "2026-10-30T00:00:00Z" } ] }
  ],
  "createdAt": "2026-11-03T14:05:04Z",
  "completedAt": "2026-11-03T14:05:11Z",
  "fcra": { "controlsVersion": "fcra-controls-2026-11-03.0" }
}

Sandbox magic names

In the sandbox, person.lastName drives the outcome: Verified, Discrepancy, Notfound, Ambiguous, Pending (completes after 60 s), Slow (5 min). Anything else verifies. Details in Sandbox.