{"openapi":"3.0.3","info":{"title":"License Verification API","version":"1.0.0","description":"Verify US professional licences in real time against official state board rosters, screen identities against federal and state exclusion lists, and cross-reference NPIs.\n\nAuthenticate with an API key as a bearer token: `Authorization: Bearer sk_live_...`.\n\nQuota behaviour differs by plan. Paid plans that exceed their included volume are throttled to 10 requests per minute rather than cut off, because a hard stop breaks a live integration mid-month. The free plan hard-stops instead.","contact":{"name":"License Verification API","url":"https://licenseverificationapi.com/contact"},"termsOfService":"https://licenseverificationapi.com/terms","license":{"name":"Commercial - see Terms of Service","url":"https://licenseverificationapi.com/terms"}},"servers":[{"url":"https://licenseverificationapi.com"}],"tags":[{"name":"Verification","description":"Licence status against board rosters."},{"name":"Batch","description":"Asynchronous jobs for large volumes."},{"name":"Exclusion screening","description":"Federal and state exclusion lists."},{"name":"NPI","description":"National Provider Identifier cross-reference."},{"name":"Search","description":"Name search returning ranked candidates."},{"name":"Monitors","description":"Ongoing re-verification with webhooks."},{"name":"Certificates","description":"Signed, shareable verification records."}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","description":"An API key from your dashboard, in the form `sk_live_...`."}}},"security":[{"ApiKey":[]}],"paths":{"/api/v1/verify":{"get":{"operationId":"getVerify","tags":["Verification"],"summary":"Verify one licence","description":"Cache-first: a hit returns immediately, a miss dispatches to the board adapter for that profession and state and writes the result back.","parameters":[{"name":"profession","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":40}},{"name":"state","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"license_number","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":80}},{"name":"license_class","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":64}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","expired","expired_unconfirmed","suspended","revoked","inactive","delinquent","unknown","not_found","not_applicable","not_supported","multiple_matches"],"description":"The licence state. not_found means the board was reached and holds no such licence; not_supported means this profession/state pair has no adapter, or the board returned a status that cannot be interpreted for this licence. multiple_matches means the number is held by more than one PERSON - boards run one number series per licence class, so the same number can name an unrelated registered nurse and practical nurse. In that case holder_name, license_type and expires_at are null and the candidates are listed in matches; re-request with license_class to get one unambiguous answer. All of these are 200 responses. TREAT THIS AS AN OPEN ENUM. Values may be added as boards publish states we do not yet map, and a new value is a MINOR change to this API. Your handler must have a default branch, and that branch must route to manual review - never to a clear. A consumer that maps an unrecognised status onto not_found turns an answer we did not give into a clean bill of health."},"coverage":{"type":"object","description":"Whether we could check, and why not when we could not. This is a DIFFERENT AXIS from status: status describes the licence, coverage describes our ability to verify it. Present on every answer. It exists because not_supported was carrying four distinct situations at once, and a credentialing file needs a different sentence for each.","properties":{"state":{"type":"string","enum":["verified","not_issued","not_retrievable","other_grain","unresolved","not_built"],"description":"verified: a register was consulted and answered. not_issued: the jurisdiction issues no such credential - stop looking, and see applicability for the statute. not_retrievable: the credential exists and its register cannot be retrieved by anyone automatically - check by hand at the URL in the determination. other_grain: issued at a different grain (to a premises rather than a person, say) and we hold it under another key - see see_also. unresolved: we HAVE researched this jurisdiction and the evidence points both ways, so we assert neither that the credential exists nor that it does not. Distinct from not_built, and the distinction is what a reader should act on: not_built means nobody looked and an answer may follow, unresolved means the work is done and ended in a contradiction only the board can settle. Route it to manual review and read the determination at citation_url, which carries both sides and the date they were read. not_built: we have not built this source. not_built is a statement about US, not about the jurisdiction: it does NOT assert that the credential exists or is retrievable. OPEN ENUM, with the same default-branch rule as status."},"checked":{"type":"boolean","description":"Whether a register was actually consulted for this request. Not derivable from status alone, and the bit an auditor asks for: not_found means we looked and the number is absent (checked true), while not_supported means we never looked (checked false). Both read as \"no record\" to a naive consumer."},"citation_url":{"type":"string","nullable":true,"description":"Where the claim behind this coverage state can be read. Null for verified (the provenance block already names the source) and for not_built (there is no claim)."}}},"discipline":{"type":"boolean","nullable":true,"description":"The board's published discipline indicator, where it publishes one. THREE-VALUED: true means a disciplinary action is recorded against this holder; false means the board publishes the fact and records none; null means this source does not publish it at all, which is the common case. Do NOT treat null as false - it is an absence of evidence, not evidence of absence. This is a different question from status: a credential can be active and flagged, because the flag describes history rather than present authority, so it is never folded into status."},"applicability":{"type":"object","description":"Present only when status is not_applicable. The evidence that the credential does not exist in that state, so a caller can check the claim instead of trusting it: the scope it covers, what the holder relies on instead, the statute or agency document, the verbatim text, and the date we last confirmed that text still says this. Legislatures change these - Texas repealed its own registration in 2016 - so reviewed_at is part of the answer, not decoration.","properties":{"scope":{"type":"string","enum":["practitioners","all_holders"],"description":"all_holders means the state registers nobody. practitioners means it registers no prescriber, but some other class does hold this credential - read held_by before concluding a number is fake."},"held_by":{"type":"string","description":"Present only when scope is practitioners: the classes that DO register in that state, e.g. \"researchers and chemical analysts\". If your number was issued to one of these, it is real and this endpoint simply does not cover it."},"authority":{"type":"string"},"citation":{"type":"string"},"quote":{"type":"string"},"reviewed_at":{"type":"string","format":"date"}}},"ambiguous":{"type":"boolean","description":"Present and true when the number matched several people. Check this rather than assuming holder_name identifies one person."},"match_count":{"type":"integer","description":"Number of distinct records sharing this licence number."},"matches":{"type":"array","description":"Every candidate behind an ambiguous answer, so a caller can match on name or class rather than trusting an arbitrary pick. Also returned when one PERSON holds several credentials under one number, where it lists their other credentials.","items":{"type":"object","properties":{"license_class":{"type":"string","nullable":true},"license_type":{"type":"string","nullable":true},"holder_name":{"type":"string","nullable":true},"status":{"type":"string"},"expires_at":{"type":"string","nullable":true,"format":"date"}}}},"disambiguate_with":{"type":"object","nullable":true,"description":"The parameter and values that resolve this ambiguity.","properties":{"param":{"type":"string","enum":["license_class"]},"options":{"type":"array","items":{"type":"string"}}}},"expires_at":{"type":"string","nullable":true,"format":"date"},"holder_name":{"type":"string","nullable":true},"license_type":{"type":"string","nullable":true},"source":{"type":"string","description":"Identifier of the board or roster consulted."},"last_verified_at":{"type":"string","format":"date-time"},"cache_age_hours":{"type":"number","description":"Age of the cached record. Most lookups are cache hits by design - one upstream fetch serves every customer asking about the same licence."},"provenance":{"type":"object","description":"Where the answer came from, on every v1 response.","properties":{"source":{"type":"string"},"source_url":{"type":"string"},"method":{"type":"string"},"data_as_of":{"type":"string","format":"date-time"},"retrieved_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/verify/bulk":{"post":{"operationId":"postVerifyBulk","tags":["Verification"],"summary":"Verify up to 50 licences synchronously","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"profession":{"type":"string","minLength":2,"maxLength":40},"state":{"type":"string","pattern":"^[A-Za-z]{2}$"},"license_number":{"type":"string","minLength":1,"maxLength":80},"license_class":{"type":"string","minLength":2,"maxLength":64}},"required":["profession","state","license_number"],"additionalProperties":false},"minItems":1}},"required":["items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/verify/coverage":{"get":{"operationId":"getVerifyCoverage","tags":["Verification"],"summary":"List supported profession and state combinations","description":"Each row reports the backing source, its operational status, and data freshness.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/verify/usage":{"get":{"operationId":"getVerifyUsage","tags":["Verification"],"summary":"Usage for the calling key in the current period","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/verify/batch":{"post":{"operationId":"postVerifyBatch","tags":["Batch"],"summary":"Submit an asynchronous batch job","description":"Job size is plan-gated. Items are persisted individually, so a restart resumes rather than restarting the job.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"profession":{"type":"string","minLength":2,"maxLength":40},"state":{"type":"string","pattern":"^[A-Za-z]{2}$"},"license_number":{"type":"string","minLength":1,"maxLength":80}},"required":["profession","state","license_number"],"additionalProperties":false},"minItems":1}},"required":["items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/verify/batch/{id}":{"get":{"operationId":"getVerifyBatchById","tags":["Batch"],"summary":"Batch job status","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Batch job id returned at submission."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/verify/batch/{id}/results":{"get":{"operationId":"getVerifyBatchByIdResults","tags":["Batch"],"summary":"Batch job results","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Batch job id returned at submission."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/screen":{"get":{"operationId":"getScreen","tags":["Exclusion screening"],"summary":"Screen one identity against exclusion lists","description":"Supply whichever identifiers you hold. Prior adjudications recorded via /screen/clears are applied when employee_ref is given.","parameters":[{"name":"first_name","in":"query","required":false,"schema":{"type":"string","maxLength":100}},{"name":"last_name","in":"query","required":false,"schema":{"type":"string","maxLength":100}},{"name":"business_name","in":"query","required":false,"schema":{"type":"string","maxLength":200}},{"name":"npi","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{10}$"}},{"name":"dob","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"min_similarity","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":1}},{"name":"employee_ref","in":"query","required":false,"schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/screen/bulk":{"post":{"operationId":"postScreenBulk","tags":["Exclusion screening"],"summary":"Screen many identities in one request","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"first_name":{"type":"string","maxLength":100},"last_name":{"type":"string","maxLength":100},"business_name":{"type":"string","maxLength":200},"npi":{"type":"string","pattern":"^\\d{10}$"},"dob":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"state":{"type":"string","pattern":"^[A-Za-z]{2}$"},"min_similarity":{"type":"number","minimum":0,"maximum":1},"employee_ref":{"type":"string","maxLength":200}},"additionalProperties":false},"minItems":1}},"required":["items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/screen/clears":{"post":{"operationId":"postScreenClears","tags":["Exclusion screening"],"summary":"Record an adjudicated match as cleared","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"employee_ref":{"type":"string","minLength":1,"maxLength":200},"list_source":{"type":"string","minLength":1,"maxLength":40},"record_key":{"type":"string","minLength":1,"maxLength":500},"cleared_by":{"type":"string","minLength":1,"maxLength":200},"reason":{"type":"string","maxLength":2000}},"required":["employee_ref","list_source","record_key","cleared_by"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}},"get":{"operationId":"getScreenClears","tags":["Exclusion screening"],"summary":"List recorded clears","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}},"delete":{"operationId":"deleteScreenClears","tags":["Exclusion screening"],"summary":"Withdraw a recorded clear","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/npi/{npi}":{"get":{"operationId":"getNpiByNpi","tags":["NPI"],"summary":"Look up a provider by NPI","parameters":[{"name":"npi","in":"path","required":true,"schema":{"type":"string"},"description":"Ten-digit National Provider Identifier."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/npi/{npi}/licenses":{"get":{"operationId":"getNpiByNpiLicenses","tags":["NPI"],"summary":"Licences cross-referenced to an NPI","parameters":[{"name":"npi","in":"path","required":true,"schema":{"type":"string"},"description":"Ten-digit National Provider Identifier."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/npi/{npi}/full":{"get":{"operationId":"getNpiByNpiFull","tags":["NPI"],"summary":"Provider record with licences and exclusion screening","parameters":[{"name":"npi","in":"path","required":true,"schema":{"type":"string"},"description":"Ten-digit National Provider Identifier."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/search/licenses":{"get":{"operationId":"getSearchLicenses","tags":["Search"],"summary":"Search licences by name","description":"Returns ranked candidates. A licence number is the only reliable identifier - names are not unique - so results are for a human or a downstream match step to confirm.","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120}},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"profession","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":40}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"min_similarity","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/search/providers":{"get":{"operationId":"getSearchProviders","tags":["Search"],"summary":"Search providers by name","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/monitors":{"post":{"operationId":"postMonitors","tags":["Monitors"],"summary":"Monitor a licence for status changes","description":"Re-verified daily. A change dispatches to email and to any webhook endpoints registered on the account.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"profession":{"type":"string","minLength":2,"maxLength":40},"state":{"type":"string","pattern":"^[A-Za-z]{2}$"},"license_number":{"type":"string","minLength":1,"maxLength":80},"license_class":{"type":"string","minLength":2,"maxLength":64},"display_name":{"type":"string","maxLength":200},"webhook_endpoint_id":{"type":"string","format":"uuid"},"email_enabled":{"type":"boolean"}},"required":["profession","state","license_number"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}},"get":{"operationId":"getMonitors","tags":["Monitors"],"summary":"List monitors","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/monitors/webhook-endpoints":{"post":{"operationId":"postMonitorsWebhookEndpoints","tags":["Monitors"],"summary":"Register a webhook endpoint","description":"Deliveries carry X-Webhook-Timestamp and X-Webhook-Signature, an HMAC over `${timestamp}.${body}` using the endpoint secret. The secret is shown once. Ten consecutive failures disable the endpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2000},"description":{"type":"string","maxLength":500},"events":{"type":"array","items":{"type":"string","maxLength":64},"maxItems":20}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}},"get":{"operationId":"getMonitorsWebhookEndpoints","tags":["Monitors"],"summary":"List webhook endpoints","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/certificates":{"post":{"operationId":"postCertificates","tags":["Certificates"],"summary":"Issue a signed verification certificate","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"profession":{"type":"string","minLength":2,"maxLength":40},"state":{"type":"string","pattern":"^[A-Za-z]{2}$"},"license_number":{"type":"string","minLength":1,"maxLength":80}},"required":["profession","state","license_number"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}},"get":{"operationId":"getCertificates","tags":["Certificates"],"summary":"List certificates","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}},"/api/v1/certificates/{id}":{"get":{"operationId":"getCertificatesById","tags":["Certificates"],"summary":"Fetch one certificate","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Certificate id returned at issuance."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}},"503":{"description":"An upstream board could not be reached. Returned with Retry-After rather than serving stale data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"},"description":"Present on validation failures."}}}}}}}}}}}