VeriFi API Documentation
The VeriFi Eligibility Verification API enables real-time insurance eligibility checks across 600+ PPO payers. One REST call returns structured eligibility data, plan details, and benefits breakdowns in under 500ms.
Quick Start
- Create an account at /dashboard to register your application.
- Get your API key from the dashboard under Settings → API Keys.
- Make your first call using the example below.
TEST member ID prefix in test mode to receive simulated eligible responses without hitting real payer systems. See Test Mode for details.
Authentication
All authenticated endpoints require an API key. You can pass it in one of two ways:
Option 1: Authorization Header (Recommended)
Option 2: X-API-Key Header
API keys are prefixed with vf_live_ for production and vf_test_ for test mode. Keep your keys secret. Do not expose them in client-side code, public repositories, or browser requests.
401 Unauthorized within 60 seconds.
Base URL
All API requests should be made to:
All requests must use HTTPS. HTTP requests will be rejected with a 301 redirect. TLS 1.2 or higher is required.
Rate Limits
Default rate limits apply to all API keys. If you need higher limits, contact us through the dashboard.
| Limit | Default | Description |
|---|---|---|
| Per-minute | 60 requests | Rolling 60-second window |
| Per-day | 1,000 requests | Resets at midnight UTC |
Rate Limit Headers
Every response includes headers to help you track your usage:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests allowed in the current window |
| X-RateLimit-Remaining | Number of requests remaining in the current window |
| Retry-After | Seconds until the rate limit resets (only present on 429 responses) |
429 response. Use the Retry-After header value as the minimum wait time before retrying.
Test Mode
Test mode lets you develop and test your integration without making real payer calls. Use special member_id prefixes to control the simulated outcome:
| Prefix | Behavior | Example |
|---|---|---|
| TEST* | Always returns eligible with sample plan data | TEST123456 |
| FAIL* | Always returns ineligible | FAIL789012 |
| ERR* | Simulates a payer timeout (502 response) | ERR345678 |
Test mode requests do not count against your daily rate limit, but they do count against the per-minute limit. Test mode responses include "mode": "test" in the response body.
Run a real-time eligibility verification against a payer. Returns structured eligibility status, subscriber information, plan details, and benefits breakdown.
Request Body
| Parameter | Type | Description |
|---|---|---|
| member_idrequired | string | The member/subscriber ID from the insurance card. In test mode, use TEST*, FAIL*, or ERR* prefixes. |
| payer_coderequired* | string | The VeriFi payer code (e.g., BCBS, AETNA, UHC). See GET /payers for the full list. *Either payer_code or provider is required. |
| providerrequired* | string | Alias for payer_code. Accepts the same values. *Either payer_code or provider is required. |
| first_namerequired | string | Subscriber's first name as it appears on the insurance card. |
| last_namerequired | string | Subscriber's last name as it appears on the insurance card. |
| date_of_birthrequired | string | Subscriber's date of birth in YYYY-MM-DD format. |
| service_typeoptional | string | Service type code for benefit-specific lookups (e.g., 30 for mental health, 47 for hospital). Defaults to 30 (general health benefit). |
| provider_npioptional | string | 10-digit National Provider Identifier. When provided, the response includes network status for the given provider. |
Example Request
Example Response
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for this request. Use for support inquiries. |
| eligible | boolean | true if the member has active coverage, false otherwise. |
| status | string | Coverage status: active, inactive, pending, or unknown. |
| transaction_id | string | The EDI 271 transaction control number from the payer. |
| subscriber | object | Subscriber details as returned by the payer (name, member ID, DOB, relationship). |
| payer | object | Payer identification (code, name, payer_id). |
| plan | object | Plan details (name, type, group number, effective/termination dates). |
| benefits | object | Structured benefits: deductible, out-of-pocket max, copay, and coinsurance. Amounts in USD. |
| service_type | string | The service type code used for this verification. |
| verification_date | string | ISO 8601 timestamp of when the verification was performed. |
| mode | string | live for production verifications, test for test mode. |
| response_time_ms | number | Server-side response time in milliseconds. |
Error Responses
Returns the full list of supported payer codes. This endpoint is public and does not require authentication. Use it to populate a payer dropdown in your UI or to validate payer codes before making eligibility requests.
Example Request
Example Response
Response Fields
| Field | Type | Description |
|---|---|---|
| payers | array | Array of payer objects. |
| payers[].code | string | The payer code to use in eligibility requests. |
| payers[].name | string | Human-readable payer name. |
| payers[].payer_id | string | X12 payer identifier. |
| payers[].status | string | active or degraded. Degraded payers may have slower response times. |
| total | number | Total number of supported payers. |
Returns a paginated list of your recent eligibility verifications. Useful for building verification history views, audit logs, and debugging past requests.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| limitoptional | integer | Number of records to return. Default: 20. Max: 100. |
| offsetoptional | integer | Number of records to skip for pagination. Default: 0. |
Example Request
Example Response
request_id from this list. PHI fields are hashed in the history view.
Returns usage statistics for your API key, including request counts, rate limit status, and daily usage for the current billing period.
Example Request
Example Response
Response Fields
| Field | Type | Description |
|---|---|---|
| api_key_id | string | Your API key identifier (not the full key). |
| plan | string | Your current plan: starter, professional, or enterprise. |
| rate_limits | object | Your configured rate limits (per_minute, per_day). |
| usage.today | object | Today's request counts (total, successful, failed, remaining against daily limit). |
| usage.this_month | object | Current billing period totals (total, successful, failed). |
| current_minute | object | Requests in the current rolling 60-second window and remaining capacity. |
Error Codes
All errors follow a consistent format. The top-level error object always includes a machine-readable code and a human-readable message. Some errors include additional context fields.
HTTP Status Codes
| Status | Code | Description | Action |
|---|---|---|---|
| 400 | validation_error |
Request body failed validation. Check the details array for specific field errors. |
Fix the request body and retry. |
| 401 | unauthorized |
API key is missing, invalid, or revoked. | Check your API key in the Authorization header or X-API-Key header. |
| 403 | forbidden |
API key does not have permission for this resource. | Check your plan limits or contact support. |
| 404 | not_found |
The requested resource does not exist. | Check the URL path. |
| 422 | unprocessable_entity |
The request was valid but the payer returned no matching subscriber. | Verify the member ID and subscriber details match the insurance card exactly. |
| 429 | rate_limit_exceeded |
Too many requests. Check the Retry-After header. |
Wait for the specified duration and retry with exponential backoff. |
| 500 | internal_error |
An unexpected error occurred on our end. | Retry after a brief delay. If persistent, contact support with the request_id. |
| 502 | payer_unavailable |
The payer's system is unreachable or timed out. | Retry after 30-60 seconds. Consider using cached results if available. |
| 503 | service_unavailable |
VeriFi is temporarily unavailable for maintenance. | Retry after the time specified in the Retry-After header. |
HIPAA Compliance
VeriFi is designed from the ground up for HIPAA-compliant healthcare data processing. Here is how we handle Protected Health Information (PHI):
Data Handling
- PHI hashing: All personally identifiable fields (member_id, first_name, last_name, date_of_birth) are hashed using SHA-256 before storage. The original plaintext values are used only for the real-time payer transaction and are never persisted.
- No plaintext storage: VeriFi does not store plaintext PHI in any database, log file, or cache. Verification history records contain only hashed identifiers and structured response data.
- TLS required: All API traffic must use HTTPS with TLS 1.2 or higher. HTTP requests are rejected, not redirected. This ensures PHI is encrypted in transit.
- Encryption at rest: All stored data is encrypted at rest using AES-256-GCM.
Audit Logging
- Every API request is logged with a unique
request_id, timestamp, API key identifier, and response status. - Audit logs are immutable and retained for 7 years per HIPAA requirements.
- Logs never contain plaintext PHI. All patient identifiers in logs are SHA-256 hashed.
Access Controls
- API keys are scoped per-application. Each key has independent rate limits and access logs.
- Key rotation is available in the dashboard. Revoked keys become invalid within 60 seconds.
- There is no cross-account data access. Each API key can only retrieve its own verification history.