PrimaryCheck

Claim types

Claims are discriminated by type. Each type lists the primary source it is verified against and the fields that decide the verdict.

License — state professional licenses

{ "type": "license", "state": "PA", "profession": "rn", "number": "RN353077L" }

profession is a key from GET /v1/professions (national taxonomy; we map it to the board's license type). state is the state of practice. number is optional but strongly recommended: a name-only search that matches more than one person returns unable_to_verify(ambiguous_match) with the candidates, never a guess.

Field checkPasses when
license_numberEqual ignoring profession prefix and leading zeros.
nameNormalized last name or declared alias matches; first name exact or nickname. Initial-only needs review.
license_typeClaimed profession maps to the record's type, strictly (PT is not PTA).
statusBoard status maps to active. Probation is active with a flag.
expiresOn or after today when the board publishes an expiration.
disciplinary_actionsRecorded and flagged, never auto-fails. Board order documents are captured as evidence.

Compacts: when the profession has an interstate compact (NLC, IMLC, PT, PSYPACT, OT, counseling, EMS, ASLP, dental, social work) the record carries multistate and privilegeStates[]. Coverage per state and profession: coverage pages or GET /v1/coverage.

NPI — provider identity

{ "type": "npi", "number": "1003000126" }

Checked live against the NPPES registry: number exists, name matches, enumeration date, status, taxonomy and practice address. Licenses listed in NPPES are corroborating only and never decide a license claim.

Exclusion screen — sanctions lists

{ "type": "exclusion_screen", "npi": "1003000126" }

Runs every list below. verified means clear on every list with every list fresh. A hit by NPI or name + date of birth is a discrepancy with the row as evidence. A name-only possible hit is unable_to_verify(ambiguous_match) for review. A stale list is unable_to_verify(source_stale), never clear.

ListRefreshMatch keys
OIG LEIEdailyNPI, name + DOB, UPIN
SAM.gov exclusionsdailyname + DOB, classification
OFAC SDNdailyname (+ DOB where present)
Medicare opt-out affidavitsweeklyNPI, name (informational flag, not an exclusion)
FDA debarment listweeklyname
State Medicaid exclusion listsweeklyname + DOB, NPI, license number; per-state availability reported

Healthcare screen — the bundle

{ "type": "healthcare_screen", "state": "PA", "profession": "rn", "licenseNumber": "RN353077L", "npi": "1003000126" }

Expands server-side into license + npi + exclusion_screen. The bundle is verified only when every part is verified; the parts are returned individually under parts[]. One price.

Certification — issuer credential lookups

{ "type": "certification", "issuer": "aha_bls", "credentialId": "…" }

Public issuer lookups by credential ID (AHA eCards, NREMT, CompTIA, PMI, AWS, Microsoft, Google, Cisco, NASM, ServSafe and more). Verdict: the ID exists, the name matches, not expired. Issuer keys: GET /v1/issuers.

Education — degrees and enrollment

{ "type": "education", "school": "Ohio State University", "degree": "BSN", "graduatedYear": 2019 }

National Student Clearinghouse first (cost passed through), registrar outreach when the school does not participate, and an accreditation check against the Department of Education and CHEA data. Unaccredited or known diploma-mill schools return discrepancy with flags: ["unaccredited"].

Employment — past jobs

{ "type": "employment", "employer": "Mercy Health", "employerState": "OH", "title": "Charge Nurse", "start": "2020-03", "end": "2023-08" }

Payroll-connected confirmation first, The Work Number only when options.allowPaidThirdParty is set, then our employer outreach engine (email, fax and voice on a seven-day cadence, facts only). The organization must exist in an independent source before any contact; a candidate-supplied contact is used only when it matches one. Dates compare by month; title is compared by a reviewer and never auto-fails.

Monitors — re-check on a cadence

POST /v1/monitors
{ "person": { … }, "claim": { "type": "license", "state": "PA", "profession": "rn", "number": "RN353077L" },
  "cadence": "weekly", "consent": { "consentId": "cons_…" } }

Re-runs the claim on cadence (boards weekly by default, exclusion lists daily). A monitor.changed webhook carries a diff of status, expiration, new actions or an exclusion hit. DELETE /v1/monitors/{id} stops it at period end.