{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"5cc02e3b-8ad9-4be7-bfe9-8ec877008f03","name":"CAMBRIDGE OPENAPI","description":"# Changelogs\n\n| **Date** | **Description** | **Version** |\n| --- | --- | --- |\n| Aug 2026 | **V3** - Void a Case. Cancels a case that has not yet had its guarantee letter released; retrying against an already-voided case succeeds as a no-op. | 3.2.0 |\n| Aug 2026 | **V3** - Price Eligibility. Checks whether an amount is covered before a case exists. Binary in money terms; never discloses the member's remaining limit or visit count. | 3.1.0 |\n| May 2026 | **V3** - New multi-tenant API: OAuth client credentials, Cases Search, Get Case Detail, Create Case, Validate Outpatient Billing, Release Guarantee Letter, Member Eligibility, Member Search, Get Member Detail. | 3.0.0 |\n| Oct 2025 | New API for submitting claim history, improved performance. | 2.7.0 |\n| Feb 2025 | Changed the Find By Card Number response structure, added an endpoint for retrieving a member's benefit, updated the staging base URL. | 2.6.1 |\n| Jan 2025 | List Member by Client Code, and Provider List filtering by distance. | 2.5.3 |\n| Oct 2024 | Claim, Member's Data and Provider List. | 2.4.4 |\n| Aug 2024 | Enrollment Process. | 1.0.0 |\n\n---\n\n# Overview\n\nCambridge OpenAPI is the integration surface for HealthMetrics Indonesia. It lets our clients and partners enrol members, manage policies, submit and track claims, and look up providers, without integrating directly against our internal enrolment system.\n\nCambridge enriches each request with the internal data you do not need to know about, forwards it to the HealthMetrics Indonesia enrolment and claim services, and returns the result to you.\n\n## Which version do I use?\n\nThere are two generations of this API, and they are documented separately in the sidebar.\n\n| | **V1 & V2** | **V3** |\n| --- | --- | --- |\n| Model | Single-tenant proxy | First-party multi-tenant system |\n| Authentication | Client key + server key exchanged for a bearer token | OAuth client credentials |\n| Authorisation | Scoped to your client | Per-permission (`cases:read`, `members:search`, ...) plus tenant data bindings |\n| Response shapes | Four different families | One consistent envelope |\n| Base path | `<host>/v1/api/...` or `<host>/v2/api/...` | `<host>/v3/api/...` |\n| Status | Supported for existing partners | **Recommended for new integrations** |\n\n**Starting a new integration? Use V3.** It has consistent responses, finer-grained permissions and clearer errors. V1 and V2 remain fully supported - nothing is being switched off - but they carry historical inconsistencies that V3 does not.\n\nEach version's folder in the sidebar opens with its own conventions page. Read that page before writing any code against it; it covers response shapes, error bodies and status codes, which differ between the two.\n\n---\n\n# Business flow\n\nThe flows below describe the enrolment lifecycle, which is common to both versions. Endpoint names are given for V1 and V2; the V3 equivalents are in the V3 folder.\n\n## Enrolment\n\nThe member enrolment flow starts once our team has finished setting up the plans and benefits. You then use the **Enroll** endpoint to create a member with Principal status.\n\nTo enrol a dependant, create the principal first. You can then enrol the dependant with **Enroll-Member**, setting the principal's member number on the request. Use the same endpoint to correct a member's details, such as a date of birth.\n\n<img src=\"https://content.pstmn.io/fd2eebf4-034a-4de4-b8fb-966ba14dcb00/aW1hZ2UucG5n\" alt=\"Enrollment Flow\" width=\"562\" height=\"764\">\n\n## Effective date and renewal\n\nTo correct the dates on a member's current policy, use **Enroll-Update-Effective**. To extend cover into a new term, use **Enroll-Renewal**.\n\n<img src=\"https://content.pstmn.io/9307eb3e-2a98-43bb-b42a-c9db2ab29979/aW1hZ2UucG5n\" alt=\"Update Effective Date and Renewal Flow\" width=\"562\" height=\"727\">\n\n## Change plan\n\nIf a member moves to a different plan, whether an upgrade or a downgrade, use **Enroll-Change-Plan**.\n\n<img src=\"https://content.pstmn.io/a0ecf059-4e25-417e-aed9-b940cd48e306/aW1hZ2UucG5n\" alt=\"Change Member's Plan Flow\" width=\"562\" height=\"762\">\n\n## Terminate and suspend\n\nTo end cover, use **Terminate**. To take it out of force temporarily, use **Suspend**.\n\nThese two have different reversals, and mixing them up is the most common enrolment mistake:\n\n- **Suspend** is reversed by **Reinstate**\n- **Terminate** is reversed by **ReActivate**\n\n<img src=\"https://content.pstmn.io/e00181ea-e80d-4ede-8263-d1bde657da7a/aW1hZ2UucG5n\" alt=\"Terminate or Suspend a Member Flow\" width=\"562\" height=\"728\">\n\n## Re-activate\n\nFor a terminated member, **ReActivate** re-enrols them.\n\n<img src=\"https://content.pstmn.io/0515325f-5ed4-411d-8c7b-1696e9067759/aW1hZ2UucG5n\" alt=\"Reactive a Terminated Member Flow\" width=\"562\" height=\"727\">\n\n## Claims\n\nList a member's claims with **GetListClaim**, and read one in full with **GetDataClaim**. Guarantee letters are available as PDFs from **DownloadIGL** and **DownloadFGL**.\n\nFor cashless treatment, check eligibility with **ValidationCashless** first, then submit with **SubmitClaimCashless**. For reimbursement, submit with **SubmitClaim** and attach the receipts with **Upload**.\n\nIn V3 the equivalent sequence is Member Eligibility, Price Eligibility, Create Case, Validate Outpatient Billing and Release Guarantee Letter.\n\n## Members and providers\n\nLook up a member by card number with **FindByCardNumber**, and their plans and limits with **GetBenefitsByCardNumber**. List a client's members with **ListMemberByClientCode**, or across corporates with **ListByCorporateCode**.\n\n**ListProviderFacility** returns the panel a member can use, and can be filtered by distance from a coordinate.\n\n---\n\n# Features\n\n- **RESTful and straightforward to integrate.** Predictable resources, standard HTTP verbs and status codes.\n- **Full enrolment lifecycle.** Principal and dependant enrolment, updates, plan changes, renewals, suspension, reinstatement, termination and re-activation - individually or in bulk.\n- **Claims end to end.** Cashless and reimbursement submission, document upload, status tracking, guarantee letter retrieval and historical claim loading.\n- **Member and provider lookup.** Benefits, limits, family members and the eligible provider panel.\n- **Two integration generations.** V1 and V2 for existing partners, V3 for new ones.\n\n---\n\n# Setting Up\n\n1. **Request access.** Contact your HealthMetrics Indonesia representative. We set up your plans and benefits before enrolment can begin.\n2. **Receive your credentials.** For V1 and V2 you receive a **client key** and **server key**. For V3 you receive an **API client ID** and **client secret**, along with the permissions your integration needs.\n3. **Choose an environment.** You are given a staging host first. Production access follows once your integration has been verified.\n4. **Configure your environment variables.** Every request in this collection reads its host and credentials from variables - no credential is stored in this documentation.\n5. **Authenticate, then call.** See Authorization below.\n\nCredentials are issued per integration and per environment. Staging credentials do not work against production.\n\n---\n\n# Reference\n\n| **Terminology** | **Description** |\n| --- | --- |\n| Principal | The member who holds the policy. Also written *Principle* in some payloads. |\n| Dependant | A member covered under a principal's policy, such as a spouse or child. |\n| GL | Guarantee Letter. The document confirming cover for a claim. |\n| IGL | Initial Guarantee Letter, issued when a case is registered. |\n| FGL | Final Guarantee Letter, issued when a case is settled. |\n| Cashless | The provider bills HealthMetrics directly; the member does not pay up front. |\n| Reimbursement | The member pays, then claims the cost back. |\n| Corporate | The employer whose staff are covered. |\n| Client | The insurer or scheme owner whose book the members belong to. |\n| Tenant *(V3)* | The organisation an API client acts for, with data bindings limiting what it can see. |\n\n---\n\n# Authorization\n\nBoth versions use HTTP bearer tokens, but they are obtained differently and the tokens are not interchangeable.\n\n## V1 & V2 - client key and server key\n\nExchange your keys for a token:\n\n```\nPOST <host>/v1/api/Auth/Login\n\n{\n  \"clientKey\": \"your-client-key\",\n  \"serverKey\": \"your-server-key\"\n}\n```\n\nSend the returned token on every other request:\n\n```\nAuthorization: Bearer <token>\n```\n\n**Login reports failure with HTTP 200.** A wrong key does not return a 4xx - it returns `200` with `data` as the string `\"Not Found\"` instead of an object. Check the type of `data` before using it.\n\n## V3 - OAuth client credentials\n\n```\nPOST <host>/v3/api/oauth/token\n\n{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"your-client-id\",\n  \"client_secret\": \"your-client-secret\"\n}\n```\n\nThe access token lasts 60 minutes. There is no refresh endpoint - request a new token. The token carries your permissions and data bindings as they stood when it was issued, so a permission change takes effect on your next token, not the current one.\n\nSend it the same way:\n\n```\nAuthorization: Bearer <access_token>\n```\n\n## Keeping credentials safe\n\nYour keys authenticate as you. Treat them as passwords:\n\n- Store them in environment variables or a secret manager - never in source control, a shared document or a Postman collection.\n- Use separate credentials per environment.\n- Ask us to rotate them if they may have been exposed.\n\nEvery example in this documentation uses placeholders such as `{{clientkey}}`. No real credential, member, card or claim number appears anywhere in it.\n","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"37286085","collectionId":"5cc02e3b-8ad9-4be7-bfe9-8ec877008f03","publishedId":"2sA3s1nBVi","public":true,"publicUrl":"https://id-api-docs.healthmetrics.com","privateUrl":"https://go.postman.co/documentation/37286085-5cc02e3b-8ad9-4be7-bfe9-8ec877008f03","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"199BB6"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"dark","themes":[{"name":"dark","logo":"https://content.pstmn.io/85724623-bccc-4697-9f86-215c97b7b6e3/TG9nbyBITS5wbmc=","colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"199BB6"}},{"name":"light","logo":"https://content.pstmn.io/47c363a9-3649-48a4-a6c5-cfd8433159ce/TG9nbyBITS5wbmc=","colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"199BB6"}}]}},"version":"8.12.7","publishDate":"2024-08-09T08:58:36.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":"https://content.pstmn.io/47c363a9-3649-48a4-a6c5-cfd8433159ce/TG9nbyBITS5wbmc=","logoDark":"https://content.pstmn.io/85724623-bccc-4697-9f86-215c97b7b6e3/TG9nbyBITS5wbmc="}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/768118b36f06c94b0306958b980558e6915839447e859fe16906e29d683976f0","favicon":"https://healthmetrics.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://id-api-docs.healthmetrics.com/view/metadata/2sA3s1nBVi"}