Embeddable Credentialing API

Build Credentialing Into Your Platform

RESTful API with webhook support. Verify credentials, track enrollments, and monitor compliance — all from your own application.

REST
JSON API
v1
Current Version
99.9%
Uptime SLA
Webhooks
Real-Time Events

Quick Start

Get up and running with the Credentik API in under 5 minutes.

Base URL

https://api.credentik.com/v1

1. Get your API key

Request an API key from your Credentik dashboard under Settings → API & Integrations, or email api@credentik.com.

2. Make your first request

# List all providers in your organization curl -X GET https://api.credentik.com/v1/providers \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json"
const response = await fetch('https://api.credentik.com/v1/providers', { headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' } }); const { data } = await response.json(); console.log(data); // [{ id, npi, first_name, last_name, ... }]
import requests response = requests.get( "https://api.credentik.com/v1/providers", headers={"Authorization": f"Bearer {API_KEY}"} ) data = response.json()["data"] print(data) # [{"id": ..., "npi": ..., "first_name": ...}]

3. Response format

{ "data": [...], // Result array or object "meta": { "total": 42, "page": 1, "per_page": 25, "last_page": 2 } }

Authentication

All requests require a Bearer token in the Authorization header.

Authorization: Bearer ck_live_a1b2c3d4e5f6...
Key PrefixEnvironmentDescription
ck_live_ProductionFull access to live data. Use in production environments only.
ck_test_SandboxTest environment with mock data. No real verifications run.
Security: Never expose API keys in client-side code. Use your backend as a proxy for browser-based integrations, or use our embeddable widgets which handle auth via secure embed tokens.

Providers

GET /v1/providers List all providers ▾

Returns a paginated list of providers in your organization.

QUERY PARAMETERS
ParameterTypeDescription
pageintegerPage number (default: 1)
per_pageintegerResults per page, max 100 (default: 25)
searchstringFilter by name or NPI
statusstringFilter: active, inactive, pending
facility_idstringFilter by facility
RESPONSE
{ "data": [{ "id": "prv_a1b2c3", "system_id": "3F7A2B", "npi": "1234567890", "first_name": "Jane", "last_name": "Smith", "credentials": "MD", "specialty": "Psychiatry", "email": "jane.smith@example.com", "status": "active", "psv_score": 92, "exclusion_status": "clear", "created_at": "2026-01-15T10:30:00Z" }], "meta": { "total": 47, "page": 1, "per_page": 25 } }
GET /v1/providers/:id Get single provider ▾

Returns the full profile for a single provider, including licenses, DEA, and verification status.

{ "data": { "id": "prv_a1b2c3", "npi": "1234567890", "first_name": "Jane", "last_name": "Smith", "credentials": "MD", "specialty": "Psychiatry", "taxonomy_code": "2084P0800X", "licenses": [{ "state": "CA", "number": "A123456", "status": "active", "expiration_date": "2027-06-30", "verified": true, "verified_at": "2026-03-01T08:00:00Z" }], "dea": { "number": "FS1234567", "expiration_date": "2027-12-31", "schedules": ["II", "III", "IV", "V"] }, "psv_score": 92, "exclusion_status": "clear", "portable_profile_url": "https://app.credentik.com/profile/3F7A2B" } }
POST /v1/providers Create a provider ▾

Creates a new provider record. If an NPI is provided, credential data is auto-populated from NPPES.

BODY PARAMETERS
ParameterTypeDescription
npi REQUIREDstring10-digit NPI number
first_namestringAuto-populated from NPI if omitted
last_namestringAuto-populated from NPI if omitted
emailstringProvider email address
facility_idstringAssign to a facility
auto_verifybooleanRun PSV immediately after creation (default: false)
PUT /v1/providers/:id Update a provider ▾

Update provider fields. Partial updates supported — only send the fields you want to change.

GET /v1/providers/:id/profile Get portable profile ▾

Returns a shareable, read-only credential profile with verification statuses, licenses, DEA, exclusion screening results, and payer enrollments.

Applications (Payer Enrollment)

GET /v1/applications List credentialing applications ▾

Returns all payer enrollment applications with status, payer, provider, and timeline data.

QUERY PARAMETERS
ParameterTypeDescription
provider_idstringFilter by provider
payer_idstringFilter by payer
statusstringnot_started, in_progress, submitted, approved, denied
facility_idstringFilter by facility
RESPONSE
{ "data": [{ "id": "app_x7y8z9", "provider_id": "prv_a1b2c3", "payer_name": "Aetna", "status": "submitted", "submitted_date": "2026-02-15", "effective_date": null, "days_in_status": 31, "facility": "Main Clinic" }] }
POST /v1/applications Create an application ▾

Create a credentialing application for a provider with a specific payer. Use facility_ids[] to batch-create cross-facility applications.

ParameterTypeDescription
provider_id REQUIREDstringProvider to credential
payer_id REQUIREDstringTarget payer
facility_idsarrayBatch create across multiple facilities
application_typestringinitial, revalidation, add_location
PUT /v1/applications/:id Update application status ▾

Update application status, effective date, or notes.

Verifications (PSV)

POST /v1/verifications Run primary source verification ▾

Initiates a primary source verification for a provider. Checks NPI, state licenses, DEA, OIG/SAM exclusions, and board certification against authoritative sources.

ParameterTypeDescription
provider_id REQUIREDstringProvider to verify
sourcesarraySpecific sources: npi, license, dea, oig, sam, board_cert. Defaults to all.
RESPONSE
{ "data": { "id": "ver_m3n4o5", "provider_id": "prv_a1b2c3", "status": "completed", "psv_score": 92, "results": { "npi": { "status": "verified", "source": "NPPES" }, "license": { "status": "verified", "state": "CA", "expiry": "2027-06-30" }, "dea": { "status": "verified", "expiry": "2027-12-31" }, "oig": { "status": "clear" }, "sam": { "status": "clear" }, "board_cert": { "status": "not_found" } }, "verified_at": "2026-03-18T14:30:00Z" } }
GET /v1/verifications/:provider_id Get verification history ▾

Returns the verification history for a provider, including all past PSV runs with scores and source-level results.

Monitoring

GET /v1/monitoring/alerts Get active monitoring alerts ▾

Returns all active credential monitoring alerts across your organization, sorted by severity.

ParameterTypeDescription
severitystringcritical, urgent, warning, info
typestringlicense_expiry, dea_expiry, exclusion, stale_verification, stalled_app
provider_idstringFilter by provider
RESPONSE
{ "data": [{ "id": "alt_p6q7r8", "type": "license_expiry", "severity": "critical", "provider_id": "prv_a1b2c3", "provider_name": "Dr. Jane Smith", "message": "CA medical license expires in 12 days", "details": { "license_state": "CA", "expiration_date": "2026-03-30", "days_remaining": 12 }, "created_at": "2026-03-18T00:00:00Z" }] }
POST /v1/monitoring/scan Trigger a monitoring scan ▾

Triggers an on-demand credential monitoring scan for your organization. Scans run automatically daily, but you can trigger them manually via this endpoint.

Exclusion Screening

POST /v1/exclusions/screen Screen provider against OIG/SAM ▾

Screens a provider against the OIG LEIE and SAM.gov exclusion databases. Returns match status and details.

ParameterTypeDescription
provider_id REQUIREDstringProvider to screen
{ "data": { "provider_id": "prv_a1b2c3", "oig": { "status": "clear", "checked_at": "2026-03-18T14:30:00Z" }, "sam": { "status": "clear", "checked_at": "2026-03-18T14:30:00Z" }, "overall": "clear" } }
POST /v1/exclusions/batch Batch screen all providers ▾

Screens all providers in your organization against OIG/SAM exclusion databases. Runs asynchronously — results are delivered via webhook.

Webhooks

Receive real-time notifications when credential events occur. Configure webhook URLs in your dashboard under Settings → API & Integrations → Webhooks.

Available Events

EventDescription
provider.createdNew provider added
provider.updatedProvider profile changed
application.status_changedCredentialing app status updated
application.approvedApplication approved by payer
verification.completedPSV run completed
verification.failedPSV source returned error/mismatch
monitoring.alertNew monitoring alert generated
exclusion.match_foundProvider flagged in OIG/SAM
license.expiringLicense within 30/60/90 day window

Webhook Payload

{ "event": "application.approved", "timestamp": "2026-03-18T14:30:00Z", "data": { "application_id": "app_x7y8z9", "provider_id": "prv_a1b2c3", "provider_name": "Dr. Jane Smith", "payer": "Aetna", "effective_date": "2026-04-01", "previous_status": "submitted", "new_status": "approved" } } // Webhook requests include a signature header for verification: // X-Credentik-Signature: sha256=a1b2c3d4...
Tip: Webhook payloads include an HMAC-SHA256 signature. Verify the X-Credentik-Signature header against your webhook secret to ensure authenticity.

Embeddable Widgets

Drop credentialing UI into your platform with zero backend work. Widgets use secure embed tokens — no API keys exposed to the browser.

Available Widgets

👤
Provider Status

Show real-time credentialing status, PSV score, and license/exclusion status for a single provider.

📋
Application Tracker

Embed an application timeline showing payer enrollment progress across all facilities.

✅
Verification Badge

A compact badge showing real-time PSV status. Perfect for provider directories and profiles.

Embed Code

<!-- 1. Add the Credentik widget script --> <script src="https://cdn.credentik.com/widget/v1.js"></script> <!-- 2. Add a container for the widget --> <div id="credentik-widget"></div> <!-- 3. Initialize with your embed token --> <script> Credentik.init({ container: '#credentik-widget', token: 'emb_your_embed_token', widget: 'provider-status', providerId: 'prv_a1b2c3', theme: 'dark' // 'light' | 'dark' | 'auto' }); </script>
import { CredentikWidget } from '@credentik/react'; function ProviderProfile({ providerId }) { return ( <CredentikWidget token="emb_your_embed_token" widget="provider-status" providerId={providerId} theme="dark" /> ); }
<!-- Simplest integration — zero JavaScript required --> <iframe src="https://app.credentik.com/embed/provider-status?token=emb_xxx&provider=prv_a1b2c3" width="400" height="300" frameborder="0" style="border-radius:12px;" ></iframe>

Widget Preview

Credentik ✓ Verified
Dr. Jane Smith, MD
NPI: 1234567890 · Psychiatry
PSV Score 92/100
CA License Active
DEA Valid
OIG/SAM Clear
Payer Enrollments 5 Active
Powered by Credentik · Updated 2 min ago

Rate Limits

API rate limits vary by plan. Rate limit headers are included in every response.

100
requests / min (Agency)
1,000
requests / min (Growth)
10
requests / min (Sandbox)

Rate Limit Headers

X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 1710766800

When rate limited, the API returns 429 Too Many Requests with a Retry-After header.

Error Handling

All errors return a consistent JSON structure with an error code and human-readable message.

{ "error": { "code": "validation_error", "message": "The npi field is required.", "details": { "npi": ["The npi field is required."] } } }

HTTP Status Codes

CodeMeaning
200Success
201Created
400Bad Request — invalid parameters
401Unauthorized — invalid or missing API key
403Forbidden — insufficient permissions
404Not Found — resource doesn't exist
422Validation Error — check error details
429Rate Limited — slow down
500Server Error — contact support

Ready to Embed Credentialing?

Get your API key and start integrating provider credentialing into your platform today.