Mantys Eligibility API

Create a task

POST /create-task: every request field, the two server-side defaults, and the per-payer special cases.

POST /create-task

Queues 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_nameWhat it does
DHPOAsks the DHPO / eClaim aggregator, then fans out.
RIYATIAsks the Riyati aggregator, then fans out.
BOTHAsks 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 with INPATIENT_ 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:

ExtraShapePayersOmitted
maternity_treatment
Answers 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 | falseTPA001, TPA004the portal answers as though you had said no
is_member_present_at_the_facility
Sets 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 | falseTPA001, TPA004the 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.

Request body
{
  "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.

Request body
{
  "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.

Request body
{
  "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.

Request body
{
  "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.

Request body
{
  "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.

Request body
{
  "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.

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.

On this page