Test IDs
Member IDs starting with 990- return a documented response 10 seconds later, without contacting a payer.
A test ID is a member ID that starts with 990-. Send it to create-task
instead of a real Emirates ID or card number and the task runs without
contacting any payer. You poll it the same way as a real task. For 10 seconds
it reports an in-flight status, then it returns a finished response copied from
one of the production cases.
Use test IDs to build and test your client: the polling loop, the terminal
statuses, and every branch the case pages describe. The number after 990-
picks the response, so you can make each outcome happen whenever you need it.
Same host, same credentials
Test IDs use the normal base URL and your normal API key, clinic id and client id. No separate sandbox host or key is needed.
This page shows the v3 calls. On API v4 the same IDs work on
POST /v4/eligibility-checks, sent inside identifiers, with the same timing; that section lists
how a v4 test check differs.
Sample requests
Set the same variables as in the Quickstart:
export MANTYS_API_KEY=... # without the "Bearer " prefix
export MANTYS_CLINIC_ID=...
export MANTYS_CLIENT_ID=...
export BASE=https://hrcm-api.themantys.com/v2/api-integration-v3990-01 finishes as found with is_eligible: true. It is the response the
eligible response structure page walks through.
curl -sS -X POST "$BASE/create-task" \
-H "x-api-key: Bearer $MANTYS_API_KEY" \
-H "X-Clinic-ID: $MANTYS_CLINIC_ID" \
-H "X-Client-ID: $MANTYS_CLIENT_ID" \
-H 'Content-Type: application/json' \
-d '{
"tpa_name": "TPA002",
"id_type": "EMIRATESID",
"id_value": "990-01",
"visit_type": "OUTPATIENT"
}'Each one responds like a real create-task:
{
"success": true,
"message": "Task created successfully",
"data": {
"task_id": "99000000-0001-46aa-aedc-7511f88336aa",
"status": "pending",
"organization_api_task_db": {
"task_id_in_db": "99000000-0001-46aa-aedc-7511f88336aa",
"task_id_in_celery": "99000000-0001-46aa-aedc-7511f88336aa",
"status": "IN_QUEUE"
}
}
}Then poll with the returned task_id:
curl -sS "$BASE/eligibility-result/$TASK_ID" \
-H "x-api-key: Bearer $MANTYS_API_KEY" \
-H "X-Clinic-ID: $MANTYS_CLINIC_ID" \
-H "X-Client-ID: $MANTYS_CLIENT_ID"What a test task does
| Seconds since create | status | Body |
|---|---|---|
| 0 to 3 | IN_QUEUE | The task, with no eligibility_result |
| 3 to 5 | NAVIGATING_WEBSITE | The task, with no eligibility_result |
| 5 to 10 | EXTRACTING_DATA | The task, with no eligibility_result |
| 10 onwards | As captured | The finished response for that case, in full |
A search-all test task reports SEARCH_ALL_PROCESSING in both status and
search_all_status for the first 10 seconds, with an empty
aggregated_results. After that both fields read SEARCH_ALL_COMPLETE and the
full list appears at once.
GET /task-status/{task_id} works too, and reports the same states with its
usual simplified statuses.
The finished body is the captured response shown on the case page, with
task_id, clinic_id and the timestamps changed to match your task. You can
poll it again at any time and get the same body. A few things differ from a
real check:
request_dumpis the captured request, not yours. It holds the placeholder member from the sample. Do not use it to match a response to the request you sent; usetask_id. (On v4 the check'srequestechoes your own request instead; see API v4.)- The document links do not load.
screenshot_keyand everyreferral_documents[].s3_urlpoint atstorage.example.com, a placeholder host. tpa_name,id_typeandvisit_typedo not change the response. The number after990-alone picks it. The case's own payer is ineligibility_result.tpa_name. Still send the fields you would send for a real check: on v3tpa_namemust not be empty, and sending search-all IDs with"tpa_name": "BOTH"keeps your client on its search-all path.- The
784prefix check does not apply.990-IDs are accepted for everyid_type. - Nothing is sent to a payer. A test task causes no portal session and no lookup, and does not count against the payer's rate limits.
- Poll it exactly as you would a real task, with the same credentials and the same base URL you created it with.
Every test ID
Only the digits after 990 count, so 990-21 and 990-0000-0000000-21 both
select case 21. A number that is not in this table returns a 400 listing the
valid ones. Cases 990-90 to 990-99 are answered on v4 only; v3 returns that
400 for them.
The Shape column matters: some cases on single-payer pages were captured
from a search-all and come back in the search-all shape, with
aggregated_results in place of eligibility_result.
| ID | Case page | Sample | Shape | Result |
|---|---|---|---|---|
990-01 | Eligible response structure | eligible | Single | found, eligible |
990-10 | Networks and plans | two-networks | Single | found, eligible |
990-11 | Networks and plans | a1-a3 | Single | found, eligible |
990-12 | Networks and plans | raw-vs-normalised | Single | found, eligible |
990-13 | Networks and plans | enaya-gold | Single | found, eligible |
990-14 | Networks and plans | sentence-network | Search all | 1 found of 18 |
990-15 | Networks and plans | unmapped-plan | Single | found, eligible |
990-20 | Copay | single-benefit | Single | found, eligible |
990-21 | Copay | by-benefit | Single | found, eligible |
990-22 | Copay | by-location | Single | found, eligible |
990-30 | Search-all | two-eligible | Search all | 2 found of 18 |
990-31 | Search-all | two-eligible-with-backoff | Search all | 2 found, 1 backoff |
990-32 | Search-all | four-statuses | Search all | 1 found, 4 failed |
990-33 | Search-all | none-eligible | Search all | No found |
990-34 | Search-all | not-configured | Search all | 1 found, 3 tpa_not_configured |
990-40 | Daman multi-card | daman-two-packages | Single | found, eligible |
990-41 | Daman multi-card | daman-gold-silver | Single | found, eligible |
990-42 | Daman multi-card | daman-ultrasound | Single | found, eligible |
990-43 | Daman multi-card | daman-with-error | Single | found, eligible |
990-44 | Daman multi-card | two-cards | Search all | 1 found, 1 member_not_found |
990-45 | Daman multi-card | two-cards-b | Single | found, eligible |
990-50 | Failures | invalid-credentials | Single | invalid_credentials |
990-51 | Failures | both-credentials | Single | failed |
990-52 | Failures | error-timeout | Single | error |
990-53 | Failures | error-keyerror | Single | error |
990-54 | Failures | failed-bad-request | Search all | 3 failed, no found |
990-55 | Failures | backoff | Search all | 4 failed, 1 error, 1 backoff |
990-56 | Failures | three-classes | Search all | 1 found, 1 failed, 1 invalid_credentials |
990-57 | Failures | clinician-licence-primary | Single | failed |
990-58 | Failures | clinician-licence-name | Search all | 3 failed, no found |
990-60 | Emirates ID not linked | eid-not-found | Single | member_not_found |
990-61 | Emirates ID not linked | card-eligible | Single | found, eligible |
990-62 | Emirates ID not linked | counter-first | Single | member_not_found |
990-63 | Emirates ID not linked | counter-later | Single | found, eligible |
990-70 | Visit types | maternity-not-eligible | Single | member_not_found |
990-71 | Visit types | chronic-out | Single | member_not_found |
990-72 | Visit types | daman-ultrasound | Single | found, eligible |
990-80 | Documents and warnings | gatekeeper | Single | found, eligible |
990-81 | Documents and warnings | referral-dropdown | Single | found, eligible |
990-82 | Documents and warnings | special-remarks | Single | found, eligible |
990-90 | Benefit plans (v4) | outpatient-stamped | Single | found, eligible; plan STAMPED |
990-91 | Benefit plans (v4) | two-visit-types-stamped | Single | 2 found; both plans STAMPED |
990-92 | Benefit plans (v4) | second-leg-not-covered | Single | 1 found, 1 member_not_found |
990-93 | Benefit plans (v4) | inpatient-stamped | Single | found, eligible; plan STAMPED |
990-94 | Benefit plans (v4) | no-rate-found | Single | found, eligible; plan NO_RATE_FOUND |
990-95 | Benefit plans (v4) | no-single-plan-match | Single | found, eligible; NO_SINGLE_PLAN_MATCH |
990-96 | Benefit plans (v4) | member-not-found | Single | member_not_found |
990-97 | Benefit plans (v4) | unknown-encounter-value | Single | found, eligible; plan STAMPED |
990-98 | Benefit plans (v4) | portal-error | Single | error; plan CHECK_FAILED |
990-99 | Benefit plans (v4) | health-plan-not-mapped | Single | found, eligible; plan STAMPED |
"Result" is eligibility_result.status for a single-payer response, and a
count of aggregated_results[].status for a search-all. Every single-payer
case finishes with a task status of PROCESS_COMPLETE, including the
failures. For 990-90 to 990-99 it is each v4 row's status and each
ahd_benefit_plans[].reason; those checks finish as COMPLETE.
A test ID proves your client, not your payer setup
A test task never checks whether your clinic is configured for a payer or whether its portal credentials work. Before go-live, run one real check per payer you depend on.