Skip to main content
This endpoint is available after the verification of benefits requests backend release is enabled in your environment. Check your environment’s API reference before integrating.
Use POST /v1/verification-of-benefits-requests to set up a patient’s verification in one asynchronous call. Upload the insurance cards using the Files API first, then send their IDs with the patient and any coverage you already know. Solum:
  1. matches the patient to an existing one, or creates them, as POST /v1/patients/upsert does;
  2. stores the coverage you sent;
  3. reads the insurance cards, completes and corrects the patient’s coverage from them, and adds a coverage for a card that matches none;
  4. opens a verification of benefits (VOB) for every active policy of the patient — including coverage the patient already had — and, when it opened one, moves the patient to your Needs VOB stage unless the patient is already on a stage that verifies insurance.

Submit a request

The server returns 202 Accepted and a Location header pointing to the request. Acceptance means the request was saved; processing happens afterwards.

Request body

What you send wins over what a card says. A card fills only the fields you left out, and a card that disagrees with a member_number or insurance_id you sent is skipped (conflicts_with_request) rather than applied. An insurance_id you send is never changed. An insurance you send as insurance_name is different: a card with the same member ID can correct it to the insurance the card names (source both). The workflow stage is not sent: the patient moves to your Needs VOB stage when a VOB is opened, unless the patient is already on a stage that verifies insurance. A coverage you send without member_number (or with a blank one) is completed as follows. When the patient already has exactly one policy on that insurance, and no other coverage in your request names that insurance, the coverage is that policy (unless you send an external_id that policy does not hold), and a card with another member ID may then correct it. Otherwise the member number is taken from the card of that insurance. With no such card the coverage is skipped as no_member_number; with cards carrying several member IDs for that insurance and not exactly one printed with the coverage’s tier, as ambiguous.

Poll for the result

Poll every few seconds, increasing the interval for requests that take longer. Reading the cards may take several minutes. Stop polling at either terminal state. A completed request lists IDs and codes only, never patient data:
patient.action is created, updated or matched (found, nothing changed). Each entry of policies is one of the patient’s active policies, or one input that was not stored: source is request, card or both, and null for a policy nothing in the request named. both means your data and a card both contributed, whatever the action: a created policy with source both may be one where a card corrected the insurance you named. A skipped entry’s reason is one of unresolved_payer (no insurance of yours, ready for verification, matched the name or the card), ambiguous, no_member_number, tiers_full (the patient has four coverages already), conflicts_with_request (a card disagreed with a member_number or insurance_id you sent), duplicate_policy, external_id_taken or not_saved. Identical cards count once. ambiguous covers three situations: several of your insurances matched a name you sent; a coverage you sent without member_number whose insurance has several member IDs on the cards and no single one printed with its tier; or a card Solum cannot place on one policy — the patient has two or more policies on the card’s insurance and the card doesn’t say which (neither its member ID nor a printed tier picks one), the card’s member ID is on more than one of the patient’s policies, or several cards compete for one policy. Solum leaves the policies as they are and reports the coverage or the card as skipped. Each entry of verifications is one active policy: opened (a VOB was opened), already_open (the policy has an open VOB; id names it) or not_requested (none could be: reason is no_service_type when no specialty is configured, specialties_unresolved when none resolved). left_out lists specialties that could not be requested — the VOB is opened with the rest, its entry’s reason is specialties_unresolved, and the VOB carries a comment from Solum saying what is missing. A failed request:
A failed request is terminal. To correct it, submit a new request with a new Idempotency-Key.

Errors at submission

Invalid input is rejected synchronously and nothing is stored:

Retry submissions safely

Idempotency-Key is optional and scoped to your company. Repeating the same key and body returns the original request and its current status; the same key with a different body returns 409. Use the same key when retrying after a network timeout. Without a key, every submission is a new request. Completion is available through polling; there is no completion webhook. The usual webhooks still fire: patient_created or patient_updated, vob_created for each VOB opened, and patient_insurance_verification when the request moves the patient to your Needs VOB stage and that stage verifies insurance. A patient kept on your Missing Information stage by another VOB is not moved. The comments Solum adds on a VOB — the specialties it left out, or that the request changed a policy whose VOB waits on missing information — do not trigger a vob_comment_created webhook or its emails.