Create a task
POST /create-task: every request field, the two server-side defaults, and the per-payer special cases.
POST /create-taskQueues one eligibility check and returns immediately with a task id. The portal work happens afterwards; nothing about the patient's coverage is known when this call returns.
Request
Prop
Type
Only tpa_name is really required
The handler reads the body key by key rather than validating it as a whole, so a missing
id_value is not rejected: the check simply runs with nothing to search for and fails later. Send
tpa_name, id_type, id_value and visit_type on every request and you will not meet this.
Sample not captured yet
create-task/single will be filled in once the sample capture pass has run against a completed production task.Response
Prop
Type
organization_api_task_db is internal bookkeeping that predates this API. It
carries the same id as task_id; you can ignore the whole object.
Choosing an identifier
Send exactly one identifier, and tell the API which kind it is with id_type.
Support varies by payer; the TPA matrix has the per-payer list.
Emirates ID
The default, and the only identifier every payer accepts.
{ "id_type": "EMIRATESID", "id_value": "784-0000-0000000-0" }The value must start with 784. This is checked before the task is created, so
a bad prefix costs you nothing:
Sample not captured yet
create-task/error-400-bad-eid will be filled in once the sample capture pass has run against a completed production task.Hyphens are accepted. Nothing else about the format is validated at create
time: a well-formed but non-existent Emirates ID will be accepted, run, and
come back as member_not_found.
Member ID or card number
{ "id_type": "CARDNUMBER", "id_value": "MBR-0000000" }Use this when the patient has their insurance card but their Emirates ID is not
linked at the payer. AXA (INS010) expects the full seven-segment card number
here; most other payers accept the member id as printed.
Two rules govern it, and neither is enforced at create time:
- The payer has to support it. Only some payers can search on a card number; the rest treat whatever you send as an Emirates ID and find nobody. The TPA matrix marks which is which.
- A search-all accepts it. Prefer the Emirates ID for a sweep when you have one. See Search-all, member ID below.
DHA member ID
{ "id_type": "DHAMEMBERID", "id_value": "0000000000" }The regulator-issued member id. Supported by NAS, Neuron, Nextcare, Al Madallah, MedNet, AXA, NGI and Lifeline.
Policy number
{ "id_type": "POLICYNUMBER", "id_value": "POL-0000000" }Supported by Nextcare and Lifeline only. Least reliable of the four: a policy number can match several members, and the portal will pick one.
Some payers overrule you
Al Madallah inspects the shape of id_value and may reclassify it, so a value sent as
CARDNUMBER can be looked up as a DHA member id. The result tells you what was actually used.
Single TPA versus search all
If you know the payer, name it. If you do not, send one of three sentinels and the platform will ask the aggregators first and then fan out across every payer your clinic has credentials for.
tpa_name | What it does |
|---|---|
DHPO | Asks the DHPO / eClaim aggregator, then fans out. |
RIYATI | Asks the Riyati aggregator, then fans out. |
BOTH | Asks both aggregators, then fans out. The usual choice. |
Daman is never part of a search-all. If the patient may be on Daman you have to
ask for INS026, TPA023, D004, D002 or INS078 by name.
Prefer an Emirates ID for a search-all
A sentinel accepts any id_type and the sweep runs either way. The Emirates ID is the better
identifier here whenever you have one, because it is the only identifier every payer accepts, so
the search has the most to match on. If the patient has only their card, send that: you will still
get an answer.
A search-all create response carries two extra keys:
Sample not captured yet
create-task/search-all will be filled in once the sample capture pass has run against a completed production task.From there the flow is the same, except that you watch
search_all_status rather than status, and the
result carries aggregated_results instead of eligibility_result.
Visit type
visit_type defaults to OUTPATIENT. Each payer accepts its own list and
nothing is validated at create time, so an unsupported value produces a task
that runs and then fails at the portal. The TPA matrix has every
accepted value per payer.
Two payers deserve a note:
- MedNet (
TPA036) encodes the consultation type and the benefit in this one field. A bare benefit token means outpatient plus that benefit (DENTAL= outpatient dental); prefix it withINPATIENT_for the inpatient variant. - Daman uses a much longer service taxonomy (consultation reasons, ultrasound trimesters, PCSP screening packages) rather than the usual inpatient / outpatient split.
Optional patient fields
name, dob and phone are optional and are used only by payers whose portal
search needs more than an identifier, or which print them onto a generated
claim form. Sending them costs nothing and occasionally rescues a lookup that
would otherwise fail.
doctorId matters only where the check generates a claim form. FMC (TPA010)
is the clearest case. Sending it on every check is fine: payers that do not need
it ignore it. Note the camelCase: it is the one field on this endpoint that is
not snake_case.
It is the clinician's professional licence ID, the one issued by DHA, Riayati or Shafafiya. You hold the mapping from your clinicians to their licence IDs on your side; there is no endpoint here that returns it. A name you compose yourself will not match the portal's physician list, and at an Abu Dhabi practice a failed match fails the check rather than falling back.
doctorName is the same field, still accepted
This field was originally called doctorName, which is why you will meet that spelling in older
integrations and in anything the Mozart extension sends. It always carried the id, never a name.
Both keys are accepted and mean the same thing; if you send both, doctorId wins. New
integrations should send doctorId.
extra_args
A free-form object for per-payer extras. Nothing in it is validated, so a
misspelled key is accepted, the check runs, and the payer answers a question you
did not mean to ask. The server also adds its own request_start_time key to
whatever you send, so do not rely on getting the object back unchanged.
Every extra is an ordinary key on the object:
{
"extra_args": {
"maternity_treatment": true,
"is_member_present_at_the_facility": true
}
}The older title / value pair still works
maternity_treatment used to be readable only as a title naming the extra plus a value
answering it, and the key was ignored. The key is now read first, and the pair is still accepted
unchanged, so existing integrations do not have to move. Send one or the other; if you send both,
the key wins. Build new integrations against the key.
The documented extras today:
| 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 |
Worked combinations
Every combination below returns 200 and creates a task. Only the answer tells them apart, so they are worth reading before you meet one in production. The Try it walkthrough flags each of them as you build a request, and Payer-specific requirements collects them on one page you can send from the browser.
Named payer, Emirates IDSend this
The baseline every other example is a delta from. The 784 prefix is checked before the task is created, so a mistyped ID costs you nothing.
{
"tpa_name": "TPA004",
"id_type": "EMIRATESID",
"id_value": "784-0000-0000000-0",
"visit_type": "OUTPATIENT"
}Search-all, Emirates IDSend this
When you do not know the payer. The create response carries is_search_all and search_all_status, and the result carries aggregated_results instead of eligibility_result. Daman is never in the fan-out.
{
"tpa_name": "BOTH",
"id_type": "EMIRATESID",
"id_value": "784-0000-0000000-0",
"visit_type": "OUTPATIENT"
}Named payer, member ID or card numberSend this
The retry when the Emirates ID is not linked at the payer yet, which is common for a newly issued card or a dependant added mid-policy. Only the payers whose scraper reads id_type can do this; the TPA matrix lists them.
{
"tpa_name": "TPA004",
"id_type": "CARDNUMBER",
"id_value": "MBR-0000000",
"visit_type": "OUTPATIENT"
}Search-all, member ID or card numberWorth knowing
Accepted, and the sweep runs. Reach for it when you do not know the payer and the patient has their card but not their Emirates ID. Send the Emirates ID instead when you have one: it is the only identifier every payer accepts, so a sweep has the most to match on. Daman is never included in a search-all whichever identifier you send.
{
"tpa_name": "BOTH",
"id_type": "CARDNUMBER",
"id_value": "MBR-0000000",
"visit_type": "OUTPATIENT"
}Daman, where visit_type is not inpatient or outpatientNeeds a payer-specific value
Every other payer takes some variation of OUTPATIENT and INPATIENT. Daman takes a service taxonomy instead: consultation reasons, ultrasound trimesters, dental fee models, and two flows that are not visits at all (VALIDITY_CHECK and BABY_FLOW). Nothing is validated at create time, so OUTPATIENT is accepted here and then fails at the portal. Pick the value from the Daman row of the TPA matrix.
{
"tpa_name": "TPA023",
"id_type": "EMIRATESID",
"id_value": "784-0000-0000000-0",
"visit_type": "CONSULTATION_ELECTIVE"
}Maternity at NAS or NeuronNeeds a payer-specific value
Both payers ask whether the maternity treatment is inpatient, and nothing makes you answer. Omitting maternity_treatment is not an error: the portal answers as though you had said no, and you get outpatient maternity cover back without being told.
{
"tpa_name": "TPA004",
"id_type": "EMIRATESID",
"id_value": "784-0000-0000000-0",
"visit_type": "MATERNITY",
"extra_args": {
"maternity_treatment": true,
"is_member_present_at_the_facility": true
}
}mode and test_mode
The handler reads two further keys, mode (default "prod") and test_mode
(default false).
Do not send these yet
They are accepted, but what they do downstream is not settled enough to be documented as a contract. Leave them out; they will be specified here or removed once the behaviour is confirmed with the API owner.
When a check comes back empty
Three situations look like a failure but are really a hint to retry differently.
Send BOTH. It costs more wall-clock time than a direct check but it is the only way to discover
coverage you were not told about, and Daman aside it covers everything your clinic has credentials
for.
A newly issued card, or a dependant added mid-policy, often is not searchable by Emirates ID yet.
Retry with CARDNUMBER and the member id from the card, against a named payer: a card number sent
to BOTH is searched as an Emirates ID and finds nobody.
An expired policy returns found with is_eligible: false and a failure_reason, not
member_not_found. Re-running the same check will not change that; you need a current card.
Errors
Sample not captured yet
create-task/error-400-no-tpa will be filled in once the sample capture pass has run against a completed production task.See Errors for the full list.