Create a check
POST /v4/eligibility-checks: the body, the response, and the per-payer extra_args.
POST /v4/eligibility-checks starts a check and returns its id straight away. The check then runs
in the background (usually under a minute). Poll it with GET /v4/eligibility-checks/{id}.
| Field | Required | Notes |
|---|---|---|
tpa_name | Yes | Payer or TPA code, e.g. INS026 (Daman), TPA004 (NAS). Send DHPO, RIYATI, BOTH or SEARCH_ALL to search every payer. |
identifiers | Yes | 1 to 5 IDs for the patient, each {"id_type": ..., "id_value": ...}. One ID is a one-entry list. See Several IDs for one patient. |
visit_type | Yes | e.g. OUTPATIENT. Allowed values depend on the payer; some payers need an empty string "". See Visit types by payer. |
name, dob, phone | No | Help the payer find the right member. |
doctorId, doctorName | Yes for INS026, D004, INS078 and TPA023; no for other payers | A value and label from GET /v4/doctors. Daman and Thiqa checks without either are rejected with 400 MISSING_REQUIRED_FIELD. |
payerName | No | The payer being billed, when a TPA serves several. |
extra_args | No | Per-payer options, the same keys as v3. See extra_args. |
In each identifiers entry, id_type is EMIRATESID, CARDNUMBER, DHAMEMBERID or POLICYNUMBER.
Each payer accepts only some of these. Send a member number (not a DHA member id) as CARDNUMBER.
An Emirates ID must be 784-YYYY-NNNNNNN-N or 15 digits starting 784.
Any other field is rejected with 422. That includes id_type and id_value at the top level of the
body: put them inside identifiers.
doctorId,doctorNameandpayerNamemay also be sent asdoctor_id,doctor_nameandpayer_name.tpa_name,id_typeandvisit_typeare not case-sensitive:tpa002is read asTPA002.
Example
curl -X POST "$HOST/v4/eligibility-checks" \
-H "X-Api-Key: Bearer $API_KEY" \
-H "X-Clinic-Id: $CLINIC_ID" \
-H "X-Client-ID: $TENANT" \
-H "Content-Type: application/json" \
-d '{"tpa_name": "INS026", "identifiers": [{"id_type": "EMIRATESID", "id_value": "784-1990-1234567-1"}], "visit_type": "OUTPATIENT", "doctorName": "DHA-P-0000000", "name": "Patient Name"}'Response: 201
{ "id": "3f6c2a9e-...", "status": "IN_QUEUE", "is_search_all": false, "search_all": null }For a search across all payers, is_search_all is true and search_all holds the search's
progress at creation:
{
"id": "3f6c2a9e-...",
"status": "IN_QUEUE",
"is_search_all": true,
"search_all": { "total_tpas": null, "completed_tpas": 0, "status": "SEARCH_ALL_PROCESSING" }
}total_tpas is null because the payers to search are not known yet. The GET does not repeat
this object: poll the check the same way as any other. It finishes when every payer has answered.
If a payer does not accept your id_type or visit_type, you get 400 VALIDATION_FAILED, with
every problem listed in details. Nothing is started. One exception: when no ID in identifiers is
usable, the 400 names only the ID problems. Fix them and resend to see anything else.
extra_args
v4 passes extra_args to the payer exactly as v3 does, so the keys, shapes and defaults are the
ones on Create a task. Nothing in it is validated: a misspelled key
is accepted and ignored. Every key is optional; the last column is what you get when you leave it out.
| Extra | Shape | Payers | Omitted |
|---|---|---|---|
maternity_treatmentAnswers the portal’s "Is IP Maternity" question. Send it whenever visit_type is MATERNITY: omitting it is not an error, it silently checks outpatient maternity cover. | "maternity_treatment": true | false | TPA001, TPA004 | the portal answers as though you had said no |
is_member_present_at_the_facilitySets the portal’s member-presence radio. Optional; the check runs either way, but some plans price a not-present encounter differently. | "is_member_present_at_the_facility": true | false | TPA001, TPA004 | the portal is told the member is present |
exception_caseTicks the portal’s exception checkbox, which submits the check without a referral. Absent means true, so send false when you want the portal’s own referral list searched and a real referral attached. | "exception_case": true | false | TPA001, TPA004 | the portal’s bypass checkbox is ticked and no referral is resolved |
referral_document_urlA fetchable URL to the referral letter. The scraper downloads it and attaches it on the portal’s referral upload field. | "referral_document_url": | TPA001, TPA004 | no referral document is uploaded |
referring_physicianThe clinician who referred the patient. NAS and Neuron match it against the portal’s referring-physician list; Daman sends it as referralClinicianLicense, and only on a referral consultation. | "referring_physician": | TPA001, TPA004, TPA023, INS026, INS078, D002, D004 | no referring clinician is recorded on the check |
referring_departmentThe department that referred the patient, matched against the portal’s referral list on gatekeeper plans. Ignored on every other plan, so sending it always is safe. | "referring_department": | TPA002 | a gatekeeper plan completes with a warning and no referral selected |
service_typeThe service the claim form is raised for. The value is typed into the portal’s service search, so it has to read as the portal spells it. | "service_type": "Consultation GP" | "Consultation Specialist" | TPA029, TPA037 | the claim form is filled with Consultation GP |
use_dentalRuns AXA’s dental flow. Compared against the exact string "YES", so send that and not a boolean. visit_type: "DENTAL" on its own does nothing here. | "use_dental": "YES" | "NO" | INS010 | the ordinary non-dental flow runs, whatever visit_type says |
referral_codeThe payer’s own referral code, typed into the Aafiya portal’s referral field. Only useful when the patient arrives with one. | "referral_code": | TPA026 | the portal’s referral code field is left blank |
visit_categoryADNIC’s consultation-request category. Unlike every other extra, a value outside this list fails the check rather than being ignored. | "visit_category": "FIRST_VISIT" | "VISIT_WITHOUT_REFERRAL" | "VISIT_WITH_REFERRAL" | INS017 | the consultation request is submitted as FIRST_VISIT |
use_metlifeSwitches the MedNet portal to MetLife before the search. Send "YES" as a string; anything else falls back to MedNet. | "use_metlife": "YES" | "NO" | TPA036 | the member is looked up in MedNet’s own book |
use_dubaicareSwitches the MedNet portal to DubaiCare before the search. Ignored when use_metlife is "YES", which is checked first. | "use_dubaicare": "YES" | "NO" | TPA036 | the member is looked up in MedNet’s own book |
is_emergencyTicks MedNet’s emergency registration. Independent of visit_type, which at MedNet carries the consultation type and benefit instead. | "is_emergency": true | false | TPA036 | the encounter is registered as an ordinary visit |
is_podMarks the encounter as a POD dispense. Send pod_id with it; the product refuses to submit a POD check without one. | "is_pod": true | false | TPA023, INS026, INS078, D002, D004 | isPOD is left off the payload entirely, which is not the same as false |
pod_idThe point-of-dispense identifier. Meaningless without is_pod: true, and a POD check without it is what the product blocks at the form. | "pod_id": | TPA023, INS026, INS078, D002, D004 | podId is left off the payload |
is_maternityFlags the encounter as maternity. Only applied when the doctor licence on the request resolves to a maternity specialty, so send doctorId alongside it or it is silently dropped. | "is_maternity": true | false | TPA023, INS026, INS078, D002, D004 | isMaternity is left off the payload |
free_followup_or_extended_followupPre-answers Daman’s follow-up business rules so a blocked check retries as a follow-up or extended follow-up visit. Checked before not_related_to_chief_complaint. | "free_followup_or_extended_followup": true | false | TPA023, INS026, INS078, D002, D004 | a business-rule violation ends the check instead of being answered |
not_related_to_chief_complaintPre-answers the same rules as a visit for a different chief complaint. Ignored when free_followup_or_extended_followup is also true. | "not_related_to_chief_complaint": true | false | TPA023, INS026, INS078, D002, D004 | a business-rule violation ends the check instead of being answered |
Three keys are reserved in v4. Sending any of them is 422 VALIDATION_FAILED, and nothing is started:
| Key | Why |
|---|---|
identifiers | Send several IDs in the top-level identifiers field instead. |
request_credentials | v4 does not take portal logins on the request; checks run on the logins Mantys holds. |
request_credentials_only | Same as above. |
On POST /v4/appointment-checks, a submitter key is overwritten by the top-level submitter field
when you send one.