Primary-source verification API
Verify the license before the hire.
One API call checks a license at the issuing board, an NPI at NPPES and a name against every exclusion list. Each claim comes back verified, discrepancy, not found or unable to verify, with the source that answered and a proof file.
Sandbox keys are immediate. Live keys follow FCRA customer vetting, usually one business day.
curl https://api.primarycheck.com/v1/verifications?wait=25 \
-H "Authorization: Bearer pc_live_…" \
-H "Idempotency-Key: 6f1c0b5e-…" \
-H "Content-Type: application/json" \
-d '{
"person": {
"firstName": "Amy", "lastName": "Kowalski", "dob": "1976-02-14"
},
"claims": [
{
"type": "healthcare_screen",
"state": "PA", "profession": "rn",
"licenseNumber": "RN353077L", "npi": "1003000126",
"claimId": "hs"
}
],
"purpose": "employment",
"consent": { "consentId": "cons_8f1…" },
"reference": "ATS-48213"
}'How it works
Three steps from candidate to proof file
- 1
Collect consent
Send the candidate a hosted disclosure and authorization page, or attach your own signed one. No consent, no check.
- 2
Submit the claims
A license, NPI, exclusion screen, certification, degree or job, in one request. Pass
?wait=25to long-poll or take a signed webhook. - 3
Read the verdict, file the proof
Every claim carries field-by-field checks, the source record as published, hashes and a rendered PDF for the audit binder.
The response
A verdict you can act on, never a score
- Four outcomes. verified, discrepancy, not_found, unable_to_verify, each with a machine-readable reason. Pending claims say so.
- Field checks. Number, name, type, status, expiration and actions compared one by one. One mismatch is a discrepancy, with both values shown.
- Evidence first. The raw source payload, a page capture and a rendered record PDF, hashed and timestamped, behind signed links.
- Stale is not clear. Every dataset carries a data-as-of date. A list past its maximum age returns source_stale, never a pass.
{
"id": "ver_7c1e0b1f2a9d4e8f0b3c",
"status": "complete",
"claims": [
{
"claimId": "hs",
"type": "healthcare_screen",
"verdict": "verified",
"parts": [
{
"type": "license", "verdict": "verified",
"summary": {
"status": "Active - Multistate",
"expires": "2028-04-30", "flags": []
},
"results": [
{ "source": "PA-PALS", "verdict": "verified",
"evidence": ["evd_a1…", "evd_b2…"] }
]
},
{
"type": "npi", "verdict": "verified",
"results": [ { "source": "US-NPPES", "verdict": "verified" } ]
},
{
"type": "exclusion_screen", "verdict": "verified",
"results": [
{ "source": "US-OIG-LEIE", "verdict": "verified",
"dataAsOf": "2026-10-30" },
{ "source": "US-SAM-EXCL", "verdict": "verified",
"dataAsOf": "2026-11-03" },
{ "source": "US-OFAC-SDN", "verdict": "verified",
"dataAsOf": "2026-11-03" },
{ "source": "PA-MEDICAID-EXCL", "verdict": "verified",
"dataAsOf": "2026-11-01" }
]
}
]
}
],
"completedAt": "2026-11-03T14:05:11Z",
"fcra": { "controlsVersion": "fcra-controls-2026-11-03.0" }
}Coverage, counted
Numbers from the catalog, not the brochure
Every figure below is computed from the source catalog at build time. Only a board we query live, with a nightly canary passing, counts as live.
538
licensing boards queried live
1,402
state and profession pairs live
50 / 51
jurisdictions with live boards
419
known-good records checked nightly
63
professions with national keys
12
exclusion lists loaded: 5 federal, 7 state Medicaid
10
certification issuers verified by credential ID
11
interstate compacts with privilege lookups
Coverage
All states and professionsLive license lookups by state
Counts are live (state, profession) pairs. Blocked boards are named as blocked and building boards as building; the API answers unable_to_verify with the reason rather than guessing.
Alabama22 liveAlaska6 liveArizona25 liveArkansas32 liveCalifornia8 liveColorado42 liveConnecticut42 liveDelaware40 liveDistrict of Columbia36 liveFlorida45 liveGeorgia7 liveHawaii3 liveIdaho41 liveIllinois40 liveIndiana44 liveIowa41 liveKansas27 liveKentucky26 liveLouisiana28 liveMaine46 liveMaryland41 liveMassachusetts39 liveMichigan42 liveMinnesota14 liveMississippi29 liveMissouri36 liveMontana3 liveNebraska7 liveNevada26 liveNew Hampshire3 liveNew JerseybuildingNew Mexico37 liveNew York38 liveNorth Carolina20 liveNorth Dakota15 liveOhio48 liveOklahoma25 liveOregon36 livePennsylvania40 liveRhode Island36 liveSouth Carolina5 liveSouth Dakota6 liveTennessee3 liveTexas29 liveUtah8 liveVermont43 liveVirginia52 liveWashington56 liveWest Virginia26 liveWisconsin6 liveWyoming32 live
Products
One verification object, six kinds of claim
Claims share one request shape, one verdict vocabulary and one evidence model. New states and claim types add data, never endpoints.
Licenses
Live lookup at the state board: status, expiration, multistate privilege, disciplinary actions and the order documents.
Learn more
Exclusions and sanctions
OIG LEIE, SAM.gov, OFAC, Medicare opt-out, FDA debarment and state Medicaid lists, each with its own as-of date.
Learn more
Certifications
BLS, ACLS, NREMT, CompTIA, PMI and more, verified by credential ID at the issuer, never from the card photo.
Learn more
Education
Degree and attendance through the Clearinghouse, registrar outreach where needed, and an accreditation check on every school.
Learn more
Employment
Payroll-connected confirmation in seconds, then an outreach engine with anti-fraud contact rules. Dates and title, facts only.
Learn more
Monitoring
Re-check a license or a person on a cadence; a webhook with the exact diff when a status, expiration, action or exclusion changes.
Learn more
Built for
One audience per page, one integration for all of them
Healthcare employers
Home care, SNFs, behavioral health and hospitals: license, NPI and every exclusion list in one claim.
Learn more
Staffing agencies
Credentialing packets at placement and re-verification between placements, with the PDF the facility asks for.
Learn more
Property and trades
Contractor, electrician, plumber and HVAC licenses read from the board before the work order.
Learn more
Developers and platforms
An API designed once for every state: idempotent, async, signed webhooks, sandbox parity, SDKs.
Learn more
For developers
Built the way you would build it
- SDKs.
pip install primarycheckandnpm install primarycheck, generated from the OpenAPI spec, with helpers for waiting and signature checks. - Webhooks. HMAC-signed with a timestamp, retried with backoff, replayable from the dashboard.
- Sandbox. A separate host with deterministic outcomes by last name and every live source code present.
- Idempotency and versioning. Idempotency-Key on every POST; date-pinned behaviour changes; one error shape.
- Coverage endpoint. GET /v1/coverage says what we can verify for a state and profession before you ask.
from primarycheck import webhooks, SignatureVerificationError
@app.post("/primarycheck") # FastAPI; Flask/Django are the same idea
async def hook(request: Request):
try:
event = webhooks.verify_signature(
await request.body(), # the RAW bytes, before JSON parsing
request.headers["PrimaryCheck-Signature"],
WEBHOOK_SECRET, # whsec_… from POST /v1/webhook_endpoints
)
except SignatureVerificationError:
return Response(status_code=400)
if event["type"] == "verification.completed":
verification = event["data"]["object"]
return Response(status_code=200)Compliance
Run as a consumer reporting agency on every order
Verification for hiring, retention or credentialing is a consumer report under the FCRA. PrimaryCheck applies the full set of CRA controls to every order, whatever the stated purpose.
Start in the sandbox today
Same source codes as production. Go live after vetting, with no minimums and no platform fee.