{"info":{"_postman_id":"5cc02e3b-8ad9-4be7-bfe9-8ec877008f03","name":"CAMBRIDGE OPENAPI","description":"<html><head></head><body><h1 id=\"changelogs\">Changelogs</h1>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Date</strong></th>\n<th><strong>Description</strong></th>\n<th><strong>Version</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Aug 2026</td>\n<td><strong>V3</strong> - 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.</td>\n<td>3.2.0</td>\n</tr>\n<tr>\n<td>Aug 2026</td>\n<td><strong>V3</strong> - 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.</td>\n<td>3.1.0</td>\n</tr>\n<tr>\n<td>May 2026</td>\n<td><strong>V3</strong> - 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.</td>\n<td>3.0.0</td>\n</tr>\n<tr>\n<td>Oct 2025</td>\n<td>New API for submitting claim history, improved performance.</td>\n<td>2.7.0</td>\n</tr>\n<tr>\n<td>Feb 2025</td>\n<td>Changed the Find By Card Number response structure, added an endpoint for retrieving a member's benefit, updated the staging base URL.</td>\n<td>2.6.1</td>\n</tr>\n<tr>\n<td>Jan 2025</td>\n<td>List Member by Client Code, and Provider List filtering by distance.</td>\n<td>2.5.3</td>\n</tr>\n<tr>\n<td>Oct 2024</td>\n<td>Claim, Member's Data and Provider List.</td>\n<td>2.4.4</td>\n</tr>\n<tr>\n<td>Aug 2024</td>\n<td>Enrollment Process.</td>\n<td>1.0.0</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h1 id=\"overview\">Overview</h1>\n<p>Cambridge 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.</p>\n<p>Cambridge 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.</p>\n<h2 id=\"which-version-do-i-use\">Which version do I use?</h2>\n<p>There are two generations of this API, and they are documented separately in the sidebar.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th><strong>V1 &amp; V2</strong></th>\n<th><strong>V3</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Model</td>\n<td>Single-tenant proxy</td>\n<td>First-party multi-tenant system</td>\n</tr>\n<tr>\n<td>Authentication</td>\n<td>Client key + server key exchanged for a bearer token</td>\n<td>OAuth client credentials</td>\n</tr>\n<tr>\n<td>Authorisation</td>\n<td>Scoped to your client</td>\n<td>Per-permission (<code>cases:read</code>, <code>members:search</code>, ...) plus tenant data bindings</td>\n</tr>\n<tr>\n<td>Response shapes</td>\n<td>Four different families</td>\n<td>One consistent envelope</td>\n</tr>\n<tr>\n<td>Base path</td>\n<td><code>&lt;host&gt;/v1/api/...</code> or <code>&lt;host&gt;/v2/api/...</code></td>\n<td><code>&lt;host&gt;/v3/api/...</code></td>\n</tr>\n<tr>\n<td>Status</td>\n<td>Supported for existing partners</td>\n<td><strong>Recommended for new integrations</strong></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Starting a new integration? Use V3.</strong> 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.</p>\n<p>Each 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.</p>\n<hr>\n<h1 id=\"business-flow\">Business flow</h1>\n<p>The 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.</p>\n<h2 id=\"enrolment\">Enrolment</h2>\n<p>The member enrolment flow starts once our team has finished setting up the plans and benefits. You then use the <strong>Enroll</strong> endpoint to create a member with Principal status.</p>\n<p>To enrol a dependant, create the principal first. You can then enrol the dependant with <strong>Enroll-Member</strong>, 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.</p>\n<img src=\"https://content.pstmn.io/fd2eebf4-034a-4de4-b8fb-966ba14dcb00/aW1hZ2UucG5n\" alt=\"Enrollment Flow\" width=\"562\" height=\"764\">\n\n<h2 id=\"effective-date-and-renewal\">Effective date and renewal</h2>\n<p>To correct the dates on a member's current policy, use <strong>Enroll-Update-Effective</strong>. To extend cover into a new term, use <strong>Enroll-Renewal</strong>.</p>\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<h2 id=\"change-plan\">Change plan</h2>\n<p>If a member moves to a different plan, whether an upgrade or a downgrade, use <strong>Enroll-Change-Plan</strong>.</p>\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<h2 id=\"terminate-and-suspend\">Terminate and suspend</h2>\n<p>To end cover, use <strong>Terminate</strong>. To take it out of force temporarily, use <strong>Suspend</strong>.</p>\n<p>These two have different reversals, and mixing them up is the most common enrolment mistake:</p>\n<ul>\n<li><strong>Suspend</strong> is reversed by <strong>Reinstate</strong></li>\n<li><strong>Terminate</strong> is reversed by <strong>ReActivate</strong></li>\n</ul>\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<h2 id=\"re-activate\">Re-activate</h2>\n<p>For a terminated member, <strong>ReActivate</strong> re-enrols them.</p>\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<h2 id=\"claims\">Claims</h2>\n<p>List a member's claims with <strong>GetListClaim</strong>, and read one in full with <strong>GetDataClaim</strong>. Guarantee letters are available as PDFs from <strong>DownloadIGL</strong> and <strong>DownloadFGL</strong>.</p>\n<p>For cashless treatment, check eligibility with <strong>ValidationCashless</strong> first, then submit with <strong>SubmitClaimCashless</strong>. For reimbursement, submit with <strong>SubmitClaim</strong> and attach the receipts with <strong>Upload</strong>.</p>\n<p>In V3 the equivalent sequence is Member Eligibility, Price Eligibility, Create Case, Validate Outpatient Billing and Release Guarantee Letter.</p>\n<h2 id=\"members-and-providers\">Members and providers</h2>\n<p>Look up a member by card number with <strong>FindByCardNumber</strong>, and their plans and limits with <strong>GetBenefitsByCardNumber</strong>. List a client's members with <strong>ListMemberByClientCode</strong>, or across corporates with <strong>ListByCorporateCode</strong>.</p>\n<p><strong>ListProviderFacility</strong> returns the panel a member can use, and can be filtered by distance from a coordinate.</p>\n<hr>\n<h1 id=\"features\">Features</h1>\n<ul>\n<li><strong>RESTful and straightforward to integrate.</strong> Predictable resources, standard HTTP verbs and status codes.</li>\n<li><strong>Full enrolment lifecycle.</strong> Principal and dependant enrolment, updates, plan changes, renewals, suspension, reinstatement, termination and re-activation - individually or in bulk.</li>\n<li><strong>Claims end to end.</strong> Cashless and reimbursement submission, document upload, status tracking, guarantee letter retrieval and historical claim loading.</li>\n<li><strong>Member and provider lookup.</strong> Benefits, limits, family members and the eligible provider panel.</li>\n<li><strong>Two integration generations.</strong> V1 and V2 for existing partners, V3 for new ones.</li>\n</ul>\n<hr>\n<h1 id=\"setting-up\">Setting Up</h1>\n<ol>\n<li><strong>Request access.</strong> Contact your HealthMetrics Indonesia representative. We set up your plans and benefits before enrolment can begin.</li>\n<li><strong>Receive your credentials.</strong> For V1 and V2 you receive a <strong>client key</strong> and <strong>server key</strong>. For V3 you receive an <strong>API client ID</strong> and <strong>client secret</strong>, along with the permissions your integration needs.</li>\n<li><strong>Choose an environment.</strong> You are given a staging host first. Production access follows once your integration has been verified.</li>\n<li><strong>Configure your environment variables.</strong> Every request in this collection reads its host and credentials from variables - no credential is stored in this documentation.</li>\n<li><strong>Authenticate, then call.</strong> See Authorization below.</li>\n</ol>\n<p>Credentials are issued per integration and per environment. Staging credentials do not work against production.</p>\n<hr>\n<h1 id=\"reference\">Reference</h1>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Terminology</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Principal</td>\n<td>The member who holds the policy. Also written <em>Principle</em> in some payloads.</td>\n</tr>\n<tr>\n<td>Dependant</td>\n<td>A member covered under a principal's policy, such as a spouse or child.</td>\n</tr>\n<tr>\n<td>GL</td>\n<td>Guarantee Letter. The document confirming cover for a claim.</td>\n</tr>\n<tr>\n<td>IGL</td>\n<td>Initial Guarantee Letter, issued when a case is registered.</td>\n</tr>\n<tr>\n<td>FGL</td>\n<td>Final Guarantee Letter, issued when a case is settled.</td>\n</tr>\n<tr>\n<td>Cashless</td>\n<td>The provider bills HealthMetrics directly; the member does not pay up front.</td>\n</tr>\n<tr>\n<td>Reimbursement</td>\n<td>The member pays, then claims the cost back.</td>\n</tr>\n<tr>\n<td>Corporate</td>\n<td>The employer whose staff are covered.</td>\n</tr>\n<tr>\n<td>Client</td>\n<td>The insurer or scheme owner whose book the members belong to.</td>\n</tr>\n<tr>\n<td>Tenant <em>(V3)</em></td>\n<td>The organisation an API client acts for, with data bindings limiting what it can see.</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h1 id=\"authorization\">Authorization</h1>\n<p>Both versions use HTTP bearer tokens, but they are obtained differently and the tokens are not interchangeable.</p>\n<h2 id=\"v1--v2---client-key-and-server-key\">V1 &amp; V2 - client key and server key</h2>\n<p>Exchange your keys for a token:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST &lt;host&gt;/v1/api/Auth/Login\n\n{\n  \"clientKey\": \"your-client-key\",\n  \"serverKey\": \"your-server-key\"\n}\n</code></pre><p>Send the returned token on every other request:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer &lt;token&gt;\n</code></pre><p><strong>Login reports failure with HTTP 200.</strong> A wrong key does not return a 4xx - it returns <code>200</code> with <code>data</code> as the string <code>\"Not Found\"</code> instead of an object. Check the type of <code>data</code> before using it.</p>\n<h2 id=\"v3---oauth-client-credentials\">V3 - OAuth client credentials</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST &lt;host&gt;/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</code></pre><p>The 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.</p>\n<p>Send it the same way:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer &lt;access_token&gt;\n</code></pre><h2 id=\"keeping-credentials-safe\">Keeping credentials safe</h2>\n<p>Your keys authenticate as you. Treat them as passwords:</p>\n<ul>\n<li>Store them in environment variables or a secret manager - never in source control, a shared document or a Postman collection.</li>\n<li>Use separate credentials per environment.</li>\n<li>Ask us to rotate them if they may have been exposed.</li>\n</ul>\n<p>Every example in this documentation uses placeholders such as <code>{{clientkey}}</code>. No real credential, member, card or claim number appears anywhere in it.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Changelogs","slug":"changelogs"},{"content":"Overview","slug":"overview"},{"content":"Business flow","slug":"business-flow"},{"content":"Features","slug":"features"},{"content":"Setting Up","slug":"setting-up"},{"content":"Reference","slug":"reference"},{"content":"Authorization","slug":"authorization"}],"owner":"37286085","collectionId":"5cc02e3b-8ad9-4be7-bfe9-8ec877008f03","publishedId":"2sA3s1nBVi","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"199BB6"},"publishDate":"2024-08-09T08:58:36.000Z"},"item":[{"name":"Cambridge API","item":[{"name":"V1 & V2","item":[{"name":"Authorization","item":[{"name":"Login","event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Store the bearer token for every other request in this folder.","// Login reports failure as HTTP 200 with data as a string, so check the type.","if (pm.response.code === 200) {","    const res = pm.response.json();","    if (res.data && typeof res.data === 'object' && res.data.token) {","        pm.collectionVariables.set(\"BearerToken\", res.data.token);","    } else {","        console.warn('Login did not return a token:', res.data);","    }","}"]}}],"id":"4485b944-f6c9-42f7-ac73-27dad496aebb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"clientKey\": \"{{clientkey}}\",\n  \"serverKey\": \"{{serverkey}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Auth/Login","description":"<p>Exchange your client key and server key for a bearer token.</p>\n<p><strong><code>POST {{base}}/api/Auth/Login</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td>None - this is the only unauthenticated endpoint</td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The only way to obtain a token. The token embeds the NOVA client identity resolved from your keys, so it is scoped to your client's book. Read <code>expiry</code> and re-authenticate before then - there is no refresh endpoint.</p>\n<p>This request's post-response script writes the token into <code>BearerToken</code>, which every other request in this folder inherits.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientKey</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Identifies the integration. Issued to you.</td>\n</tr>\n<tr>\n<td><code>serverKey</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Authenticates the integration. Issued to you.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td><strong>Either</strong> a token <strong>or</strong> a failure - see the warning below.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>string(jwt)</td>\n<td>No</td>\n<td>Send as <code>Authorization: Bearer &lt;token&gt;</code>.</td>\n</tr>\n<tr>\n<td><code>tokenType</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>Bearer</code>.</td>\n</tr>\n<tr>\n<td><code>expiry</code></td>\n<td>string(date-time)</td>\n<td>No</td>\n<td>When the token stops working.</td>\n</tr>\n<tr>\n<td><code>timezone</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Timezone the expiry is expressed in.</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Human-readable lifetime.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"login-reports-failure-as-http-200\">Login reports failure as HTTP 200</h3>\n<p>A wrong client key or server key does <strong>not</strong> return <code>4xx</code>. It returns <code>200</code> with <code>data</code> as a <strong>string</strong>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"data\": \"Not Found\" }\n</code></pre>\n<p>Check the type of <code>data</code> before using it. Treating any <code>200</code> as success will silently give your integration no token.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Auth","Login"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"14dd6451-e59b-46e5-9d4a-ad27b4da5560","name":"Token issued","originalRequest":{"auth":{"type":"noauth"},"method":"POST","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"clientKey\": \"{{clientkey}}\",\n  \"serverKey\": \"{{serverkey}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Auth/Login"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.<redacted>\",\n        \"tokenType\": \"Bearer\",\n        \"expiry\": \"2026-01-01T12:00:00Z\",\n        \"timezone\": \"Asia/Jakarta\",\n        \"duration\": \"60 minutes\"\n    }\n}"},{"id":"2047a14a-e7c2-4367-a252-0a9590528d5b","name":"Bad credentials - note HTTP 200","originalRequest":{"auth":{"type":"noauth"},"method":"POST","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"clientKey\": \"{{clientkey}}\",\n  \"serverKey\": \"{{serverkey}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Auth/Login"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": \"Not Found\"\n}"}],"_postman_id":"4485b944-f6c9-42f7-ac73-27dad496aebb"}],"id":"bd949d32-b1a3-4cf6-b772-c7d61d812c9a","description":"<p>Exchange your client key and server key for a bearer token.</p>\n<p>Run <strong>Login</strong> first. Its post-response script stores the token in <code>BearerToken</code>, which every other request in this folder inherits.</p>\n<p><strong>Login reports failure as HTTP 200</strong> with <code>{\"data\": \"Not Found\"}</code> - check that <code>data</code> is an object, not a string.</p>\n","_postman_id":"bd949d32-b1a3-4cf6-b772-c7d61d812c9a","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}}},{"name":"Enrollment","item":[{"name":"Enrollment New Member","item":[{"name":"Enrollment New Member","id":"5cf3cc2b-29bc-4e04-b17a-91b2c7f3019d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"New member enrolment\",\n    \"member\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"name\": \"John Doe\",\n      \"sex\": \"M\",\n      \"maritalStatus\": \"S\",\n      \"dateOfBirth\": \"1990-01-01\",\n      \"planDescription\": \"Sample Inpatient Plan\",\n      \"bankCode\": \"\",\n      \"memberType\": \"\",\n      \"phoneNumber\": \"+628000000001\",\n      \"principal\": null\n    },\n    \"policy\": {\n      \"policyNumber\": \"POL0000000000001\",\n      \"startDate\": \"2026-01-01\",\n      \"endDate\": \"2026-12-31\",\n      \"plans\": [\n        { \"planCode\": \"PLAN-001\", \"isActive\": true }\n      ],\n      \"remarks\": \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Enroll","description":"<p>Create a member and their policy in one call.</p>\n<p><strong><code>POST {{base}}/api/Member/Enroll</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>201 Created</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Creates the member record and puts the policy in force. <strong>The principal must exist before any dependant can be enrolled against them</strong> - enrol the principal first, then set <code>member.principal</code> on the dependant's call.</p>\n<p>If the member already holds this policy the call is refused with <code>MemberAndPolicyExist</code>; use <strong>Update Member Data</strong> (<code>PUT Enroll-Member</code>) to change their plan instead.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>In</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>corporateCode</code></td>\n<td>body</td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>body</td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Free-text reason, stored on the downstream audit trail.</td>\n</tr>\n<tr>\n<td><code>member</code></td>\n<td>body</td>\n<td>object</td>\n<td>-</td>\n<td>Yes</td>\n<td>Member details - see below.</td>\n</tr>\n<tr>\n<td><code>policy</code></td>\n<td>body</td>\n<td>object</td>\n<td>-</td>\n<td>Yes</td>\n<td>Policy details - see below.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>member</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Full name.</td>\n</tr>\n<tr>\n<td><code>sex</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td><code>M</code> / <code>F</code>.</td>\n</tr>\n<tr>\n<td><code>maritalStatus</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td><code>S</code> / <code>M</code>.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Date of birth.</td>\n</tr>\n<tr>\n<td><code>planDescription</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Free-text plan label.</td>\n</tr>\n<tr>\n<td><code>bankCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Bank code for reimbursement.</td>\n</tr>\n<tr>\n<td><code>memberType</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Member type.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>principal</code></td>\n<td>object</td>\n<td>-</td>\n<td>No</td>\n<td><strong>Required for a dependant.</strong> <code>{ memberNumber, relationship }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>policy</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Policy number.</td>\n</tr>\n<tr>\n<td><code>startDate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Policy start.</td>\n</tr>\n<tr>\n<td><code>endDate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Policy end.</td>\n</tr>\n<tr>\n<td><code>plans</code></td>\n<td>array</td>\n<td>-</td>\n<td>No</td>\n<td><code>[{ planCode, isActive }]</code>. <code>isActive</code> is optional.</td>\n</tr>\n<tr>\n<td><code>remarks</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Free-text remarks.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>201</code></td>\n<td>Member and policy created.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Member already holds this policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Enroll"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"1c64259d-6ef7-4dfb-bf8a-b629b17937bb","name":"Member created","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"New member enrolment\",\n    \"member\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"name\": \"John Doe\",\n      \"sex\": \"M\",\n      \"maritalStatus\": \"S\",\n      \"dateOfBirth\": \"1990-01-01\",\n      \"planDescription\": \"Sample Inpatient Plan\",\n      \"bankCode\": \"\",\n      \"memberType\": \"\",\n      \"phoneNumber\": \"+628000000001\",\n      \"principal\": null\n    },\n    \"policy\": {\n      \"policyNumber\": \"POL0000000000001\",\n      \"startDate\": \"2026-01-01\",\n      \"endDate\": \"2026-12-31\",\n      \"plans\": [\n        { \"planCode\": \"PLAN-001\", \"isActive\": true }\n      ],\n      \"remarks\": \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"d7a26ad9-3e75-4f2c-910d-9f6291b36402","name":"Member already holds this policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"New member enrolment\",\n    \"member\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"name\": \"John Doe\",\n      \"sex\": \"M\",\n      \"maritalStatus\": \"S\",\n      \"dateOfBirth\": \"1990-01-01\",\n      \"planDescription\": \"Sample Inpatient Plan\",\n      \"bankCode\": \"\",\n      \"memberType\": \"\",\n      \"phoneNumber\": \"+628000000001\",\n      \"principal\": null\n    },\n    \"policy\": {\n      \"policyNumber\": \"POL0000000000001\",\n      \"startDate\": \"2026-01-01\",\n      \"endDate\": \"2026-12-31\",\n      \"plans\": [\n        { \"planCode\": \"PLAN-001\", \"isActive\": true }\n      ],\n      \"remarks\": \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberAndPolicyExist\",\n            \"Message\": \"Policy for this member already exist. To update the plan, please use PUT method instead.\"\n        }\n    ]\n}"},{"id":"0ec777e7-9020-4047-ba75-6287611fc821","name":"Validation failure","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"New member enrolment\",\n    \"member\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"name\": \"John Doe\",\n      \"sex\": \"M\",\n      \"maritalStatus\": \"S\",\n      \"dateOfBirth\": \"1990-01-01\",\n      \"planDescription\": \"Sample Inpatient Plan\",\n      \"bankCode\": \"\",\n      \"memberType\": \"\",\n      \"phoneNumber\": \"+628000000001\",\n      \"principal\": null\n    },\n    \"policy\": {\n      \"policyNumber\": \"POL0000000000001\",\n      \"startDate\": \"2026-01-01\",\n      \"endDate\": \"2026-12-31\",\n      \"plans\": [\n        { \"planCode\": \"PLAN-001\", \"isActive\": true }\n      ],\n      \"remarks\": \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"cardNumber\": [\n            \"The cardNumber field is required.\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"5cf3cc2b-29bc-4e04-b17a-91b2c7f3019d"},{"name":"Get Enrollment","id":"cd235466-4c96-4a7e-8ee1-6458cd0b70f3","request":{"method":"GET","header":[],"url":"{{base}}/{{apiVersion}}/api/Member/Enroll/:memberId/:policyNumber/:corporateCode","description":"<p>Read a single enrolment by member, policy and corporate.</p>\n<p><strong><code>GET {{base}}/api/Member/Enroll/{memberId}/{policyNumber}/{corporateCode}</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>200 OK</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The read counterpart to the enrolment write endpoints, returning the same member-record shape they do. Use it to confirm a change landed.</p>\n<p>All three path segments are required - the member is identified by the combination, not by member number alone.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberId</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>Policy number.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The enrolment.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member - <code>MemberOrPolicyNotExist</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":true,"source":{"_postman_id":"f38d01cc-adfb-44f5-a45e-4f9ad7231348","id":"f38d01cc-adfb-44f5-a45e-4f9ad7231348","name":"Enrollment New Member","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Member","Enroll",":memberId",":policyNumber",":corporateCode"],"host":["{{base}}"],"query":[],"variable":[{"description":{"content":"<p>Your identifier for the member.</p>\n","type":"text/plain"},"type":"any","value":"MEM00000001","key":"memberId"},{"description":{"content":"<p>Policy number.</p>\n","type":"text/plain"},"type":"any","value":"POL0000000000001","key":"policyNumber"},{"description":{"content":"<p>The corporate the member belongs to.</p>\n","type":"text/plain"},"type":"any","value":"CORP01","key":"corporateCode"}]}},"response":[{"id":"30118172-ca16-4ae1-b58d-49cac2ae765b","name":"The enrolment","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Member/Enroll/:memberId/:policyNumber/:corporateCode","host":["{{base}}"],"path":["api","Member","Enroll",":memberId",":policyNumber",":corporateCode"],"variable":[{"key":"memberId","value":"MEM00000001","description":"Your identifier for the member."},{"key":"policyNumber","value":"POL0000000000001","description":"Policy number."},{"key":"corporateCode","value":"CORP01","description":"The corporate the member belongs to."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"794e77e6-a941-48dd-bb31-e76c26436dde","name":"No such member or policy","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Member/Enroll/:memberId/:policyNumber/:corporateCode","host":["{{base}}"],"path":["api","Member","Enroll",":memberId",":policyNumber",":corporateCode"],"variable":[{"key":"memberId","value":"MEM00000001","description":"Your identifier for the member."},{"key":"policyNumber","value":"POL0000000000001","description":"Policy number."},{"key":"corporateCode","value":"CORP01","description":"The corporate the member belongs to."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"cd235466-4c96-4a7e-8ee1-6458cd0b70f3"}],"id":"f38d01cc-adfb-44f5-a45e-4f9ad7231348","description":"<p>Create a member and their policy in one call. Returns <code>201</code>.</p>\n<p>The principal must exist before any dependant can be enrolled against them.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"07775f73-ec37-4774-9a3a-4e39fe6ff1ba","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"cdb91178-a237-4dc0-bf0e-98b451ace8a1","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"f38d01cc-adfb-44f5-a45e-4f9ad7231348"},{"name":"Bulk Enrollment New Member","item":[{"name":"Bulk Enrollment New Member","id":"27b3515c-6c29-4b84-934c-670780e60af1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"RecordMode\": 1,\n    \"RecordType\": \"N\",\n    \"PayorID\": \"CLI01\",\n    \"MemberID\": \"MEM00000001\",\n    \"MappingID\": \"\",\n    \"CardNumber\": \"9999000000000001\",\n    \"CorporateEmail\": \"hr@example.com\",\n    \"TpaMemberID\": \"\",\n    \"CorporateID\": \"CORP01\",\n    \"Nik\": \"0000000000000001\",\n    \"Division\": \"\",\n    \"BranchCode\": \"\",\n    \"BankInfo\": \"\",\n    \"Language\": \"id-id\",\n    \"TypeOfWork\": 1,\n    \"Race\": \"\",\n    \"PolicyNumber\": \"POL0000000000001\",\n    \"MaritalStatus\": \"S\",\n    \"Relationship\": \"Principle\",\n    \"MembersEffectiveDate\": \"2026-01-01\",\n    \"MembersExpiryDate\": \"2026-12-31\",\n    \"FaskesFKTP\": \"\",\n    \"FaskesFKRTL\": \"\",\n    \"ClassesBPJS\": \"\",\n    \"NameOfFaskes\": \"\",\n    \"RuleBPJSK\": \"\",\n    \"MemberName\": \"John Doe\",\n    \"Address1\": \"1 Sample Street\",\n    \"Address2\": \"\",\n    \"Address3\": \"\",\n    \"Address4\": \"\",\n    \"City\": \"Jakarta\",\n    \"State\": \"DKI Jakarta\",\n    \"PostCode\": \"10000\",\n    \"TelephoneMobile\": \"+628000000001\",\n    \"TelephoneRes\": \"\",\n    \"TelephoneOffice\": \"\",\n    \"NRIC\": \"\",\n    \"PassportNo\": \"A0000001\",\n    \"PassportCountry\": \"ID\",\n    \"Email\": \"john.doe@example.com\",\n    \"IdentificationCode\": \"\",\n    \"DateOfBirth\": \"1990-01-01\",\n    \"Sex\": \"M\",\n    \"PlanID\": \"PLAN-001\",\n    \"EmploymentStatus\": \"\",\n    \"DateTerminated\": \"\",\n    \"PreExisting\": \"\",\n    \"BpjsID\": \"\",\n    \"EndorsementDate\": \"\",\n    \"Remarks\": \"\",\n    \"MemberSince\": \"2026-01-01\",\n    \"PolicyInForce\": \"1\",\n    \"MemberSuspended\": \"0\",\n    \"ActivationDate\": \"2026-01-01\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Enroll-Member-Bulk","description":"<p>Bulk enrol members using the original NOVA-style record.</p>\n<p><strong><code>POST {{base}}/api/Member/Enroll-Member-Bulk</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>200 OK</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Takes an <strong>array</strong> of flat enrolment records, 55 fields each. This is the original bulk format and includes Indonesian statutory fields - <code>FaskesFKTP</code>, <code>FaskesFKRTL</code>, <code>ClassesBPJS</code>, <code>RuleBPJSK</code>, <code>BpjsID</code>.</p>\n<p><strong>Both bulk endpoints are live.</strong> Use <strong>New-Enroll-Member-Bulk</strong> if your integration was set up against the product-based format; the two records are not interchangeable.</p>\n<h3 id=\"request-body---array-item\">Request body - array item</h3>\n<p>Required fields:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>RecordMode</code></td>\n<td>integer</td>\n<td>Operation selector for the row.</td>\n</tr>\n<tr>\n<td><code>RecordType</code></td>\n<td>string</td>\n<td>Record type.</td>\n</tr>\n<tr>\n<td><code>PayorID</code></td>\n<td>string</td>\n<td>Payor identifier.</td>\n</tr>\n<tr>\n<td><code>MemberID</code></td>\n<td>string</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>CorporateID</code></td>\n<td>string</td>\n<td>Corporate identifier.</td>\n</tr>\n<tr>\n<td><code>PolicyNumber</code></td>\n<td>string</td>\n<td>Policy number.</td>\n</tr>\n<tr>\n<td><code>Relationship</code></td>\n<td>string</td>\n<td>Relationship to the principal.</td>\n</tr>\n<tr>\n<td><code>MemberName</code></td>\n<td>string</td>\n<td>Full name.</td>\n</tr>\n<tr>\n<td><code>TelephoneMobile</code></td>\n<td>string</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>PassportNo</code></td>\n<td>string</td>\n<td>Passport number.</td>\n</tr>\n<tr>\n<td><code>Sex</code></td>\n<td>string</td>\n<td><code>M</code> / <code>F</code>.</td>\n</tr>\n<tr>\n<td><code>PlanID</code></td>\n<td>string</td>\n<td>Plan identifier.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Optional fields: <code>MappingID</code>, <code>CardNumber</code>, <code>CorporateEmail</code>, <code>TpaMemberID</code>, <code>Nik</code>, <code>Division</code>, <code>BranchCode</code>, <code>BankInfo</code>, <code>Language</code>, <code>TypeOfWork</code>, <code>Race</code>, <code>MaritalStatus</code>, <code>MembersEffectiveDate</code>, <code>MembersExpiryDate</code>, <code>FaskesFKTP</code>, <code>FaskesFKRTL</code>, <code>ClassesBPJS</code>, <code>NameOfFaskes</code>, <code>RuleBPJSK</code>, <code>Address1</code>-<code>Address4</code>, <code>City</code>, <code>State</code>, <code>PostCode</code>, <code>TelephoneRes</code>, <code>TelephoneOffice</code>, <code>NRIC</code>, <code>PassportCountry</code>, <code>Email</code>, <code>IdentificationCode</code>, <code>DateOfBirth</code>, <code>EmploymentStatus</code>, <code>DateTerminated</code>, <code>PreExisting</code>, <code>BpjsID</code>, <code>EndorsementDate</code>, <code>Remarks</code>, <code>MemberSince</code>, <code>PolicyInForce</code>, <code>MemberSuspended</code>, <code>ActivationDate</code>.</p>\n<p><strong>Dates in this payload are strings with no enforced format.</strong> Follow the template supplied with your onboarding pack rather than assuming <code>yyyy-MM-dd</code>.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Batch accepted. Per-row outcomes are in the response body.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>The array was empty or a row failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Enroll-Member-Bulk"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"3954f334-26f6-4b18-be46-47983667450f","name":"Batch accepted","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"RecordMode\": 1,\n    \"RecordType\": \"N\",\n    \"PayorID\": \"CLI01\",\n    \"MemberID\": \"MEM00000001\",\n    \"MappingID\": \"\",\n    \"CardNumber\": \"9999000000000001\",\n    \"CorporateEmail\": \"hr@example.com\",\n    \"TpaMemberID\": \"\",\n    \"CorporateID\": \"CORP01\",\n    \"Nik\": \"0000000000000001\",\n    \"Division\": \"\",\n    \"BranchCode\": \"\",\n    \"BankInfo\": \"\",\n    \"Language\": \"id-id\",\n    \"TypeOfWork\": 1,\n    \"Race\": \"\",\n    \"PolicyNumber\": \"POL0000000000001\",\n    \"MaritalStatus\": \"S\",\n    \"Relationship\": \"Principle\",\n    \"MembersEffectiveDate\": \"2026-01-01\",\n    \"MembersExpiryDate\": \"2026-12-31\",\n    \"FaskesFKTP\": \"\",\n    \"FaskesFKRTL\": \"\",\n    \"ClassesBPJS\": \"\",\n    \"NameOfFaskes\": \"\",\n    \"RuleBPJSK\": \"\",\n    \"MemberName\": \"John Doe\",\n    \"Address1\": \"1 Sample Street\",\n    \"Address2\": \"\",\n    \"Address3\": \"\",\n    \"Address4\": \"\",\n    \"City\": \"Jakarta\",\n    \"State\": \"DKI Jakarta\",\n    \"PostCode\": \"10000\",\n    \"TelephoneMobile\": \"+628000000001\",\n    \"TelephoneRes\": \"\",\n    \"TelephoneOffice\": \"\",\n    \"NRIC\": \"\",\n    \"PassportNo\": \"A0000001\",\n    \"PassportCountry\": \"ID\",\n    \"Email\": \"john.doe@example.com\",\n    \"IdentificationCode\": \"\",\n    \"DateOfBirth\": \"1990-01-01\",\n    \"Sex\": \"M\",\n    \"PlanID\": \"PLAN-001\",\n    \"EmploymentStatus\": \"\",\n    \"DateTerminated\": \"\",\n    \"PreExisting\": \"\",\n    \"BpjsID\": \"\",\n    \"EndorsementDate\": \"\",\n    \"Remarks\": \"\",\n    \"MemberSince\": \"2026-01-01\",\n    \"PolicyInForce\": \"1\",\n    \"MemberSuspended\": \"0\",\n    \"ActivationDate\": \"2026-01-01\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Member-Bulk"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"processed\": 1,\n        \"failed\": 0,\n        \"rows\": [\n            { \"memberId\": \"MEM00000001\", \"status\": \"OK\" }\n        ]\n    }\n}"},{"id":"a7ea864a-27d5-4ad6-9133-343d723fd7b4","name":"Empty array","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"RecordMode\": 1,\n    \"RecordType\": \"N\",\n    \"PayorID\": \"CLI01\",\n    \"MemberID\": \"MEM00000001\",\n    \"MappingID\": \"\",\n    \"CardNumber\": \"9999000000000001\",\n    \"CorporateEmail\": \"hr@example.com\",\n    \"TpaMemberID\": \"\",\n    \"CorporateID\": \"CORP01\",\n    \"Nik\": \"0000000000000001\",\n    \"Division\": \"\",\n    \"BranchCode\": \"\",\n    \"BankInfo\": \"\",\n    \"Language\": \"id-id\",\n    \"TypeOfWork\": 1,\n    \"Race\": \"\",\n    \"PolicyNumber\": \"POL0000000000001\",\n    \"MaritalStatus\": \"S\",\n    \"Relationship\": \"Principle\",\n    \"MembersEffectiveDate\": \"2026-01-01\",\n    \"MembersExpiryDate\": \"2026-12-31\",\n    \"FaskesFKTP\": \"\",\n    \"FaskesFKRTL\": \"\",\n    \"ClassesBPJS\": \"\",\n    \"NameOfFaskes\": \"\",\n    \"RuleBPJSK\": \"\",\n    \"MemberName\": \"John Doe\",\n    \"Address1\": \"1 Sample Street\",\n    \"Address2\": \"\",\n    \"Address3\": \"\",\n    \"Address4\": \"\",\n    \"City\": \"Jakarta\",\n    \"State\": \"DKI Jakarta\",\n    \"PostCode\": \"10000\",\n    \"TelephoneMobile\": \"+628000000001\",\n    \"TelephoneRes\": \"\",\n    \"TelephoneOffice\": \"\",\n    \"NRIC\": \"\",\n    \"PassportNo\": \"A0000001\",\n    \"PassportCountry\": \"ID\",\n    \"Email\": \"john.doe@example.com\",\n    \"IdentificationCode\": \"\",\n    \"DateOfBirth\": \"1990-01-01\",\n    \"Sex\": \"M\",\n    \"PlanID\": \"PLAN-001\",\n    \"EmploymentStatus\": \"\",\n    \"DateTerminated\": \"\",\n    \"PreExisting\": \"\",\n    \"BpjsID\": \"\",\n    \"EndorsementDate\": \"\",\n    \"Remarks\": \"\",\n    \"MemberSince\": \"2026-01-01\",\n    \"PolicyInForce\": \"1\",\n    \"MemberSuspended\": \"0\",\n    \"ActivationDate\": \"2026-01-01\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Member-Bulk"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"cardNumber\": [\n            \"The cardNumber field is required.\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"27b3515c-6c29-4b84-934c-670780e60af1"},{"name":"New Bulk Enrollment","id":"6a1d0ac5-888b-4611-b83c-5cab460452ad","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"RecordMode\": 1,\n    \"MemberType\": \"Principle\",\n    \"MemberID\": \"MEM00000001\",\n    \"MappingID\": \"\",\n    \"MemberName\": \"John Doe\",\n    \"Nik\": \"0000000000000001\",\n    \"DateOfBirth\": \"1990-01-01\",\n    \"Sex\": \"M\",\n    \"Relationship\": \"Principle\",\n    \"MaritalStatus\": \"S\",\n    \"TelephoneMobile\": \"+628000000001\",\n    \"Email\": \"john.doe@example.com\",\n    \"MemberAdress\": \"1 Sample Street, Jakarta\",\n    \"NRIC\": \"\",\n    \"BankInfo\": \"Sample Bank\",\n    \"BankAccountHolder\": \"John Doe\",\n    \"BankAccountNumber\": \"0000000001\",\n    \"BpjsNumber\": \"\",\n    \"Remarks\": \"\",\n    \"MemberSince\": \"2026-01-01\",\n    \"MembersEffectiveDate\": \"2026-01-01\",\n    \"MembersExpiryDate\": \"2026-12-31\",\n    \"UnsuspendDate\": \"\",\n    \"ReinstateDate\": \"\",\n    \"LapseDate\": \"\",\n    \"SuspendDate\": \"\",\n    \"DateTerminated\": \"\",\n    \"PayorID\": \"CLI01\",\n    \"IsVip\": 0,\n    \"ProductCode\": \"PRD001\",\n    \"PlanID\": \"PLAN-001\",\n    \"PolicyNumber\": \"POL0000000000001\",\n    \"Division\": \"\",\n    \"DivisionName\": \"\",\n    \"TelephoneOffice\": \"\",\n    \"CardNumber\": \"9999000000000001\",\n    \"CorporateEmail\": \"hr@example.com\",\n    \"AdditionalData\": [],\n    \"RecordType\": \"N\",\n    \"CorporateID\": \"CORP01\",\n    \"TypeOfWork\": 1,\n    \"Address1\": \"1 Sample Street\",\n    \"BranchCode\": \"\",\n    \"TpaMemberID\": \"\",\n    \"EmploymentStatus\": \"\",\n    \"UpdatedBy\": \"\",\n    \"CreatedBy\": \"integration@example.com\",\n    \"Username\": \"integration@example.com\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/New-Enroll-Member-Bulk","description":"<p>Bulk enrol members using the product-based record.</p>\n<p><strong><code>POST {{base}}/api/Member/New-Enroll-Member-Bulk</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>200 OK</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Takes an <strong>array</strong> of enrolment records in the newer product-based format, 48 fields each. Compared with <strong>Enroll-Member-Bulk</strong> it adds <code>ProductCode</code>, splits bank details into <code>BankAccountHolder</code> and <code>BankAccountNumber</code>, carries a fuller set of lifecycle dates (<code>UnsuspendDate</code>, <code>ReinstateDate</code>, <code>LapseDate</code>, <code>SuspendDate</code>), supports <code>AdditionalData</code> for client-specific columns, and drops the BPJS <em>Faskes</em> fields.</p>\n<p><strong>Both bulk endpoints are live.</strong> Use whichever your integration was set up against.</p>\n<h3 id=\"request-body---array-item\">Request body - array item</h3>\n<p>Required fields:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>RecordMode</code></td>\n<td>integer</td>\n<td>Operation selector for the row.</td>\n</tr>\n<tr>\n<td><code>MemberType</code></td>\n<td>string</td>\n<td>Member type.</td>\n</tr>\n<tr>\n<td><code>MemberID</code></td>\n<td>string</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>MemberName</code></td>\n<td>string</td>\n<td>Full name.</td>\n</tr>\n<tr>\n<td><code>Sex</code></td>\n<td>string</td>\n<td><code>M</code> / <code>F</code>.</td>\n</tr>\n<tr>\n<td><code>PayorID</code></td>\n<td>string</td>\n<td>Payor identifier.</td>\n</tr>\n<tr>\n<td><code>ProductCode</code></td>\n<td>string</td>\n<td>Product the member is enrolled onto.</td>\n</tr>\n<tr>\n<td><code>PolicyNumber</code></td>\n<td>string</td>\n<td>Policy number.</td>\n</tr>\n<tr>\n<td><code>Username</code></td>\n<td>string</td>\n<td>Who submitted the row.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Optional fields: <code>MappingID</code>, <code>Nik</code>, <code>DateOfBirth</code>, <code>Relationship</code>, <code>MaritalStatus</code>, <code>TelephoneMobile</code>, <code>TelephoneOffice</code>, <code>Email</code>, <code>MemberAdress</code>, <code>NRIC</code>, <code>BankInfo</code>, <code>BankAccountHolder</code>, <code>BankAccountNumber</code>, <code>BpjsNumber</code>, <code>Remarks</code>, <code>MemberSince</code>, <code>MembersEffectiveDate</code>, <code>MembersExpiryDate</code>, <code>UnsuspendDate</code>, <code>ReinstateDate</code>, <code>LapseDate</code>, <code>SuspendDate</code>, <code>DateTerminated</code>, <code>IsVip</code>, <code>PlanID</code>, <code>Division</code>, <code>DivisionName</code>, <code>CardNumber</code>, <code>CorporateEmail</code>, <code>AdditionalData</code>, <code>RecordType</code>, <code>CorporateID</code>, <code>TypeOfWork</code>, <code>Address1</code>, <code>BranchCode</code>, <code>TpaMemberID</code>, <code>EmploymentStatus</code>, <code>UpdatedBy</code>, <code>CreatedBy</code>.</p>\n<p><code>AdditionalData</code> is an array of client-specific membership attributes. <code>MemberAdress</code> is spelled with one <code>d</code> - that is the real field name.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Batch accepted. Per-row outcomes are in the response body.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>The array was empty or a row failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":true,"source":{"_postman_id":"f46241f1-1ecb-488c-9bdf-6eef5ca11d9d","id":"f46241f1-1ecb-488c-9bdf-6eef5ca11d9d","name":"Bulk Enrollment New Member","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Member","New-Enroll-Member-Bulk"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"ebdabf6d-c58c-474a-973d-c4ad78d16045","name":"Batch accepted","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"RecordMode\": 1,\n    \"MemberType\": \"Principle\",\n    \"MemberID\": \"MEM00000001\",\n    \"MappingID\": \"\",\n    \"MemberName\": \"John Doe\",\n    \"Nik\": \"0000000000000001\",\n    \"DateOfBirth\": \"1990-01-01\",\n    \"Sex\": \"M\",\n    \"Relationship\": \"Principle\",\n    \"MaritalStatus\": \"S\",\n    \"TelephoneMobile\": \"+628000000001\",\n    \"Email\": \"john.doe@example.com\",\n    \"MemberAdress\": \"1 Sample Street, Jakarta\",\n    \"NRIC\": \"\",\n    \"BankInfo\": \"Sample Bank\",\n    \"BankAccountHolder\": \"John Doe\",\n    \"BankAccountNumber\": \"0000000001\",\n    \"BpjsNumber\": \"\",\n    \"Remarks\": \"\",\n    \"MemberSince\": \"2026-01-01\",\n    \"MembersEffectiveDate\": \"2026-01-01\",\n    \"MembersExpiryDate\": \"2026-12-31\",\n    \"UnsuspendDate\": \"\",\n    \"ReinstateDate\": \"\",\n    \"LapseDate\": \"\",\n    \"SuspendDate\": \"\",\n    \"DateTerminated\": \"\",\n    \"PayorID\": \"CLI01\",\n    \"IsVip\": 0,\n    \"ProductCode\": \"PRD001\",\n    \"PlanID\": \"PLAN-001\",\n    \"PolicyNumber\": \"POL0000000000001\",\n    \"Division\": \"\",\n    \"DivisionName\": \"\",\n    \"TelephoneOffice\": \"\",\n    \"CardNumber\": \"9999000000000001\",\n    \"CorporateEmail\": \"hr@example.com\",\n    \"AdditionalData\": [],\n    \"RecordType\": \"N\",\n    \"CorporateID\": \"CORP01\",\n    \"TypeOfWork\": 1,\n    \"Address1\": \"1 Sample Street\",\n    \"BranchCode\": \"\",\n    \"TpaMemberID\": \"\",\n    \"EmploymentStatus\": \"\",\n    \"UpdatedBy\": \"\",\n    \"CreatedBy\": \"integration@example.com\",\n    \"Username\": \"integration@example.com\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/New-Enroll-Member-Bulk"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"processed\": 1,\n        \"failed\": 0,\n        \"rows\": [\n            { \"memberId\": \"MEM00000001\", \"status\": \"OK\" }\n        ]\n    }\n}"},{"id":"765d5bca-9ac0-464b-a2f4-e74d7a13e4ec","name":"Empty array","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"RecordMode\": 1,\n    \"MemberType\": \"Principle\",\n    \"MemberID\": \"MEM00000001\",\n    \"MappingID\": \"\",\n    \"MemberName\": \"John Doe\",\n    \"Nik\": \"0000000000000001\",\n    \"DateOfBirth\": \"1990-01-01\",\n    \"Sex\": \"M\",\n    \"Relationship\": \"Principle\",\n    \"MaritalStatus\": \"S\",\n    \"TelephoneMobile\": \"+628000000001\",\n    \"Email\": \"john.doe@example.com\",\n    \"MemberAdress\": \"1 Sample Street, Jakarta\",\n    \"NRIC\": \"\",\n    \"BankInfo\": \"Sample Bank\",\n    \"BankAccountHolder\": \"John Doe\",\n    \"BankAccountNumber\": \"0000000001\",\n    \"BpjsNumber\": \"\",\n    \"Remarks\": \"\",\n    \"MemberSince\": \"2026-01-01\",\n    \"MembersEffectiveDate\": \"2026-01-01\",\n    \"MembersExpiryDate\": \"2026-12-31\",\n    \"UnsuspendDate\": \"\",\n    \"ReinstateDate\": \"\",\n    \"LapseDate\": \"\",\n    \"SuspendDate\": \"\",\n    \"DateTerminated\": \"\",\n    \"PayorID\": \"CLI01\",\n    \"IsVip\": 0,\n    \"ProductCode\": \"PRD001\",\n    \"PlanID\": \"PLAN-001\",\n    \"PolicyNumber\": \"POL0000000000001\",\n    \"Division\": \"\",\n    \"DivisionName\": \"\",\n    \"TelephoneOffice\": \"\",\n    \"CardNumber\": \"9999000000000001\",\n    \"CorporateEmail\": \"hr@example.com\",\n    \"AdditionalData\": [],\n    \"RecordType\": \"N\",\n    \"CorporateID\": \"CORP01\",\n    \"TypeOfWork\": 1,\n    \"Address1\": \"1 Sample Street\",\n    \"BranchCode\": \"\",\n    \"TpaMemberID\": \"\",\n    \"EmploymentStatus\": \"\",\n    \"UpdatedBy\": \"\",\n    \"CreatedBy\": \"integration@example.com\",\n    \"Username\": \"integration@example.com\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/New-Enroll-Member-Bulk"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"cardNumber\": [\n            \"The cardNumber field is required.\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"6a1d0ac5-888b-4611-b83c-5cab460452ad"}],"id":"f46241f1-1ecb-488c-9bdf-6eef5ca11d9d","description":"<p>Enrol many members in one call.</p>\n<p>Two variants exist and <strong>both are live</strong>:</p>\n<ul>\n<li><strong>Enroll-Member-Bulk</strong> - the original NOVA-style flat record (55 fields), including BPJS fields such as <code>FaskesFKTP</code>, <code>ClassesBPJS</code> and <code>RuleBPJSK</code>.</li>\n<li><strong>New-Enroll-Member-Bulk</strong> - the newer product-based record (48 fields), with <code>ProductCode</code>, split bank account fields and a richer set of lifecycle dates.</li>\n</ul>\n<p>Use the one your integration was set up against; they are not interchangeable.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"212ec31b-47f7-416a-8519-f356bd829520","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"e027bf81-02d9-41ed-9a4f-1e1daf33259f","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"f46241f1-1ecb-488c-9bdf-6eef5ca11d9d"},{"name":"Update Member & Add Dependant","item":[{"name":"Update Member Data","id":"25116f00-4658-4924-b283-d0a7f8a95cb4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Add spouse as dependant\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000002\",\n    \"name\": \"Jane Doe\",\n    \"sex\": \"F\",\n    \"maritalStatus\": \"M\",\n    \"dateOfBirth\": \"1992-01-01\",\n    \"planDescription\": \"Sample Inpatient Plan\",\n    \"bankCode\": \"\",\n    \"memberType\": \"\",\n    \"phoneNumber\": \"+628000000002\",\n    \"principal\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"relationship\": \"Spouse\"\n    }\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-01-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Enroll-Member","description":"<p>Amend an existing member, or add a dependant to an existing principal.</p>\n<p><strong><code>PUT {{base}}/api/Member/Enroll-Member</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Use this for two jobs:</p>\n<ol>\n<li><strong>Correct a member's details</strong> - date of birth, name, phone. Send the member without <code>principal</code>.</li>\n<li><strong>Add a dependant</strong> - send the dependant's details with <code>member.principal</code> set to the principal's member number and the relationship.</li>\n</ol>\n<p>The body is identical in shape to <strong>Enrollment New Member</strong>. The difference is the HTTP method and that the member/policy must already exist - if it does not, the call is refused with <code>MemberOrPolicyNotExist</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>Same as <code>POST /api/Member/Enroll</code>: <code>corporateCode</code>, <code>actionDescription</code>, <code>member</code>, <code>policy</code>, all required. See that endpoint for the full field tables.</p>\n<p>To enrol a dependant:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">\"principal\": { \"memberNumber\": \"MEM00000001\", \"relationship\": \"Spouse\" }\n</code></pre>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Change accepted and applied downstream.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Enroll-Member"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"ce363aaf-5c22-4ba1-ad18-4f4f927f177f","name":"Dependant added","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Add spouse as dependant\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000002\",\n    \"name\": \"Jane Doe\",\n    \"sex\": \"F\",\n    \"maritalStatus\": \"M\",\n    \"dateOfBirth\": \"1992-01-01\",\n    \"planDescription\": \"Sample Inpatient Plan\",\n    \"bankCode\": \"\",\n    \"memberType\": \"\",\n    \"phoneNumber\": \"+628000000002\",\n    \"principal\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"relationship\": \"Spouse\"\n    }\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-01-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Member"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"1b468693-2e3b-44ad-8962-cc1b9ccc2a69","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Add spouse as dependant\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000002\",\n    \"name\": \"Jane Doe\",\n    \"sex\": \"F\",\n    \"maritalStatus\": \"M\",\n    \"dateOfBirth\": \"1992-01-01\",\n    \"planDescription\": \"Sample Inpatient Plan\",\n    \"bankCode\": \"\",\n    \"memberType\": \"\",\n    \"phoneNumber\": \"+628000000002\",\n    \"principal\": {\n      \"memberNumber\": \"MEM00000001\",\n      \"relationship\": \"Spouse\"\n    }\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-01-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Member"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"25116f00-4658-4924-b283-d0a7f8a95cb4"}],"id":"a989b735-bf22-4a0c-a75e-f0c49d6ad67a","description":"<p>Amend an existing member's details, or add a dependant to an existing principal.</p>\n<p>Set <code>member.principal</code> to the principal's member number when enrolling a dependant. Returns <code>202</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"eeb475cb-a119-4ea0-b4d2-effe02a37712","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"7222e142-aa50-4928-9e87-7e32b354b249","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"a989b735-bf22-4a0c-a75e-f0c49d6ad67a"},{"name":"Changes Policy Plan","item":[{"name":"Change-Plan","id":"3d826280-a77a-4b30-a88b-e9e6de2c79c2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Upgrade to PLAN-002\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-01-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-002\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Enroll-Change-Plan","description":"<p>Move a member onto a different plan.</p>\n<p><strong><code>PUT {{base}}/api/Member/Enroll-Change-Plan</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Upgrade or downgrade the plans on an existing policy. <strong><code>member</code> here is the slim form</strong> - member number and optionally the principal, nothing else. The new plans go in <code>policy.plans</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Free-text reason for the change.</td>\n</tr>\n<tr>\n<td><code>member</code></td>\n<td>object</td>\n<td>Yes</td>\n<td><code>{ memberNumber, principal? }</code> - <strong>not</strong> the full member record.</td>\n</tr>\n<tr>\n<td><code>member.memberNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>member.principal</code></td>\n<td>object</td>\n<td>No</td>\n<td><code>{ memberNumber, relationship }</code> when acting on a dependant.</td>\n</tr>\n<tr>\n<td><code>policy</code></td>\n<td>object</td>\n<td>Yes</td>\n<td><code>{ policyNumber, startDate, endDate, plans, remarks? }</code>.</td>\n</tr>\n<tr>\n<td><code>policy.plans</code></td>\n<td>array</td>\n<td>No</td>\n<td>The plans the member should now hold: <code>[{ planCode, isActive }]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Plan change accepted.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Enroll-Change-Plan"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"704b5e28-10e6-4caf-aec4-48b2ff2448dd","name":"Plan changed","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Upgrade to PLAN-002\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-01-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-002\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Change-Plan"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"cd87eeed-6af1-4e50-8e6c-6845bca70fa8","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Upgrade to PLAN-002\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-01-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-002\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Change-Plan"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"3d826280-a77a-4b30-a88b-e9e6de2c79c2"}],"id":"b9224712-607b-4990-be8a-8ba07d228218","description":"<p>Move a member onto a different plan. Returns <code>202</code>.</p>\n<p>Takes only the member number and the policy's plan list - not the full member record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"02fd3b92-7904-4c53-96cd-26191763ad82","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"e5346dd4-9222-4cb8-b39a-51256a1f5050","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"b9224712-607b-4990-be8a-8ba07d228218"},{"name":"Policy Duration","item":[{"name":"Update-Effective","id":"e198757f-8916-4388-93d5-906737839324","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Correct policy start date\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-02-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Enroll-Update-Effective","description":"<p>Change the effective dates of a member's current policy.</p>\n<p><strong><code>PUT {{base}}/api/Member/Enroll-Update-Effective</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Amends the <strong>existing</strong> policy period - use it to correct a start or end date that was entered wrongly. To extend a policy into a <em>new</em> term, use <strong>Renewal</strong> instead.</p>\n<p>Takes the slim <code>member</code> form: member number and optionally the principal.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Free-text reason for the change.</td>\n</tr>\n<tr>\n<td><code>member.memberNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>member.principal</code></td>\n<td>object</td>\n<td>-</td>\n<td>No</td>\n<td><code>{ memberNumber, relationship }</code> for a dependant.</td>\n</tr>\n<tr>\n<td><code>policy.policyNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Policy to amend.</td>\n</tr>\n<tr>\n<td><code>policy.startDate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Corrected start date.</td>\n</tr>\n<tr>\n<td><code>policy.endDate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Corrected end date.</td>\n</tr>\n<tr>\n<td><code>policy.plans</code></td>\n<td>array</td>\n<td>-</td>\n<td>No</td>\n<td><code>[{ planCode, isActive }]</code>.</td>\n</tr>\n<tr>\n<td><code>policy.remarks</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Free-text remarks.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Dates accepted.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Enroll-Update-Effective"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"36104afb-ac9e-4459-89d8-17402f1c79d0","name":"Dates updated","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Correct policy start date\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-02-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Update-Effective"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"1101c78c-d308-4f98-9ebe-7f20a374daa6","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Correct policy start date\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2026-02-01\",\n    \"endDate\": \"2026-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Update-Effective"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"e198757f-8916-4388-93d5-906737839324"},{"name":"Renewal","id":"c657c5dc-79fd-4655-942e-d4ab1fb4d952","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Annual renewal 2027\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2027-01-01\",\n    \"endDate\": \"2027-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Enroll-Renewal","description":"<p>Renew a member's policy into a new term.</p>\n<p><strong><code>PUT {{base}}/api/Member/Enroll-Renewal</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Extends cover into a further period. Send the new term in <code>policy.startDate</code> and <code>policy.endDate</code>. To <em>correct</em> the dates of the current term rather than renew, use <strong>Update-Effective</strong>.</p>\n<p>Body shape is identical to Update-Effective.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Free-text reason, e.g. <code>Annual renewal 2026</code>.</td>\n</tr>\n<tr>\n<td><code>member.memberNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>member.principal</code></td>\n<td>object</td>\n<td>-</td>\n<td>No</td>\n<td><code>{ memberNumber, relationship }</code> for a dependant.</td>\n</tr>\n<tr>\n<td><code>policy.policyNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Policy being renewed.</td>\n</tr>\n<tr>\n<td><code>policy.startDate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>New term start.</td>\n</tr>\n<tr>\n<td><code>policy.endDate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>New term end.</td>\n</tr>\n<tr>\n<td><code>policy.plans</code></td>\n<td>array</td>\n<td>-</td>\n<td>No</td>\n<td>Plans for the new term.</td>\n</tr>\n<tr>\n<td><code>policy.remarks</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Free-text remarks.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Renewal accepted.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Enroll-Renewal"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"431a31b8-1035-4789-b4eb-a976d3e96a88","name":"Policy renewed","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Annual renewal 2027\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2027-01-01\",\n    \"endDate\": \"2027-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Renewal"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"cd57b143-5033-44bc-8ef0-be7e0e6cd239","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"PUT","header":[{"key":"accept","value":"text/plain"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Annual renewal 2027\",\n  \"member\": {\n    \"memberNumber\": \"MEM00000001\",\n    \"principal\": null\n  },\n  \"policy\": {\n    \"policyNumber\": \"POL0000000000001\",\n    \"startDate\": \"2027-01-01\",\n    \"endDate\": \"2027-12-31\",\n    \"plans\": [\n      { \"planCode\": \"PLAN-001\", \"isActive\": true }\n    ],\n    \"remarks\": \"\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Enroll-Renewal"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"c657c5dc-79fd-4655-942e-d4ab1fb4d952"}],"id":"df1f9e49-b6fc-49a2-9f1b-e346814e8369","description":"<p>Change a policy's effective dates, or renew it for a further term. Both return <code>202</code>.</p>\n<p><strong>Update-Effective</strong> amends the current policy period. <strong>Renewal</strong> extends it into a new one.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"f8672200-ac80-4eeb-86fb-c5575522fa50","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"5162fae1-40e2-47e6-bc2d-cd0683252337","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"df1f9e49-b6fc-49a2-9f1b-e346814e8369"},{"name":"Deactivate Member","item":[{"name":"Terminate","id":"0725789d-4453-4bd0-9aa7-64730def45b2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Employment ended\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Terminate","description":"<p>Terminate a member's policy.</p>\n<p><strong><code>POST {{base}}/api/Member/Terminate</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Ends cover. Reverse it with <strong>ReActivate</strong>, which re-enrols the member - not with Reinstate, which only lifts a suspension.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Policy to terminate.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Free-text reason for the termination.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Termination accepted. Returned records show <code>memberStatus: \"TERMINATE\"</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Terminate"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"dc851794-7a24-4dc0-980e-ebe242b5e9cc","name":"Terminated","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Employment ended\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Terminate"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"TERMINATE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"3c5f65b6-bc9b-42f6-bc65-13df44ae7e73","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Employment ended\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Terminate"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"0725789d-4453-4bd0-9aa7-64730def45b2"},{"name":"Suspend","id":"37089096-93e8-4590-9ce0-9db9d3fb6f4b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium unpaid - suspend pending payment\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Suspend","description":"<p>Suspend a member's policy.</p>\n<p><strong><code>POST {{base}}/api/Member/Suspend</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Takes cover out of force temporarily - claims are refused while suspended. <strong>Reverse it with Reinstate</strong>, not ReActivate.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Policy to suspend.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Free-text reason for the suspension.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Suspension accepted. Returned records show <code>memberStatus: \"SUSPEND\"</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","Suspend"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"5fb3e4bd-a4d2-402b-a4fb-71fa5fea67bc","name":"Suspended","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium unpaid - suspend pending payment\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Suspend"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"SUSPEND\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"7824e4fc-08d3-4292-9067-3a24b509d26b","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium unpaid - suspend pending payment\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Suspend"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"37089096-93e8-4590-9ce0-9db9d3fb6f4b"},{"name":"Reinstate","id":"203039e1-3ade-4ea2-b600-bfe738daeb40","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium received - lift suspension\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/Reinstate","description":"<p>Reverse a suspension and put the policy back in force.</p>\n<p><strong><code>POST {{base}}/api/Member/Reinstate</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>202 Accepted</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The counterpart to <strong>Suspend</strong>. For a <em>terminated</em> member use <strong>ReActivate</strong> instead - the two are not interchangeable.</p>\n<p><strong>Reinstating a member who is not suspended is a no-op</strong>, not an error: the call returns <code>200</code> and changes nothing. Safe to retry.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Policy to reinstate.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Free-text reason for the reinstatement.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>202</code></td>\n<td>Reinstatement accepted.</td>\n</tr>\n<tr>\n<td><code>200</code></td>\n<td>Member was not suspended - request ignored.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":true,"source":{"_postman_id":"2f2a70fe-2034-4b14-a9ca-5edcbf92dd21","id":"2f2a70fe-2034-4b14-a9ca-5edcbf92dd21","name":"Deactivate Member","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Member","Reinstate"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"0bbf52c8-7a7f-45dd-874b-cac20309a3ed","name":"Reinstated","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium received - lift suspension\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Reinstate"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"bc9bf8db-d359-42a0-a7c7-9a4759af658d","name":"Not suspended - request ignored","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium received - lift suspension\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Reinstate"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"4d72d13d-84cb-42bd-8b2e-8f0e7b67e347","name":"No such member or policy","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Premium received - lift suspension\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/Reinstate"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"203039e1-3ade-4ea2-b600-bfe738daeb40"}],"id":"2f2a70fe-2034-4b14-a9ca-5edcbf92dd21","description":"<p>Take a member's policy out of force.</p>\n<p><strong>Suspend</strong> is reversible with <strong>Reinstate</strong>. <strong>Terminate</strong> is reversed with <strong>ReActivate</strong>, which re-enrols the member. Both return <code>202</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"340bd170-278f-4943-bacf-77c29437777c","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"e4a8f70f-4f4c-4477-b9e1-4a95276d0232","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"2f2a70fe-2034-4b14-a9ca-5edcbf92dd21"},{"name":"Re-Active","item":[{"name":"ReActivate","id":"1b73975e-7971-4bb7-bd28-5c76f73e7e2e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"},{"key":"Authorization","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Rehired - re-enrol member\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/ReActivate","description":"<p>Re-enrol a terminated member.</p>\n<p><strong><code>POST {{base}}/api/Member/ReActivate</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Success</strong></td>\n<td><code>200 OK</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Brings a terminated member back into force. <strong>Note this returns <code>200</code>, unlike the other lifecycle actions which return <code>202</code>.</strong></p>\n<p>For a <em>suspended</em> member use <strong>Reinstate</strong> instead.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Policy to re-activate.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The corporate the member belongs to.</td>\n</tr>\n<tr>\n<td><code>actionDescription</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Free-text reason for the re-activation.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Re-enrolment accepted.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No such member/policy, or a field failed validation.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data[]</code></h3>\n<p>Every enrolment endpoint returns the same array of member records. All are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Your member identifier, as supplied.</td>\n</tr>\n<tr>\n<td><code>memberPrincipalNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The principal's member number. <code>null</code> for a principal.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Mobile number.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>ACTIVE</code>, <code>SUSPEND</code>, <code>TERMINATE</code>.</td>\n</tr>\n<tr>\n<td><code>familyStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Principle</code>, <code>Spouse</code>, <code>Child</code>.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>Policy the record belongs to.</td>\n</tr>\n<tr>\n<td><code>planCode</code></td>\n<td>string[]</td>\n<td>No</td>\n<td>Plan codes on the policy. Split from a semicolon-delimited downstream value, so an empty policy yields <code>[]</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The array contains the member you acted on <strong>and</strong> any family members affected by the same change.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>MemberAndPolicyExist</code></td>\n<td>Policy for this member already exist. To update the plan, please use PUT method instead.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>Policy for this member not exist.</td>\n</tr>\n<tr>\n<td>400</td>\n<td><em>(RFC 7807)</em></td>\n<td>A required field was missing or mistyped - see <code>errors</code>.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>-</td>\n<td>Missing or expired token. Empty body.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","ReActivate"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"52f20dd5-aa6b-4ee2-bf3f-58a789761343","name":"Re-enrolled","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"},{"key":"Authorization","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Rehired - re-enrol member\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ReActivate"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"memberNumber\": \"MEM00000001\",\n            \"memberPrincipalNumber\": null,\n            \"name\": \"John Doe\",\n            \"phoneNumber\": \"+628000000001\",\n            \"dateOfBirth\": \"1990-01-01\",\n            \"memberStatus\": \"ACTIVE\",\n            \"familyStatus\": \"Principle\",\n            \"policyNumber\": \"POL0000000000001\",\n            \"planCode\": [\n                \"PLAN-001\"\n            ]\n        }\n    ]\n}"},{"id":"6f2b9885-4750-4afd-a110-bdab9c6c9cd5","name":"No such member or policy","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"},{"key":"Authorization","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"memberNumber\": \"MEM00000001\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"corporateCode\": \"CORP01\",\n  \"actionDescription\": \"Rehired - re-enrol member\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ReActivate"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MemberOrPolicyNotExist\",\n            \"Message\": \"Policy for this member not exist.\"\n        }\n    ]\n}"}],"_postman_id":"1b73975e-7971-4bb7-bd28-5c76f73e7e2e"}],"id":"6517676a-a5c8-4d96-8250-5e148a1133b2","description":"<p>Re-enrol a terminated member. Returns <code>200</code>.</p>\n<p>For a <em>suspended</em> member use <strong>Reinstate</strong> instead - ReActivate will not do what you want.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"1665be14-ea3d-49a8-be8f-16fb81d4917c","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"3d64aa00-18f7-4e44-a482-9205a89a8486","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"6517676a-a5c8-4d96-8250-5e148a1133b2"}],"id":"2d2b97ff-a068-48e0-bea4-09466fee41be","description":"<p>Create and maintain members and their policies.</p>\n<p>All enrolment endpoints return the <code>{\"data\": [...]}</code> envelope with an array of member records, and use <code>201</code> for creation or <code>202</code> for an applied change - not <code>200</code>.</p>\n<p>Sequence: create the principal with <strong>Enrollment New Member</strong>, then add dependants or amend details with <strong>Update Member Data</strong>. Plan, date and lifecycle changes each have their own endpoint.</p>\n","_postman_id":"2d2b97ff-a068-48e0-bea4-09466fee41be","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}}},{"name":"Claim","item":[{"name":"List Claim per Member","id":"ea7bb798-a56e-42d1-bbb9-17794a57f929","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/GetListClaim","description":"<p>List a member's guarantee letters and claims.</p>\n<p><strong><code>POST {{base}}/api/Member/GetListClaim</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>C</strong> - no envelope; paging and <code>listGL</code> at the root</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns every claim raised for a member's card, newest first, as a paged list. Use <strong>Detail Claim</strong> for the full record of any one of them.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>-</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Caller's email, recorded downstream.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>No</td>\n<td>-</td>\n<td>Paging.</td>\n</tr>\n<tr>\n<td><code>page.page</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>page.pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size.</td>\n</tr>\n<tr>\n<td><code>page.query</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>null</code></td>\n<td>Free-text search.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The page of claims. Empty <code>listGL</code> when the member has none.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>cardNumber</code> missing - RFC 7807 with <code>traceId</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<p>Paging sits at the <strong>root</strong>, not inside a wrapper.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Current page.</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Page size.</td>\n</tr>\n<tr>\n<td><code>totalItems</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Total claims for this card.</td>\n</tr>\n<tr>\n<td><code>totalPages</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Total pages.</td>\n</tr>\n<tr>\n<td><code>listGL</code></td>\n<td>array</td>\n<td>No</td>\n<td>The claims. Empty array when none.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>listGL[]</code></strong> - <code>claimNumber</code>, <code>glNumber</code>, <code>cardNumber</code>, <code>memberName</code>, <code>providerName</code>, <code>planDetailName</code>, <code>planDetailCode</code>, <code>diagnosis1</code> and related fields. <code>claimStatus</code> is a <strong>numeric status code</strong> here, not a label - see Detail Claim for both the code and its display name.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Member","GetListClaim"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"191270bf-cd18-449f-81fa-eedfb7feea9a","name":"Page of claims","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/GetListClaim"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"page\": 1,\n    \"pageSize\": 10,\n    \"totalItems\": 1,\n    \"totalPages\": 1,\n    \"listGL\": [\n        {\n            \"claimNumber\": \"CL2601010000001H\",\n            \"claimStatus\": 304,\n            \"cardNumber\": \"9999000000000001\",\n            \"glNumber\": \"GL00000001\",\n            \"memberName\": \"John Doe\",\n            \"providerName\": \"Sample Clinic\",\n            \"planDetailName\": null,\n            \"planDetailCode\": null,\n            \"diagnosis1\": \"Sample diagnosis\"\n        }\n    ]\n}"},{"id":"2e244456-9e3c-445b-ba8a-41d9b6389e81","name":"No claims","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/GetListClaim"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"page\": 1,\n    \"pageSize\": 10,\n    \"totalItems\": 0,\n    \"totalPages\": 0,\n    \"listGL\": []\n}"},{"id":"501fd340-b356-4499-bd01-a15e45097a46","name":"cardNumber missing","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/GetListClaim"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"cardNumber\": [\n            \"The cardNumber field is required.\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"ea7bb798-a56e-42d1-bbb9-17794a57f929"},{"name":"Detail Claim","id":"2933369e-be7d-4824-b348-ef2b2d6195c7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/GetDataClaim","description":"<p>Read one claim in full, including its status history.</p>\n<p><strong><code>POST {{base}}/api/Member/GetDataClaim</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>C</strong> - no envelope; root key <code>claims</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The full record for a single claim. Identify the claim by <strong>both</strong> card number and claim number.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim to read.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>No</td>\n<td>Caller's email, recorded downstream.</td>\n</tr>\n<tr>\n<td><code>clientCode</code></td>\n<td>string</td>\n<td>No</td>\n<td>Client code, where the downstream requires it.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Both <code>cardNumber</code> and <code>claimNumber</code> are checked in the handler - omitting either returns <code>400</code>.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The claim, under <code>claims</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>cardNumber</code> or <code>claimNumber</code> missing.</td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td>Downstream failure - <code>{\"Status\":500,\"Errors\":[{\"ErrorCode\":\"InternalServerError\",\"Message\":\"Internal server error. Please contact the client support.\"}]}</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---claims\">Response fields - <code>claims</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim number.</td>\n</tr>\n<tr>\n<td><code>claimType</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>e.g. <code>CASHLESS</code>.</td>\n</tr>\n<tr>\n<td><code>benefitType</code></td>\n<td>object</td>\n<td>Yes</td>\n<td><code>{ type, display }</code> - e.g. <code>INPATIENT</code>.</td>\n</tr>\n<tr>\n<td><code>claimStatusCode</code></td>\n<td>integer</td>\n<td>Yes</td>\n<td>Numeric status.</td>\n</tr>\n<tr>\n<td><code>claimStatus</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Status label, e.g. <code>Admission Review</code>.</td>\n</tr>\n<tr>\n<td><code>lastStatusDate</code></td>\n<td>string(date-time)</td>\n<td>Yes</td>\n<td>When the status last changed.</td>\n</tr>\n<tr>\n<td><code>createdDate</code>, <code>updatedDate</code></td>\n<td>string(date-time)</td>\n<td>Yes</td>\n<td>Audit timestamps.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Both the numeric <code>claimStatusCode</code> and the human-readable <code>claimStatus</code> are returned - match on the code, display the label.</p>\n<p><strong>A <code>500</code> here is frequently a downstream NOVA problem rather than a bad request.</strong> Retry once before escalating, and quote the claim number.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Member","GetDataClaim"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"cbb95246-a9d4-426d-842a-caac47a1a997","name":"Claim detail","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/GetDataClaim"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"claims\": {\n        \"claimNumber\": \"CL2601010000001H\",\n        \"createdDate\": \"2026-01-01T12:02:53.776192\",\n        \"updatedDate\": \"2026-01-01T12:04:11.551473\",\n        \"claimType\": \"CASHLESS\",\n        \"benefitType\": {\n            \"type\": \"INPATIENT\",\n            \"display\": \"INPATIENT\"\n        },\n        \"claimStatusCode\": 4,\n        \"claimStatus\": \"Admission Review\",\n        \"lastStatusDate\": \"2026-01-01T12:04:11.551473\"\n    }\n}"},{"id":"8d72dd16-c496-47df-8e64-d119743dcf58","name":"Downstream failure","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/GetDataClaim"},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 500,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"InternalServerError\",\n            \"Message\": \"Internal server error. Please contact the client support.\"\n        }\n    ]\n}"}],"_postman_id":"2933369e-be7d-4824-b348-ef2b2d6195c7"},{"name":"Submit Reimbursement Claim","id":"95a8890d-3a67-464a-b5fd-068ae8b85dbb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"benefitType\": \"INPATIENT\",\n  \"dateOfAdmission\": \"2026-01-01T00:00:00Z\",\n  \"dateOfDischarge\": \"2026-01-03T00:00:00Z\",\n  \"receiptDate\": \"2026-01-03T00:00:00Z\",\n  \"receiptAmount\": {\n    \"currencyCode\": \"IDR\",\n    \"amount\": 2500000\n  },\n  \"provider\": {\n    \"name\": \"Sample Clinic\",\n    \"address\": \"1 Sample Street, Jakarta\",\n    \"coordinates\": \"-6.200000,106.800000\"\n  },\n  \"doctors\": \"Dr. Sample\",\n  \"diagnoses\": \"Sample diagnosis\",\n  \"remarks\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Claims/SubmitClaim","description":"<p>Submit a reimbursement claim with receipt details.</p>\n<p><strong><code>POST {{base}}/api/Claims/SubmitClaim</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\", \"data\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Raises a reimbursement claim for treatment the member has already paid for. Upload the supporting documents afterwards with <strong>Upload Docs</strong>, using the claim number this call returns.</p>\n<p>For cashless claims use <strong>SubmitClaimCashless</strong> instead.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>benefitType</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>e.g. <code>INPATIENT</code>, <code>OUTPATIENT</code>.</td>\n</tr>\n<tr>\n<td><code>dateOfAdmission</code></td>\n<td>string</td>\n<td>date-time</td>\n<td>Yes</td>\n<td>Admission date.</td>\n</tr>\n<tr>\n<td><code>dateOfDischarge</code></td>\n<td>string</td>\n<td>date-time</td>\n<td>Yes</td>\n<td>Discharge date.</td>\n</tr>\n<tr>\n<td><code>receiptDate</code></td>\n<td>string</td>\n<td>date-time</td>\n<td>Yes</td>\n<td>Date on the receipt.</td>\n</tr>\n<tr>\n<td><code>receiptAmount</code></td>\n<td>object</td>\n<td>-</td>\n<td>Yes</td>\n<td><code>{ currencyCode, amount }</code>.</td>\n</tr>\n<tr>\n<td><code>receiptAmount.currencyCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>e.g. <code>IDR</code>.</td>\n</tr>\n<tr>\n<td><code>receiptAmount.amount</code></td>\n<td>number</td>\n<td>decimal</td>\n<td>Yes</td>\n<td>Receipt total.</td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td>object</td>\n<td>-</td>\n<td>Yes</td>\n<td><code>{ name, address, coordinates }</code>.</td>\n</tr>\n<tr>\n<td><code>doctors</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Treating doctor(s).</td>\n</tr>\n<tr>\n<td><code>diagnoses</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Diagnosis text.</td>\n</tr>\n<tr>\n<td><code>remarks</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Free-text remarks.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Dates on this endpoint are full ISO-8601 datetimes (<code>2026-01-01T00:00:00Z</code>), not <code>yyyy-MM-dd</code>.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Submitted. Check <code>isSuccess</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Validation failure - also carries <code>{\"isSuccess\": false, …}</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the claim was accepted.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>Yes</td>\n<td>The created claim, including its claim number - keep it for <strong>Upload Docs</strong>.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Claims","SubmitClaim"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"a5af2cea-52bc-40ea-8174-2149582e0335","name":"Claim submitted","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"benefitType\": \"INPATIENT\",\n  \"dateOfAdmission\": \"2026-01-01T00:00:00Z\",\n  \"dateOfDischarge\": \"2026-01-03T00:00:00Z\",\n  \"receiptDate\": \"2026-01-03T00:00:00Z\",\n  \"receiptAmount\": {\n    \"currencyCode\": \"IDR\",\n    \"amount\": 2500000\n  },\n  \"provider\": {\n    \"name\": \"Sample Clinic\",\n    \"address\": \"1 Sample Street, Jakarta\",\n    \"coordinates\": \"-6.200000,106.800000\"\n  },\n  \"doctors\": \"Dr. Sample\",\n  \"diagnoses\": \"Sample diagnosis\",\n  \"remarks\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/SubmitClaim"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"claimNumber\": \"CL2601010000001H\"\n    }\n}"},{"id":"5beabe4c-83e9-4bdd-abc1-933d5ff28e82","name":"Validation failure","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"benefitType\": \"INPATIENT\",\n  \"dateOfAdmission\": \"2026-01-01T00:00:00Z\",\n  \"dateOfDischarge\": \"2026-01-03T00:00:00Z\",\n  \"receiptDate\": \"2026-01-03T00:00:00Z\",\n  \"receiptAmount\": {\n    \"currencyCode\": \"IDR\",\n    \"amount\": 2500000\n  },\n  \"provider\": {\n    \"name\": \"Sample Clinic\",\n    \"address\": \"1 Sample Street, Jakarta\",\n    \"coordinates\": \"-6.200000,106.800000\"\n  },\n  \"doctors\": \"Dr. Sample\",\n  \"diagnoses\": \"Sample diagnosis\",\n  \"remarks\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/SubmitClaim"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": false,\n    \"data\": \"Receipt amount must be greater than zero.\"\n}"}],"_postman_id":"95a8890d-3a67-464a-b5fd-068ae8b85dbb"},{"name":"Upload Docs","id":"97017c4b-1c5c-4153-9680-72a04088fe11","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"files","type":"file","description":"<p>One or more files. Repeat this field per file.</p>\n","src":[]}]},"url":"{{base}}/{{apiVersion}}/api/Claims/Upload/:claimNumber","description":"<p>Attach supporting documents to a claim.</p>\n<p><strong><code>POST {{base}}/api/Claims/Upload/{claimNumber}</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><strong><code>multipart/form-data</code></strong></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\", \"data\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Uploads one or more files against an existing claim - typically receipts and medical reports for a reimbursement raised with <strong>Submit Reimbursement</strong>.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim to attach to.</td>\n</tr>\n<tr>\n<td><code>files</code></td>\n<td>form-data</td>\n<td>file[]</td>\n<td>Yes</td>\n<td>One or more files. <strong>The form field must be named <code>files</code></strong>, repeated once per file.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Send this as <code>multipart/form-data</code>, not JSON. Do not set <code>Content-Type</code> by hand - let your HTTP client set it with the boundary.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Processed. <strong>Check <code>isSuccess</code></strong> - a downstream failure also returns <code>200</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>No file supplied. The body is the <strong>plain string</strong> <code>No file uploaded.</code>, not JSON.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the upload was accepted downstream.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>Yes</td>\n<td>Per-file outcome.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>File types are not restricted by the API.</strong> The intended allow-list (PDF, JPEG, PNG, BMP, WebP) is not currently enforced, so validate on your side before uploading - an unexpected type will be accepted here and may fail later in processing.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Claims","Upload",":claimNumber"],"host":["{{base}}"],"query":[],"variable":[{"description":{"content":"<p>The claim to attach documents to.</p>\n","type":"text/plain"},"type":"any","value":"CL2601010000001H","key":"claimNumber"}]}},"response":[{"id":"5afb4b23-eab9-4adc-a57a-d95570c165eb","name":"Files uploaded","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"files","type":"file","description":"One or more files. Repeat this field per file.","src":[]}]},"url":{"raw":"{{base}}/api/Claims/Upload/:claimNumber","host":["{{base}}"],"path":["api","Claims","Upload",":claimNumber"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim to attach documents to."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"uploaded\": 1,\n        \"files\": [\n            { \"name\": \"receipt.pdf\", \"status\": \"VALID\" }\n        ]\n    }\n}"},{"id":"fa5c5d7d-0cc1-4f4c-a1a4-d7b8a9ef5ee1","name":"No file supplied - plain text body","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"files","type":"file","description":"One or more files. Repeat this field per file.","src":[]}]},"url":{"raw":"{{base}}/api/Claims/Upload/:claimNumber","host":["{{base}}"],"path":["api","Claims","Upload",":claimNumber"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim to attach documents to."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"No file uploaded."}],"_postman_id":"97017c4b-1c5c-4153-9680-72a04088fe11"},{"name":"Download IGL","id":"216da932-17ce-41cb-b669-61cc2b9d7bbd","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/DownloadIGL","description":"<p>Download the Initial Guarantee Letter as a PDF.</p>\n<p><strong><code>POST {{base}}/api/Member/DownloadIGL</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Returns</strong></td>\n<td><strong><code>application/pdf</code></strong> - a binary file, not JSON</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns the IGL for a claim as a PDF attachment named <code>IGL_{glNumber}.pdf</code>.</p>\n<p><strong>This endpoint does not return JSON.</strong> Do not attempt to parse the body - write it to a file or stream it to the user.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim whose IGL you want.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>No</td>\n<td>Caller's email, recorded downstream.</td>\n</tr>\n<tr>\n<td><code>clientCode</code></td>\n<td>string</td>\n<td>No</td>\n<td>Client code, where the downstream requires it.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Content-Type</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td><code>application/pdf</code></td>\n<td>The IGL.</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>-</td>\n<td><strong>No IGL content available</strong> - either the claim has no initial guarantee letter yet, or the claim does not exist. The two cases are not distinguished.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>-</td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><p>A <code>404</code> is the normal answer for a claim that has not reached IGL issue yet; it is not necessarily an error in your request.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Member","DownloadIGL"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"95855746-035d-4283-9348-223ec08ebf5d","name":"PDF returned - binary body","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/DownloadIGL"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"92ef2f2e-10d6-468e-914d-65c4c623f47f","name":"No guarantee letter available","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/DownloadIGL"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"216da932-17ce-41cb-b669-61cc2b9d7bbd"},{"name":"Download FGL","id":"4c522d3f-9859-44a1-b593-7a86e478ca26","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/DownloadFGL","description":"<p>Download the Final Guarantee Letter as a PDF.</p>\n<p><strong><code>POST {{base}}/api/Member/DownloadFGL</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Returns</strong></td>\n<td><strong><code>application/pdf</code></strong> - a binary file, not JSON</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns the FGL for a claim as a PDF attachment named <code>FGL_{glNumber}.pdf</code>. Same contract as <strong>DownloadIGL</strong>, but reads the final rather than the initial letter.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim whose FGL you want.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>No</td>\n<td>Caller's email, recorded downstream.</td>\n</tr>\n<tr>\n<td><code>clientCode</code></td>\n<td>string</td>\n<td>No</td>\n<td>Client code, where the downstream requires it.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Content-Type</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td><code>application/pdf</code></td>\n<td>The FGL.</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>-</td>\n<td>No FGL content available - typically the claim has not been finalised.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>-</td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><p>A claim that has an IGL but no FGL yet returns <code>200</code> from <strong>DownloadIGL</strong> and <code>404</code> from this endpoint. That is expected.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Member","DownloadFGL"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"d394f2a2-b7d3-4733-ba26-7e5c06abfb46","name":"PDF returned - binary body","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/DownloadFGL"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"4df631ad-4516-4a6c-9f35-df5c67c6cc3c","name":"No guarantee letter available","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"claimNumber\": \"CL2601010000001H\",\n  \"email\": \"\",\n  \"clientCode\": \"CLI01\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/DownloadFGL"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"4c522d3f-9859-44a1-b593-7a86e478ca26"},{"name":"Validate Cashless Eligibility","id":"ce1ad6e8-1454-43ce-80e4-017cac4f70aa","request":{"method":"GET","header":[],"url":"{{base}}/{{apiVersion}}/api/Claims/ValidationCashless?ProviderCode=PRV001&CardNo=9999000000000001&Dob=1990-01-01","description":"<p>Check a member's cashless eligibility at a provider before creating a claim.</p>\n<p><strong><code>GET {{base}}/api/Claims/ValidationCashless</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>C</strong> - the payload is returned bare, with no wrapper</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The v1/v2 equivalent of V3's member-eligibility check. Confirms the member is in force and returns the benefit information a provider needs before submitting a cashless claim via <strong>SubmitClaimCashless</strong>.</p>\n<p>Identify the member by <strong>either</strong> card number <strong>or</strong> policy number - at least one is required - plus date of birth and the provider code.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ProviderCode</code></td>\n<td>query</td>\n<td>string</td>\n<td>Yes</td>\n<td>The provider checking eligibility.</td>\n</tr>\n<tr>\n<td><code>CardNo</code></td>\n<td>query</td>\n<td>string</td>\n<td>Conditional</td>\n<td>Member's card number. Required unless <code>PolicyNo</code> is supplied.</td>\n</tr>\n<tr>\n<td><code>PolicyNo</code></td>\n<td>query</td>\n<td>string</td>\n<td>Conditional</td>\n<td>Policy number. Required unless <code>CardNo</code> is supplied.</td>\n</tr>\n<tr>\n<td><code>Dob</code></td>\n<td>query</td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's date of birth.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Eligibility data, returned bare.</td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td><strong>Also used for validation failures</strong> - see below.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"this-endpoint-reports-missing-parameters-as-http-500\">This endpoint reports missing parameters as HTTP 500</h3>\n<p>Unusually, a missing parameter does <strong>not</strong> return <code>400</code>. It returns <code>500</code> with a <strong>plain-text</strong> body:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Body</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Please fill Card Number or Policy Number.</code></td>\n<td>Neither <code>CardNo</code> nor <code>PolicyNo</code> supplied.</td>\n</tr>\n<tr>\n<td><code>Please fill ProviderCode</code></td>\n<td><code>ProviderCode</code> missing.</td>\n</tr>\n<tr>\n<td><code>Please fill Date Of Birth</code></td>\n<td><code>Dob</code> missing.</td>\n</tr>\n</tbody>\n</table>\n</div><p>A downstream refusal also returns <code>500</code>, carrying the downstream reason as plain text. <strong>Do not assume a <code>500</code> here is a server fault</strong> - read the body, and treat a short plain-text body as a validation message rather than an outage.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Claims","ValidationCashless"],"host":["{{base}}"],"query":[{"description":{"content":"<p>The provider checking eligibility.</p>\n","type":"text/plain"},"key":"ProviderCode","value":"PRV001"},{"description":{"content":"<p>Member's card number. Required unless PolicyNo is supplied.</p>\n","type":"text/plain"},"key":"CardNo","value":"9999000000000001"},{"disabled":true,"description":{"content":"<p>Policy number. Required unless CardNo is supplied.</p>\n","type":"text/plain"},"key":"PolicyNo","value":""},{"description":{"content":"<p>Member's date of birth.</p>\n","type":"text/plain"},"key":"Dob","value":"1990-01-01"}],"variable":[]}},"response":[{"id":"4c387be1-7d26-4f9c-bd5b-06e953286228","name":"Eligible","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Claims/ValidationCashless?ProviderCode=PRV001&CardNo=9999000000000001&Dob=1990-01-01","host":["{{base}}"],"path":["api","Claims","ValidationCashless"],"query":[{"key":"ProviderCode","value":"PRV001","description":"The provider checking eligibility."},{"key":"CardNo","value":"9999000000000001","description":"Member's card number. Required unless PolicyNo is supplied."},{"key":"PolicyNo","value":"","description":"Policy number. Required unless CardNo is supplied.","disabled":true},{"key":"Dob","value":"1990-01-01","description":"Member's date of birth."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"cardNumber\": \"9999000000000001\",\n    \"memberName\": \"John Doe\",\n    \"policyNumber\": \"POL0000000000001\",\n    \"memberStatus\": true,\n    \"isSuspended\": false,\n    \"planCode\": \"PLAN-001\",\n    \"idBenefit\": 10000001,\n    \"benefitCode\": \"IP\",\n    \"benefitName\": \"INPATIENT\"\n}"},{"id":"95c1a050-4cec-4d98-ae94-4bc9c6a813bc","name":"Card and policy both missing - note HTTP 500","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Claims/ValidationCashless?ProviderCode=PRV001&CardNo=9999000000000001&Dob=1990-01-01","host":["{{base}}"],"path":["api","Claims","ValidationCashless"],"query":[{"key":"ProviderCode","value":"PRV001","description":"The provider checking eligibility."},{"key":"CardNo","value":"9999000000000001","description":"Member's card number. Required unless PolicyNo is supplied."},{"key":"PolicyNo","value":"","description":"Policy number. Required unless CardNo is supplied.","disabled":true},{"key":"Dob","value":"1990-01-01","description":"Member's date of birth."}]}},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"Please fill Card Number or Policy Number."},{"id":"117ef88a-aea2-40c5-9705-30de5788fb49","name":"ProviderCode missing - note HTTP 500","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Claims/ValidationCashless?ProviderCode=PRV001&CardNo=9999000000000001&Dob=1990-01-01","host":["{{base}}"],"path":["api","Claims","ValidationCashless"],"query":[{"key":"ProviderCode","value":"PRV001","description":"The provider checking eligibility."},{"key":"CardNo","value":"9999000000000001","description":"Member's card number. Required unless PolicyNo is supplied."},{"key":"PolicyNo","value":"","description":"Policy number. Required unless CardNo is supplied.","disabled":true},{"key":"Dob","value":"1990-01-01","description":"Member's date of birth."}]}},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"Please fill ProviderCode"}],"_postman_id":"ce1ad6e8-1454-43ce-80e4-017cac4f70aa"},{"name":"Submit Cashless Claim","id":"8ecb42dd-4832-4260-bca3-fb63e9006d8b","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 0,\n  \"cardNumber\": \"9999000000000001\",\n  \"providerCode\": \"PRV001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerEmail\": \"provider@example.com\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"claimDate\": \"2026-01-01T00:00:00Z\",\n  \"indate\": \"2026-01-01T00:00:00Z\",\n  \"outdate\": null,\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"doctor\": \"Dr. Sample\",\n  \"phone\": \"+628000000001\",\n  \"medicalRecord\": \"\",\n  \"referralSource\": \"\",\n  \"icdCode1\": \"A09\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"los\": 0,\n  \"stPost\": false,\n  \"stPaid\": false,\n  \"stExgratia\": false,\n  \"descExgratia\": \"\",\n  \"sickLeave\": 0,\n  \"submitBy\": \"provider@example.com\",\n  \"stHighPlan\": false,\n  \"remark\": \"\",\n  \"createdBy\": \"provider@example.com\",\n  \"idBenefit\": 10000001,\n  \"benefitCode\": \"IP\",\n  \"benefitName\": \"INPATIENT\",\n  \"treatmentType\": \"Rawat inap\",\n  \"benefitDetail\": null,\n  \"member\": {\n    \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n    \"memberName\": \"John Doe\",\n    \"cardNumber\": \"9999000000000001\",\n    \"nik\": \"0000000000000001\",\n    \"dateOfBirth\": \"1990-01-01\",\n    \"gender\": \"M\",\n    \"maritalStatus\": \"S\",\n    \"memberType\": \"Principal\",\n    \"memberStatus\": true,\n    \"isSuspended\": false,\n    \"isVip\": 0,\n    \"isAso\": false,\n    \"isIndividual\": false,\n    \"joinDate\": \"2026-01-01T00:00:00Z\",\n    \"policyNumber\": \"POL0000000000001\",\n    \"policyStart\": \"2026-01-01T00:00:00Z\",\n    \"policyEnd\": \"2026-12-31T00:00:00Z\",\n    \"planCode\": \"PLAN-001\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Claims/SubmitClaimCashless","description":"<p>Submit a cashless claim on behalf of a provider.</p>\n<p><strong><code>POST {{base}}/api/Claims/SubmitClaimCashless</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\", \"data\", \"message\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Creates a cashless claim. Run <strong>ValidationCashless</strong> first - it confirms the member is in force and supplies the benefit identifiers this call needs.</p>\n<p>For reimbursement claims use <strong>Submit Reimbursement</strong> (<code>Claims/SubmitClaim</code>) instead; the two are separate flows with different payloads.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>Required:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>providerCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Provider submitting the claim.</td>\n</tr>\n<tr>\n<td><code>providerName</code></td>\n<td>string</td>\n<td>-</td>\n<td>Provider name.</td>\n</tr>\n<tr>\n<td><code>providerAddress</code></td>\n<td>string</td>\n<td>-</td>\n<td>Provider address.</td>\n</tr>\n<tr>\n<td><code>providerCity</code></td>\n<td>string</td>\n<td>-</td>\n<td>Provider city.</td>\n</tr>\n<tr>\n<td><code>claimDate</code></td>\n<td>string</td>\n<td>date-time</td>\n<td>When the claim is raised.</td>\n</tr>\n<tr>\n<td><code>treatmentType</code></td>\n<td>string</td>\n<td>-</td>\n<td>Treatment type.</td>\n</tr>\n<tr>\n<td><code>createdBy</code></td>\n<td>string</td>\n<td>-</td>\n<td>Who submitted it.</td>\n</tr>\n<tr>\n<td><code>idBenefit</code></td>\n<td>integer</td>\n<td>-</td>\n<td>Benefit identifier from ValidationCashless.</td>\n</tr>\n<tr>\n<td><code>member</code></td>\n<td>object</td>\n<td>-</td>\n<td>Member snapshot - see below.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Optional: <code>id</code> (defaults <code>0</code>), <code>providerEmail</code>, <code>indate</code>, <code>outdate</code>, <code>polyCode</code>, <code>polyName</code>, <code>doctor</code>, <code>phone</code>, <code>medicalRecord</code>, <code>referralSource</code>, <code>icdCode1</code>-<code>icdCode4</code>, <code>los</code>, <code>stPost</code>, <code>stPaid</code>, <code>stExgratia</code>, <code>descExgratia</code>, <code>sickLeave</code>, <code>submitBy</code>, <code>stHighPlan</code>, <code>remark</code>, <code>benefitCode</code>, <code>benefitName</code>, <code>benefitDetail</code>.</p>\n<p>The four <code>st*</code> booleans (<code>stPost</code>, <code>stPaid</code>, <code>stExgratia</code>, <code>stHighPlan</code>) all default to <code>false</code>.</p>\n<p><strong><code>member</code></strong> - required: <code>memberId</code>, <code>memberName</code>, <code>cardNumber</code>, <code>dateOfBirth</code> (<code>yyyy-MM-dd</code>), <code>gender</code>, <code>memberType</code>, <code>memberStatus</code> (bool), <code>isSuspended</code> (bool), <code>joinDate</code>, <code>policyNumber</code>, <code>policyStart</code>, <code>policyEnd</code>, <code>planCode</code>. Optional: <code>nik</code>, <code>maritalStatus</code>, <code>isVip</code> (int, defaults <code>0</code>), <code>isAso</code>, <code>isIndividual</code>.</p>\n<p><code>benefitDetail</code> carries the benefit structure and per-sub-benefit claim values, in the same shape ValidationCashless returns.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Submitted. <strong>Check <code>isSuccess</code></strong> - a downstream refusal also returns <code>200</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Validation failure.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td><strong>The authority on whether the claim was accepted.</strong></td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Downstream message, including the refusal reason when <code>isSuccess</code> is <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>Yes</td>\n<td>The created claim, including its claim number.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Claims","SubmitClaimCashless"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"43834066-7565-4fea-b993-51b5cd9f5054","name":"Claim created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 0,\n  \"cardNumber\": \"9999000000000001\",\n  \"providerCode\": \"PRV001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerEmail\": \"provider@example.com\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"claimDate\": \"2026-01-01T00:00:00Z\",\n  \"indate\": \"2026-01-01T00:00:00Z\",\n  \"outdate\": null,\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"doctor\": \"Dr. Sample\",\n  \"phone\": \"+628000000001\",\n  \"medicalRecord\": \"\",\n  \"referralSource\": \"\",\n  \"icdCode1\": \"A09\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"los\": 0,\n  \"stPost\": false,\n  \"stPaid\": false,\n  \"stExgratia\": false,\n  \"descExgratia\": \"\",\n  \"sickLeave\": 0,\n  \"submitBy\": \"provider@example.com\",\n  \"stHighPlan\": false,\n  \"remark\": \"\",\n  \"createdBy\": \"provider@example.com\",\n  \"idBenefit\": 10000001,\n  \"benefitCode\": \"IP\",\n  \"benefitName\": \"INPATIENT\",\n  \"treatmentType\": \"Rawat inap\",\n  \"benefitDetail\": null,\n  \"member\": {\n    \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n    \"memberName\": \"John Doe\",\n    \"cardNumber\": \"9999000000000001\",\n    \"nik\": \"0000000000000001\",\n    \"dateOfBirth\": \"1990-01-01\",\n    \"gender\": \"M\",\n    \"maritalStatus\": \"S\",\n    \"memberType\": \"Principal\",\n    \"memberStatus\": true,\n    \"isSuspended\": false,\n    \"isVip\": 0,\n    \"isAso\": false,\n    \"isIndividual\": false,\n    \"joinDate\": \"2026-01-01T00:00:00Z\",\n    \"policyNumber\": \"POL0000000000001\",\n    \"policyStart\": \"2026-01-01T00:00:00Z\",\n    \"policyEnd\": \"2026-12-31T00:00:00Z\",\n    \"planCode\": \"PLAN-001\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/SubmitClaimCashless"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"message\": \"SUCCESS\",\n    \"data\": {\n        \"claimNumber\": \"CL2601010000001H\"\n    }\n}"},{"id":"a1f66ded-1c75-401f-8f47-8ff65ed6e5da","name":"Refused - note HTTP 200 with isSuccess false","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 0,\n  \"cardNumber\": \"9999000000000001\",\n  \"providerCode\": \"PRV001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerEmail\": \"provider@example.com\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"claimDate\": \"2026-01-01T00:00:00Z\",\n  \"indate\": \"2026-01-01T00:00:00Z\",\n  \"outdate\": null,\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"doctor\": \"Dr. Sample\",\n  \"phone\": \"+628000000001\",\n  \"medicalRecord\": \"\",\n  \"referralSource\": \"\",\n  \"icdCode1\": \"A09\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"los\": 0,\n  \"stPost\": false,\n  \"stPaid\": false,\n  \"stExgratia\": false,\n  \"descExgratia\": \"\",\n  \"sickLeave\": 0,\n  \"submitBy\": \"provider@example.com\",\n  \"stHighPlan\": false,\n  \"remark\": \"\",\n  \"createdBy\": \"provider@example.com\",\n  \"idBenefit\": 10000001,\n  \"benefitCode\": \"IP\",\n  \"benefitName\": \"INPATIENT\",\n  \"treatmentType\": \"Rawat inap\",\n  \"benefitDetail\": null,\n  \"member\": {\n    \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n    \"memberName\": \"John Doe\",\n    \"cardNumber\": \"9999000000000001\",\n    \"nik\": \"0000000000000001\",\n    \"dateOfBirth\": \"1990-01-01\",\n    \"gender\": \"M\",\n    \"maritalStatus\": \"S\",\n    \"memberType\": \"Principal\",\n    \"memberStatus\": true,\n    \"isSuspended\": false,\n    \"isVip\": 0,\n    \"isAso\": false,\n    \"isIndividual\": false,\n    \"joinDate\": \"2026-01-01T00:00:00Z\",\n    \"policyNumber\": \"POL0000000000001\",\n    \"policyStart\": \"2026-01-01T00:00:00Z\",\n    \"policyEnd\": \"2026-12-31T00:00:00Z\",\n    \"planCode\": \"PLAN-001\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/SubmitClaimCashless"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": false,\n    \"message\": \"Exclusion/Member Nonactive.\",\n    \"data\": null\n}"}],"_postman_id":"8ecb42dd-4832-4260-bca3-fb63e9006d8b"},{"name":"Get Claims by Claim Number","id":"f7b0b6d5-2601-4d34-a0be-1ada0884a26a","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNumber\": [\"CL2601010000001H\", \"CL2601010000002H\"]\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Claims/GetListDataByClaimNumber","description":"<p>Read several claims at once by claim number.</p>\n<p><strong><code>POST {{base}}/api/Claims/GetListDataByClaimNumber</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Batch alternative to <strong>Detail Claim</strong>: pass up to five claim numbers and get their data back in one call, without needing each member's card number.</p>\n<p>Responses are localised - send <code>Accept-Language</code> to choose the language of status labels and descriptions.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code></td>\n<td>body</td>\n<td>string[]</td>\n<td>Yes</td>\n<td>The claim numbers to read. <strong>Maximum 5.</strong></td>\n</tr>\n<tr>\n<td><code>Accept-Language</code></td>\n<td>header</td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>id-ID</code> or <code>en-US</code>. Controls the language of labels.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The claims.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>The array was empty, <strong>or contained more than 5 claim numbers</strong>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The five-item cap is enforced in the handler - a sixth entry fails the whole request rather than being truncated. Batch your reads accordingly.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Claims","GetListDataByClaimNumber"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"58361c94-4825-4eab-8899-e43b2cbfba84","name":"Claims returned","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNumber\": [\"CL2601010000001H\", \"CL2601010000002H\"]\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/GetListDataByClaimNumber"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": [\n        {\n            \"claimNumber\": \"CL2601010000001H\",\n            \"claimStatus\": \"Admission Review\",\n            \"claimStatusCode\": 4\n        }\n    ]\n}"},{"id":"930aff99-56a9-4ff1-9212-632a4b25f574","name":"More than five claim numbers","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNumber\": [\"CL2601010000001H\", \"CL2601010000002H\"]\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/GetListDataByClaimNumber"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"cardNumber\": [\n            \"The cardNumber field is required.\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"f7b0b6d5-2601-4d34-a0be-1ada0884a26a"},{"name":"List Claims by Corporate Code","id":"aaee3eb1-555e-4088-b263-750b425ca201","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": [\"CORP01\", \"CORP02\"],\n  \"page\": { \"page\": 1, \"pageSize\": 10 }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Claims/ListByCorporateCode","description":"<p>List claims across one or many corporate codes.</p>\n<p><strong><code>POST {{base}}/api/Claims/ListByCorporateCode</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>D</strong> - <code>{\"isSuccess\", \"message\", \"data\", \"page\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Corporate-scoped claim listing, the claims counterpart of <strong>Member/ListByCorporateCode</strong>. Accepts several corporate codes in one call, processes them in parallel and returns the results grouped by code.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string <strong>or</strong> string[]</td>\n<td>No</td>\n<td>-</td>\n<td>One corporate code, or several. <strong>Both forms are accepted.</strong></td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>No</td>\n<td>-</td>\n<td>Paging.</td>\n</tr>\n<tr>\n<td><code>page.page</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>page.pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Claims, grouped by corporate code.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Malformed body.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<p><strong>Fields are omitted when null on this family</strong> - which keys appear depends on whether you asked for one code or several. Test for key presence.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Present</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>Always</td>\n<td>Whether the call succeeded.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>Always</td>\n<td>Summary message.</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Always</td>\n<td>Result title.</td>\n</tr>\n<tr>\n<td><code>data.corporateCode</code>, <code>data.corporateName</code></td>\n<td>string</td>\n<td>Single code only</td>\n<td>The code queried.</td>\n</tr>\n<tr>\n<td><code>data.claims</code></td>\n<td>array</td>\n<td>Single code only</td>\n<td>The page of claims.</td>\n</tr>\n<tr>\n<td><code>data.pagination</code></td>\n<td>object</td>\n<td>Single code only</td>\n<td><code>{ totalItems, totalPages, currentPage, pageSize }</code>.</td>\n</tr>\n<tr>\n<td><code>data.corporateCodeGroups</code></td>\n<td>array</td>\n<td>Always</td>\n<td>Per-code groups, each with its own <code>claims</code> and <code>pagination</code>.</td>\n</tr>\n<tr>\n<td><code>data.errors</code></td>\n<td>array</td>\n<td>Only on partial failure</td>\n<td><code>[{ corporateCode, error }]</code>.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>Single code only</td>\n<td>Top-level paging.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>A partial failure still returns <code>200</code></strong> with <code>isSuccess: true</code> - always inspect <code>data.errors</code>.</p>\n<p><strong><code>data.claims[]</code></strong> - <code>id</code> (integer), <code>dob</code>, <code>insuranceNumber</code>, <code>polisNumber</code>, <code>memberNumber</code>, <code>cardNumber</code>, <code>memberName</code>, <code>claimStatus</code>, <code>prevStatus</code>, <code>claimStatusGroup</code>, <code>claimNo</code>, <code>claimSource</code>, <code>customerName</code>, <code>customerCode</code>, <code>holdingName</code>, <code>holdingCode</code>, <code>planDetailCode</code>, <code>planNameDetail</code>, <code>providerCode</code>, <code>providerName</code>, <code>claimDate</code>, <code>admisionDate</code>, <code>dischargeDate</code>, <code>claimType</code>, <code>remark</code>, <code>totalPaid</code>, <code>totalExcess</code>, <code>totalClaim</code>, <code>diagnoseCode</code>, <code>diagnoseDesc</code>. Everything except <code>id</code> is nullable. <code>admisionDate</code> is spelled with one <code>d</code> - that is the real field name.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Claims","ListByCorporateCode"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"ae37abb5-e3d6-4cbd-b546-fc261348388a","name":"Grouped by corporate code","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": [\"CORP01\", \"CORP02\"],\n  \"page\": { \"page\": 1, \"pageSize\": 10 }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/ListByCorporateCode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"message\": \"SUCCESS\",\n    \"data\": {\n        \"corporateCodeGroups\": [\n            {\n                \"corporateCode\": \"CORP01\",\n                \"corporateName\": \"Sample Corporate\",\n                \"claims\": [],\n                \"pagination\": {\n                    \"totalItems\": 0,\n                    \"totalPages\": 0,\n                    \"currentPage\": 1,\n                    \"pageSize\": 10\n                }\n            }\n        ]\n    }\n}"},{"id":"c78c480e-5cb3-4698-af29-4e23eef697bb","name":"Partial failure - note HTTP 200","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": [\"CORP01\", \"CORP02\"],\n  \"page\": { \"page\": 1, \"pageSize\": 10 }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/ListByCorporateCode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"message\": \"One or more corporate codes could not be read.\",\n    \"data\": {\n        \"corporateCodeGroups\": [],\n        \"errors\": [\n            { \"corporateCode\": \"CORP02\", \"error\": \"Corporate code not found.\" }\n        ]\n    }\n}"}],"_postman_id":"aaee3eb1-555e-4088-b263-750b425ca201"},{"name":"Policy Details","id":"d9c81bde-b6aa-4a5c-a72f-80c379e33a3d","request":{"method":"GET","header":[],"url":"{{base}}/{{apiVersion}}/api/Claims/PolicyDetails?type=TERMS&productId=1","description":"<p>Read the terms and benefit details of a product.</p>\n<p><strong><code>GET {{base}}/api/Claims/PolicyDetails</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\", \"data\", \"message\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns the configured detail for a product - the benefit structure and terms behind a member's plan. Useful for rendering policy wording without holding a copy yourself.</p>\n<p>Responses are localised: send <code>Accept-Language</code> and the terms come back in that language.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td>query</td>\n<td>string</td>\n<td>Yes</td>\n<td>The kind of detail to return.</td>\n</tr>\n<tr>\n<td><code>productId</code></td>\n<td>query</td>\n<td>integer</td>\n<td>Yes</td>\n<td>The product to read.</td>\n</tr>\n<tr>\n<td><code>Accept-Language</code></td>\n<td>header</td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>id-ID</code> or <code>en-US</code>. Controls the language of the returned terms.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The product detail, with <code>isSuccess: true</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Not found or downstream refusal. <strong>Carries the same <code>{\"isSuccess\": false, …}</code> body</strong> rather than an error shape.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>On an unhandled exception, an RFC 7807-style body with <code>errors.Message</code> and a <code>traceId</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the lookup succeeded.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Downstream message.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>Yes</td>\n<td>The product detail. Shape varies with <code>type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>data</code> is loosely typed downstream, so its shape depends on the <code>type</code> you ask for. Treat it as opaque unless you have agreed a specific <code>type</code> with the integration team.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Claims","PolicyDetails"],"host":["{{base}}"],"query":[{"description":{"content":"<p>The kind of detail to return.</p>\n","type":"text/plain"},"key":"type","value":"TERMS"},{"description":{"content":"<p>The product to read.</p>\n","type":"text/plain"},"key":"productId","value":"1"}],"variable":[]}},"response":[{"id":"a8a3a82a-946a-41b7-841d-c25fad0ced6d","name":"Product detail","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Claims/PolicyDetails?type=TERMS&productId=1","host":["{{base}}"],"path":["api","Claims","PolicyDetails"],"query":[{"key":"type","value":"TERMS","description":"The kind of detail to return."},{"key":"productId","value":"1","description":"The product to read."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"message\": \"SUCCESS\",\n    \"data\": {\n        \"productId\": 1,\n        \"type\": \"TERMS\",\n        \"content\": []\n    }\n}"},{"id":"d83c0b83-7681-4534-b464-be8fd59a6f13","name":"Not found - note same body shape","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base}}/api/Claims/PolicyDetails?type=TERMS&productId=1","host":["{{base}}"],"path":["api","Claims","PolicyDetails"],"query":[{"key":"type","value":"TERMS","description":"The kind of detail to return."},{"key":"productId","value":"1","description":"The product to read."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": false,\n    \"message\": \"Product not found.\",\n    \"data\": null\n}"}],"_postman_id":"d9c81bde-b6aa-4a5c-a72f-80c379e33a3d"}],"id":"4f74f715-0d45-44be-ba17-1c7e69b238c1","description":"<p>Submit claims and read claim data.</p>\n<p>These endpoints do <strong>not</strong> use the <code>data</code> envelope - each returns its payload at the top level under a resource-specific key (<code>listGL</code>, <code>claims</code>). Check each endpoint's documentation for its root key.</p>\n","_postman_id":"4f74f715-0d45-44be-ba17-1c7e69b238c1","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}}},{"name":"Submit Claim History","item":[{"name":"Submit Claim History","id":"f5e466f3-e6b2-40b3-817e-cc0ad3f038b6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"header\": [\n    {\n      \"insuredNo\": \"INS00000001\",\n      \"insuredNoTpa\": \"\",\n      \"registrationType\": \"\",\n      \"claimId\": \"0001/CLA/01/2026\",\n      \"otherRelatedClaimId\": \"0001/CLA/01/2026\",\n      \"policyNo\": \"POL0000000000001\",\n      \"insuredName\": \"John Doe\"\n    }\n  ],\n  \"detail\": [\n    {\n      \"claimId\": \"0001/CLA/01/2026\",\n      \"benefitCode\": \"IP\",\n      \"amount\": 2500000\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Claims/HistoryClaim","description":"<p>Submit historical claim records in bulk.</p>\n<p><strong><code>POST {{base}}/api/Claims/HistoryClaim</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\", \"data\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Seeds a client's prior claim history, typically at onboarding, so that limits and pre-existing conditions are calculated correctly from day one.</p>\n<p>Added in <strong>2.7.0</strong> (Oct 2025), which also improved throughput on this endpoint.</p>\n<p>The payload is a <strong>pair of arrays</strong>: one header row per claim, and one or more detail rows per claim, linked by the claim identifier.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>header</code></td>\n<td>array</td>\n<td>Yes</td>\n<td>One entry per historical claim.</td>\n</tr>\n<tr>\n<td><code>detail</code></td>\n<td>array</td>\n<td>Yes</td>\n<td>Line items belonging to those claims.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>header[]</code> carries the claim-level facts - <code>insuredNo</code>, <code>insuredNoTpa</code>, <code>registrationType</code>, <code>claimId</code>, <code>otherRelatedClaimId</code>, <code>policyNo</code>, <code>insuredName</code> and the remaining claim header fields. <code>detail[]</code> carries the per-line amounts and benefit references, joined to the header by <code>claimId</code>.</p>\n<p>Submit header and detail together in one call; detail rows whose <code>claimId</code> has no matching header are rejected.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Processed. <strong>Check <code>isSuccess</code></strong> - a partial or total rejection also returns <code>200</code>.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Malformed payload.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the batch was accepted.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>Yes</td>\n<td>Per-row outcomes, including any rejected rows and why.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Inspect <code>data</code> even on a <code>200</code> with <code>isSuccess: true</code> - individual rows can be reported as skipped.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Claims","HistoryClaim"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"49823c8f-0cbd-496e-8a21-c33526339980","name":"History accepted","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"header\": [\n    {\n      \"insuredNo\": \"INS00000001\",\n      \"insuredNoTpa\": \"\",\n      \"registrationType\": \"\",\n      \"claimId\": \"0001/CLA/01/2026\",\n      \"otherRelatedClaimId\": \"0001/CLA/01/2026\",\n      \"policyNo\": \"POL0000000000001\",\n      \"insuredName\": \"John Doe\"\n    }\n  ],\n  \"detail\": [\n    {\n      \"claimId\": \"0001/CLA/01/2026\",\n      \"benefitCode\": \"IP\",\n      \"amount\": 2500000\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/HistoryClaim"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"headerProcessed\": 1,\n        \"detailProcessed\": 1,\n        \"rejected\": []\n    }\n}"},{"id":"d925252c-3ef0-40c1-b877-e3acb693bca3","name":"Partial rejection - note HTTP 200","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"header\": [\n    {\n      \"insuredNo\": \"INS00000001\",\n      \"insuredNoTpa\": \"\",\n      \"registrationType\": \"\",\n      \"claimId\": \"0001/CLA/01/2026\",\n      \"otherRelatedClaimId\": \"0001/CLA/01/2026\",\n      \"policyNo\": \"POL0000000000001\",\n      \"insuredName\": \"John Doe\"\n    }\n  ],\n  \"detail\": [\n    {\n      \"claimId\": \"0001/CLA/01/2026\",\n      \"benefitCode\": \"IP\",\n      \"amount\": 2500000\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Claims/HistoryClaim"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"headerProcessed\": 1,\n        \"detailProcessed\": 0,\n        \"rejected\": [\n            { \"claimId\": \"0001/CLA/01/2026\", \"reason\": \"No matching header for detail row.\" }\n        ]\n    }\n}"}],"_postman_id":"f5e466f3-e6b2-40b3-817e-cc0ad3f038b6"}],"id":"213a7f10-5a9b-4cf3-9b43-10d2ffc36716","description":"<p>Submit historical claim records in bulk, as paired header and detail rows.</p>\n<p>Used at onboarding to seed a client's prior claim history.</p>\n","_postman_id":"213a7f10-5a9b-4cf3-9b43-10d2ffc36716","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}}},{"name":"Member","item":[{"name":"List Member by Client Code","id":"90bd36a2-ff9c-4259-93ca-052765319758","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":""}],"body":{"mode":"raw","raw":"{\n  \"clientCode\": \"CLI01\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/ListMemberByClientCode","description":"<p>List the members belonging to a client code.</p>\n<p><strong><code>POST {{base}}/api/Member/ListMemberByClientCode</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\": …, \"data\": …}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns a paged list of members under one client code. The client code is the insurer/client identifier issued with your keys - it is the same value your token is scoped to.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>-</td>\n<td>The client/insurer code to list members for.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>No</td>\n<td>-</td>\n<td>Paging. Omit for defaults.</td>\n</tr>\n<tr>\n<td><code>page.page</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>page.pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size.</td>\n</tr>\n<tr>\n<td><code>page.query</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>null</code></td>\n<td>Free-text search across the member list.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The page of members.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>clientCode</code> missing - RFC 7807 with <code>traceId</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<p><strong>The payload is nested twice</strong> - <code>data.data.items</code>, not <code>data.items</code>. This is the only endpoint in the folder shaped this way.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the downstream call succeeded. <strong>Check this, not just the status code.</strong></td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>No</td>\n<td>Outer wrapper.</td>\n</tr>\n<tr>\n<td><code>data.message</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Downstream message.</td>\n</tr>\n<tr>\n<td><code>data.data</code></td>\n<td>object</td>\n<td>No</td>\n<td>Inner wrapper.</td>\n</tr>\n<tr>\n<td><code>data.data.items</code></td>\n<td>array</td>\n<td>No</td>\n<td>The page of member records.</td>\n</tr>\n<tr>\n<td><code>data.data.totalRecords</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Total matching members across all pages.</td>\n</tr>\n<tr>\n<td><code>data.data.totalPages</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Total pages available.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Note there is no echo of the page number or page size in the response - track them on your side.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Member","ListMemberByClientCode"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"1783fdef-ca7f-4b72-8ee9-64dcf05f4014","name":"Page of members","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOb3ZhVXNlcklkIjoiR0xPQkFMIiwiTm92YUhlYWRlclRva2VuIjoiQ0gwMDI1IiwiTm92YVVzZXJUb2tlbiI6IkNIMDAyNSIsIk5vdmFDbGllbnRJZCI6IkdMT0JBTCIsImV4cCI6MTc0ODQwODc4MiwiaXNzIjoiand0LWlzc3VlciIsImF1ZCI6Imp3dC1hdWRpZW5jZSJ9.YAaDWvKG6LaHQOVhuOHxfxIe9puC45k6Am8xuWlHwq0"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":""}],"body":{"mode":"raw","raw":"{\n  \"clientCode\": \"CLI01\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ListMemberByClientCode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"message\": \"SUCCESS\",\n        \"data\": {\n            \"items\": [\n                {\n                    \"memberNumber\": \"MEM00000001\",\n                    \"memberName\": \"John Doe\",\n                    \"cardNumber\": \"9999000000000001\",\n                    \"policyNumber\": \"POL0000000000001\"\n                }\n            ],\n            \"totalRecords\": 1,\n            \"totalPages\": 1\n        }\n    }\n}"},{"id":"cb6db54d-792c-4511-9530-9a51da03a2de","name":"clientCode missing","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOb3ZhVXNlcklkIjoiR0xPQkFMIiwiTm92YUhlYWRlclRva2VuIjoiQ0gwMDI1IiwiTm92YVVzZXJUb2tlbiI6IkNIMDAyNSIsIk5vdmFDbGllbnRJZCI6IkdMT0JBTCIsImV4cCI6MTc0ODQwODc4MiwiaXNzIjoiand0LWlzc3VlciIsImF1ZCI6Imp3dC1hdWRpZW5jZSJ9.YAaDWvKG6LaHQOVhuOHxfxIe9puC45k6Am8xuWlHwq0"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":""}],"body":{"mode":"raw","raw":"{\n  \"clientCode\": \"CLI01\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ListMemberByClientCode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"cardNumber\": [\n            \"The cardNumber field is required.\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"90bd36a2-ff9c-4259-93ca-052765319758"},{"name":"Member Information by Card Number","id":"606b55ec-5edd-474f-8750-0863c7663896","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOb3ZhVXNlcklkIjoiMTE0NjIiLCJOb3ZhSGVhZGVyVG9rZW4iOiJiZWFyZXJfcjMwMzZWRkE0VHpHTkJEL1BVcTQwQUZ3MjY4VU5pYmJTSVYyd3ZSUU16RT0iLCJOb3ZhVXNlclRva2VuIjoiRUI4M0RDQUMtOEZBNS00REVBLTk1Q0YtRDcxQUNBMURDQzMxIiwiTm92YUNsaWVudElkIjoiMjIxMTAwMDkiLCJleHAiOjE3MjgwMzQ2MzgsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdC8ifQ.jzG_t-13xCIfYgUKwxxMrRHXFhPOQt33oxQ2EBv0ANY"}],"url":"{{base}}/{{apiVersion}}/api/Member/FindByCardNumber/:cardNumber","description":"<p>Look up one member by card number, with their family and card artwork.</p>\n<p><strong><code>GET {{base}}/api/Member/FindByCardNumber/{cardNo}</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>C</strong> - no envelope; three root keys</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The primary member lookup. Returns the member, their family members, and the resources needed to render a digital membership card.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNo</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The member.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Not found - <code>{\"Status\":400,\"Errors\":[{\"ErrorCode\":\"InternalServerError\",\"Message\":\"Data not found.\"}]}</code>. Note the misleading error code.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<p>Three root keys, no <code>data</code> wrapper.</p>\n<p><strong><code>member</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your identifier for the member.</td>\n</tr>\n<tr>\n<td><code>memberId</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Internal member ID.</td>\n</tr>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Card number.</td>\n</tr>\n<tr>\n<td><code>memberName</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Full name.</td>\n</tr>\n<tr>\n<td><code>insuranceNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Insurer's member reference.</td>\n</tr>\n<tr>\n<td><code>sex</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>M</code> / <code>F</code>.</td>\n</tr>\n<tr>\n<td><code>clientName</code>, <code>clientCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Insurer/client.</td>\n</tr>\n<tr>\n<td><code>corporateName</code>, <code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Corporate.</td>\n</tr>\n<tr>\n<td><code>memberType</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>e.g. <code>Principal</code>.</td>\n</tr>\n<tr>\n<td><code>dob</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Date of birth.</td>\n</tr>\n<tr>\n<td><code>isActive</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether cover is in force.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Policy number.</td>\n</tr>\n<tr>\n<td><code>paymentAccount</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Reimbursement account number.</td>\n</tr>\n<tr>\n<td><code>bankName</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Reimbursement bank.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>familyMember[]</code></strong> - <code>memberName</code> string, <code>memberNumber</code> string, <code>memberType</code> string, <code>isPrincipal</code> boolean. Empty array when the member has no family on the policy.</p>\n<p><strong><code>resource</code></strong> - card rendering assets: <code>urlRender</code>, <code>urlBack</code>, <code>urlBackground</code> (strings) and <code>template</code> (array). Not needed unless you are displaying a digital card.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Member","FindByCardNumber",":cardNumber"],"host":["{{base}}"],"query":[],"variable":[{"description":{"content":"<p>Member's card number.</p>\n","type":"text/plain"},"type":"any","value":"9999000000000001","key":"cardNumber"}]}},"response":[{"id":"42a8e238-333f-4a77-a7fd-f38587bb4622","name":"Member found","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOb3ZhVXNlcklkIjoiMTE0NjIiLCJOb3ZhSGVhZGVyVG9rZW4iOiJiZWFyZXJfcjMwMzZWRkE0VHpHTkJEL1BVcTQwQUZ3MjY4VU5pYmJTSVYyd3ZSUU16RT0iLCJOb3ZhVXNlclRva2VuIjoiRUI4M0RDQUMtOEZBNS00REVBLTk1Q0YtRDcxQUNBMURDQzMxIiwiTm92YUNsaWVudElkIjoiMjIxMTAwMDkiLCJleHAiOjE3MjgwMzQ2MzgsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdC8ifQ.jzG_t-13xCIfYgUKwxxMrRHXFhPOQt33oxQ2EBv0ANY"}],"url":{"raw":"{{base}}/api/Member/FindByCardNumber/:cardNumber","host":["{{base}}"],"path":["api","Member","FindByCardNumber",":cardNumber"],"variable":[{"key":"cardNumber","value":"9999000000000001","description":"Member's card number."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"member\": {\n        \"memberNumber\": \"MEM00000001\",\n        \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n        \"cardNumber\": \"9999000000000001\",\n        \"memberName\": \"John Doe\",\n        \"insuranceNumber\": \"INS00000001\",\n        \"sex\": \"M\",\n        \"clientName\": \"Sample Insurance\",\n        \"clientCode\": \"CLI01\",\n        \"corporateName\": \"Sample Corporate\",\n        \"corporateCode\": \"CORP01\",\n        \"memberType\": \"Principal\",\n        \"dob\": \"1990-01-01\",\n        \"isActive\": true,\n        \"policyNumber\": \"POL0000000000001\",\n        \"paymentAccount\": \"0000000001\",\n        \"bankName\": \"Sample Bank\"\n    },\n    \"familyMember\": [\n        {\n            \"memberName\": \"Jane Doe\",\n            \"memberNumber\": \"MEM00000002\",\n            \"memberType\": \"Spouse\",\n            \"isPrincipal\": false\n        }\n    ],\n    \"resource\": {\n        \"urlRender\": \"https://example.com/card/render\",\n        \"urlBack\": \"https://example.com/card/back\",\n        \"urlBackground\": \"https://example.com/card/bg\",\n        \"template\": []\n    }\n}"},{"id":"8088b252-88c1-40a9-8ebd-d1bf5bb9e866","name":"Not found","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOb3ZhVXNlcklkIjoiMTE0NjIiLCJOb3ZhSGVhZGVyVG9rZW4iOiJiZWFyZXJfcjMwMzZWRkE0VHpHTkJEL1BVcTQwQUZ3MjY4VU5pYmJTSVYyd3ZSUU16RT0iLCJOb3ZhVXNlclRva2VuIjoiRUI4M0RDQUMtOEZBNS00REVBLTk1Q0YtRDcxQUNBMURDQzMxIiwiTm92YUNsaWVudElkIjoiMjIxMTAwMDkiLCJleHAiOjE3MjgwMzQ2MzgsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdC8ifQ.jzG_t-13xCIfYgUKwxxMrRHXFhPOQt33oxQ2EBv0ANY"}],"url":{"raw":"{{base}}/api/Member/FindByCardNumber/:cardNumber","host":["{{base}}"],"path":["api","Member","FindByCardNumber",":cardNumber"],"variable":[{"key":"cardNumber","value":"9999000000000001","description":"Member's card number."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"InternalServerError\",\n            \"Message\": \"Data not found.\"\n        }\n    ]\n}"}],"_postman_id":"606b55ec-5edd-474f-8750-0863c7663896"},{"name":"Member Benefit by Card Number","id":"5c6144a4-0cee-4ca6-81ac-8b2ba3543426","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Accept-Language","value":"","type":"text"},{"key":"Authorization","value":"","type":"text"}],"url":"{{base}}/{{apiVersion}}/api/Member/GetBenefitsByCardNumber/:cardNumber","description":"<p>Read a member's plans, limits and eligible providers.</p>\n<p><strong><code>GET {{base}}/api/Member/GetBenefitsByCardNumber/{cardNo}</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>C</strong> - no envelope; root key <code>plans</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns the benefit structure attached to a member's card: one entry per plan, with its annual limit, validity dates and the providers the plan can be used at.</p>\n<p>Added in <strong>2.6.1</strong> (Feb 2025).</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNo</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The member's plans.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Not found - <code>{\"Status\":400,\"Errors\":[…]}</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---plans\">Response fields - <code>plans[]</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>planCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Plan code.</td>\n</tr>\n<tr>\n<td><code>planName</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Plan name.</td>\n</tr>\n<tr>\n<td><code>planAnnualLimit</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>Annual limit in the plan's currency.</td>\n</tr>\n<tr>\n<td><code>planLimitType</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>How the limit applies, e.g. per year or per visit.</td>\n</tr>\n<tr>\n<td><code>benefitCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Benefit code.</td>\n</tr>\n<tr>\n<td><code>benefitType</code></td>\n<td>object</td>\n<td>Yes</td>\n<td><code>{ type, display }</code> - e.g. <code>INPATIENT</code>.</td>\n</tr>\n<tr>\n<td><code>planStart</code>, <code>planEnd</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Plan validity dates.</td>\n</tr>\n<tr>\n<td><code>providerList</code></td>\n<td>array</td>\n<td>Yes</td>\n<td>Providers this plan may be used at. Can be large.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>plans</code> is an empty array when the member holds no active plan - that is a <code>200</code>, not an error.</p>\n","urlObject":{"path":["{{apiVersion}}","api","Member","GetBenefitsByCardNumber",":cardNumber"],"host":["{{base}}"],"query":[],"variable":[{"description":{"content":"<p>Member's card number.</p>\n","type":"text/plain"},"type":"any","value":"9999000000000001","key":"cardNumber"}]}},"response":[{"id":"bfb1066b-7764-4b6e-8059-6db6d79e24ae","name":"Plans returned","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Accept-Language","value":"","type":"text"},{"key":"Authorization","value":"","type":"text"}],"url":{"raw":"{{base}}/api/Member/GetBenefitsByCardNumber/:cardNumber","host":["{{base}}"],"path":["api","Member","GetBenefitsByCardNumber",":cardNumber"],"variable":[{"key":"cardNumber","value":"9999000000000001","description":"Member's card number."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"plans\": [\n        {\n            \"planAnnualLimit\": 30000000,\n            \"planLimitType\": \"ANNUAL\",\n            \"planCode\": \"PLAN-001\",\n            \"planName\": \"Sample Inpatient Plan (PLAN-001)\",\n            \"benefitType\": {\n                \"type\": \"INPATIENT\",\n                \"display\": \"INPATIENT\"\n            },\n            \"benefitCode\": \"IP\",\n            \"planStart\": \"2026-01-01\",\n            \"planEnd\": \"2026-12-31\",\n            \"providerList\": []\n        }\n    ]\n}"},{"id":"f8cca591-3441-4a20-83cc-dd83d096c8e0","name":"No active plan","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Accept-Language","value":"","type":"text"},{"key":"Authorization","value":"","type":"text"}],"url":{"raw":"{{base}}/api/Member/GetBenefitsByCardNumber/:cardNumber","host":["{{base}}"],"path":["api","Member","GetBenefitsByCardNumber",":cardNumber"],"variable":[{"key":"cardNumber","value":"9999000000000001","description":"Member's card number."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"plans\": []\n}"},{"id":"90ed7462-2f06-4ecc-a16f-30bf4f0b19c0","name":"Not found","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"GET","header":[{"key":"accept","value":"*/*"},{"key":"Accept-Language","value":"","type":"text"},{"key":"Authorization","value":"","type":"text"}],"url":{"raw":"{{base}}/api/Member/GetBenefitsByCardNumber/:cardNumber","host":["{{base}}"],"path":["api","Member","GetBenefitsByCardNumber",":cardNumber"],"variable":[{"key":"cardNumber","value":"9999000000000001","description":"Member's card number."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"InternalServerError\",\n            \"Message\": \"Data not found.\"\n        }\n    ]\n}"}],"_postman_id":"5c6144a4-0cee-4ca6-81ac-8b2ba3543426"},{"name":"List Member by Corporate Code","id":"4ae2be30-5937-4843-b8e4-5c58e2adea1c","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": [\"CORP01\", \"CORP02\"],\n  \"page\": { \"page\": 1, \"pageSize\": 10 }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/ListByCorporateCode","description":"<p>List members across one or many corporate codes.</p>\n<p><strong><code>POST {{base}}/api/Member/ListByCorporateCode</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>D</strong> - <code>{\"isSuccess\", \"message\", \"data\", \"page\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Corporate-scoped member listing. Unlike <strong>ListMemberByClientCode</strong>, this accepts several corporate codes in one call and processes them in parallel, returning the results grouped by code.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>corporateCode</code></td>\n<td>string <strong>or</strong> string[]</td>\n<td>No</td>\n<td>-</td>\n<td>One corporate code, or several. <strong>Both forms are accepted</strong> - <code>\"CORP01\"</code> and <code>[\"CORP01\",\"CORP02\"]</code> both work.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>No</td>\n<td>-</td>\n<td>Paging.</td>\n</tr>\n<tr>\n<td><code>page.page</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>page.pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Members, grouped by corporate code.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Malformed body.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<p><strong>Fields on this family are omitted when null, not sent as <code>null</code>.</strong> Which keys appear depends on whether you asked for one code or several - test for key presence.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Present</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>Always</td>\n<td>Whether the call succeeded.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>Always</td>\n<td>Summary message.</td>\n</tr>\n<tr>\n<td><code>data.corporateCode</code></td>\n<td>string</td>\n<td>Single code only</td>\n<td>The code queried.</td>\n</tr>\n<tr>\n<td><code>data.members</code></td>\n<td>array</td>\n<td>Single code only</td>\n<td>The page of members.</td>\n</tr>\n<tr>\n<td><code>data.corporateCodeGroups</code></td>\n<td>array</td>\n<td>Always</td>\n<td>Per-code groups, each <code>{ corporateCode, corporateName, claims, pagination }</code>.</td>\n</tr>\n<tr>\n<td><code>data.errors</code></td>\n<td>array</td>\n<td>Only on partial failure</td>\n<td><code>[{ corporateCode, error }]</code> - one entry per code that failed.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>Single code only</td>\n<td><code>{ totalItems, totalPages, currentPage, pageSize }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>A partial failure still returns <code>200</code>.</strong> If one corporate code fails and others succeed, you get <code>isSuccess: true</code> with that code listed in <code>data.errors</code>. Always inspect <code>errors</code>.</p>\n<p><strong><code>data.members[]</code></strong> - <code>id</code> (UUID), <code>nik</code>, <code>memberName</code>, <code>clientMemberId</code>, <code>cardNumber</code>, <code>insurerName</code>, <code>policyNumber</code>, <code>age</code>, <code>memberStatus</code>, <code>status</code>, <code>joinDate</code>, <code>dob</code>, <code>planName</code>, <code>productName</code>, <code>corporateName</code>, <code>clientCode</code>, <code>corporateCode</code>, <code>divisionName</code>, <code>effectiveDate</code>. All strings; <code>productName</code> and <code>effectiveDate</code> are nullable.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}},"urlObject":{"path":["{{apiVersion}}","api","Member","ListByCorporateCode"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"1e13730a-5e81-4c0e-b353-e5e239547e23","name":"Grouped by corporate code","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": [\"CORP01\", \"CORP02\"],\n  \"page\": { \"page\": 1, \"pageSize\": 10 }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ListByCorporateCode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"message\": \"SUCCESS\",\n    \"data\": {\n        \"corporateCodeGroups\": [\n            {\n                \"corporateCode\": \"CORP01\",\n                \"corporateName\": \"Sample Corporate\",\n                \"members\": [],\n                \"pagination\": {\n                    \"totalItems\": 0,\n                    \"totalPages\": 0,\n                    \"currentPage\": 1,\n                    \"pageSize\": 10\n                }\n            }\n        ]\n    }\n}"},{"id":"0fbf192c-a1cf-41d5-9afe-1f7c567423ab","name":"Partial failure - note HTTP 200","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"corporateCode\": [\"CORP01\", \"CORP02\"],\n  \"page\": { \"page\": 1, \"pageSize\": 10 }\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ListByCorporateCode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"message\": \"One or more corporate codes could not be read.\",\n    \"data\": {\n        \"corporateCodeGroups\": [],\n        \"errors\": [\n            { \"corporateCode\": \"CORP02\", \"error\": \"Corporate code not found.\" }\n        ]\n    }\n}"}],"_postman_id":"4ae2be30-5937-4843-b8e4-5c58e2adea1c"}],"id":"34e5f14c-b966-4f29-94d7-e90e5bd3be1e","description":"<p>Look up members and their benefits.</p>\n<p>No <code>data</code> envelope - these return <code>{\"member\": …}</code> or a paged list at the top level.</p>\n","_postman_id":"34e5f14c-b966-4f29-94d7-e90e5bd3be1e","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}}},{"name":"Provider","item":[{"name":"List Provider","id":"075e694e-f92b-45ed-a2c9-b45da194d0c3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" },\n  \"latitude\": -6.2,\n  \"longitude\": 106.8,\n  \"distance\": \">= 50\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/{{apiVersion}}/api/Member/ListProviderFacility","description":"<p>List the provider facilities a member can use, optionally filtered by distance.</p>\n<p><strong><code>POST {{base}}/api/Member/ListProviderFacility</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth</strong></td>\n<td><code>Authorization: Bearer </code></td>\n</tr>\n<tr>\n<td><strong>Versions</strong></td>\n<td>v1 and v2</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><strong>Envelope</strong></td>\n<td>Family <strong>B</strong> - <code>{\"isSuccess\": …, \"data\": …}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns the panel available to a member's plan. Distance filtering was added in <strong>2.5.3</strong> (Jan 2025): supply a coordinate and a distance expression and the list is narrowed to facilities within range.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>-</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Caller's email, recorded downstream.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>object</td>\n<td>No</td>\n<td>-</td>\n<td>Paging.</td>\n</tr>\n<tr>\n<td><code>page.page</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>page.pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size.</td>\n</tr>\n<tr>\n<td><code>page.query</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>null</code></td>\n<td>Free-text search across facility names.</td>\n</tr>\n<tr>\n<td><code>latitude</code></td>\n<td>number</td>\n<td>No</td>\n<td><code>0</code></td>\n<td><strong>Must be between -90 and 90.</strong></td>\n</tr>\n<tr>\n<td><code>longitude</code></td>\n<td>number</td>\n<td>No</td>\n<td><code>0</code></td>\n<td><strong>Must be between -180 and 180.</strong></td>\n</tr>\n<tr>\n<td><code>distance</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Distance filter. <strong>Format is <code>&lt;operator&gt; &lt;value&gt;</code></strong> with a single space, where the operator is <code>&gt;=</code> or <code>&lt;=</code> - for example <code>&gt;= 50</code>. Any other format is rejected.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Distance filtering only makes sense with a coordinate; sending <code>distance</code> while leaving <code>latitude</code>/<code>longitude</code> at <code>0</code> filters against the equator.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The page of facilities.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Latitude, longitude or distance failed validation - RFC 7807 with <code>traceId</code>.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or expired token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the downstream call succeeded.</td>\n</tr>\n<tr>\n<td><code>data.page</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Current page.</td>\n</tr>\n<tr>\n<td><code>data.pageSize</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Page size.</td>\n</tr>\n<tr>\n<td><code>data.totalItems</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Total matching facilities.</td>\n</tr>\n<tr>\n<td><code>data.totalPages</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Total pages.</td>\n</tr>\n<tr>\n<td><code>data.listProviderFacility</code></td>\n<td>array</td>\n<td>No</td>\n<td>The facilities. Empty array when none match.</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{apiVersion}}","api","Member","ListProviderFacility"],"host":["{{base}}"],"query":[],"variable":[]}},"response":[{"id":"901b30dd-70ee-4580-abed-11538cdd5a24","name":"Page of facilities","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" },\n  \"latitude\": -6.2,\n  \"longitude\": 106.8,\n  \"distance\": \">= 50\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ListProviderFacility"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"isSuccess\": true,\n    \"data\": {\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalItems\": 1,\n        \"totalPages\": 1,\n        \"listProviderFacility\": [\n            {\n                \"providerCode\": \"PRV001\",\n                \"providerName\": \"Sample Clinic\",\n                \"address\": \"1 Sample Street, Jakarta\",\n                \"distance\": 4.2\n            }\n        ]\n    }\n}"},{"id":"533cfad7-80e4-46a2-b67c-1b267d6eb709","name":"Invalid distance format","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"{{token}}"}},"method":"POST","header":[{"key":"accept","value":"*/*"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"9999000000000001\",\n  \"email\": \"\",\n  \"page\": { \"page\": 1, \"pageSize\": 10, \"query\": \"\" },\n  \"latitude\": -6.2,\n  \"longitude\": 106.8,\n  \"distance\": \">= 50\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base}}/api/Member/ListProviderFacility"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n    \"title\": \"One or more validation errors occurred.\",\n    \"status\": 400,\n    \"errors\": {\n        \"distance\": [\n            \"Invalid distance format. Use '[operator] [value]' (e.g., '>= 50').\"\n        ]\n    },\n    \"traceId\": \"00-00000000000000000000000000000000-0000000000000000-00\"\n}"}],"_postman_id":"075e694e-f92b-45ed-a2c9-b45da194d0c3"}],"id":"ee7ae3de-8d8c-413b-8abe-b8a5356e8c22","description":"<p>List the provider facilities available to a member.</p>\n<p>Supports filtering by distance from a coordinate.</p>\n","_postman_id":"ee7ae3de-8d8c-413b-8abe-b8a5356e8c22","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"523f522d-2941-42db-a086-102b1051e12d","id":"523f522d-2941-42db-a086-102b1051e12d","name":"V1 & V2","type":"folder"}}}],"id":"523f522d-2941-42db-a086-102b1051e12d","description":"<h1 id=\"cambridge-openapi-v1--v2---enrolment-claims-members-providers\">Cambridge OpenAPI V1 &amp; V2 - Enrolment, Claims, Members, Providers</h1>\n<p>The original Cambridge integration surface. V1 and V2 are single-tenant proxies in front of NOVA: a partner authenticates with a client key and server key, receives a bearer token, and every subsequent call is forwarded to NOVA and enriched on the way.</p>\n<p>For new integrations, prefer <strong>V3</strong> - it is a first-party multi-tenant system with per-permission authorisation and consistent response shapes. V1 and V2 remain supported for existing partners.</p>\n<hr />\n<h2 id=\"1-versions\">1. Versions</h2>\n<p>Versioning is by URL segment:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{{base}}/{{apiVersion}}/api/&lt;controller&gt;/&lt;action&gt;\n</code></pre><div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variable</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>base</code> - production</td>\n<td><code>https://id-cambridge.healthmetrics.com</code></td>\n</tr>\n<tr>\n<td><code>base</code> - staging</td>\n<td><code>https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app</code></td>\n</tr>\n<tr>\n<td><code>apiVersion</code></td>\n<td><code>v1</code> or <code>v2</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><code>base</code> is the bare host, exactly as in V3. Set <code>apiVersion</code> to <code>v2</code> to call V2 - one variable switches every request in this folder.</p>\n<p><strong>The version segment is mandatory.</strong> <code>&lt;host&gt;/api/Auth/Login</code> with no version returns <code>404</code>, verified against staging on 2026-09-23.</p>\n<p><strong>Every action in this folder is served on both versions</strong> - the application declares <code>ApiVersion 1.0</code> and <code>2.0</code> on all three controllers and maps a separate handler to each.</p>\n<h3 id=\"what-actually-differs-between-v1-and-v2\">What actually differs between V1 and V2</h3>\n<p>The request and response contracts are the same. The difference is downstream: the two versions pass a different version flag to NOVA, so NOVA may resolve a different client configuration. Unless your integration was set up against V1 specifically, use <strong>V2</strong>.</p>\n<h3 id=\"requesting-a-different-version\">Requesting a different version</h3>\n<p>Change <code>base</code>. There is no header or query parameter for version selection, and there is no unversioned route - <code>{{base}}</code> without a version segment returns <code>404</code>.</p>\n<hr />\n<h2 id=\"2-authorisation\">2. Authorisation</h2>\n<p>Two credentials, issued per integration:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Credential</th>\n<th>Used for</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientKey</code></td>\n<td>Identifies the integration. Sent in the Login body.</td>\n</tr>\n<tr>\n<td><code>serverKey</code></td>\n<td>Authenticates the integration. Sent in the Login body.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>POST {{base}}/api/Auth/Login</code> exchanges them for a bearer token. Every other endpoint requires:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer \n</code></pre><p>The token embeds the NOVA client identity resolved at login, so it is scoped to your client's book. It expires - read <code>expiry</code> from the Login response and re-authenticate before then. There is no refresh endpoint.</p>\n<p><strong>Credentials are never stored in this collection.</strong> <code>clientkey</code>, <code>serverkey</code>, <code>token</code> and <code>BearerToken</code> are secret-typed environment variables with no saved value. Supply them in your own environment.</p>\n<hr />\n<h2 id=\"3-response-conventions---read-this-first\">3. Response conventions - read this first</h2>\n<p><strong>V1 and V2 do not use one response shape. There are four.</strong> Which one you get depends on the endpoint, and nothing in the URL tells you which. This is the single most common source of integration bugs on this API - check the table below before writing a deserialiser.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Family</th>\n<th>Shape</th>\n<th>Endpoints</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>A</strong></td>\n<td><code>{\"data\": …}</code></td>\n<td><code>Auth/Login</code>, <code>Member/Enroll</code>, <code>Enroll-Member</code>, <code>Enroll-Change-Plan</code>, <code>Enroll-Update-Effective</code>, <code>Enroll-Renewal</code>, <code>Suspend</code>, <code>Reinstate</code>, <code>Terminate</code>, <code>ReActivate</code>, <code>Enroll/{…}</code></td>\n</tr>\n<tr>\n<td><strong>B</strong></td>\n<td><code>{\"isSuccess\": …, \"data\": …}</code></td>\n<td><code>Claims/SubmitClaim</code>, <code>Claims/Upload/{claimNumber}</code>, <code>Claims/HistoryClaim</code>, <code>Member/ListMemberByClientCode</code>, <code>Member/ListProviderFacility</code></td>\n</tr>\n<tr>\n<td><strong>C</strong></td>\n<td>resource root, no envelope</td>\n<td><code>Member/FindByCardNumber</code>, <code>Member/GetBenefitsByCardNumber</code>, <code>Member/GetListClaim</code>, <code>Member/GetDataClaim</code></td>\n</tr>\n<tr>\n<td><strong>D</strong></td>\n<td><code>{\"isSuccess\", \"message\", \"data\", \"page\"}</code></td>\n<td><code>Member/ListByCorporateCode</code>, <code>Claims/ListByCorporateCode</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"a-family-a---data-only\">(a) Family A - <code>data</code> only</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"data\": { } }\n</code></pre>\n<p><code>data</code> is an object for Login and an <strong>array of member records</strong> for every enrolment action. There is no <code>isSuccess</code> on this family - the HTTP status code carries that meaning.</p>\n<h3 id=\"b-family-b---issuccess-plus-data\">(b) Family B - <code>isSuccess</code> plus <code>data</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"isSuccess\": true, \"data\": { } }\n</code></pre>\n<p><strong><code>isSuccess</code> is the authority here, not the status code.</strong> These endpoints can return <code>200</code> with <code>isSuccess: false</code> - <code>Claims/Upload</code> and <code>Claims/HistoryClaim</code> both do.</p>\n<h3 id=\"c-family-c---no-envelope-at-all\">(c) Family C - no envelope at all</h3>\n<p>The downstream payload arrives at the top level under a resource-specific root key:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"member\": { }, \"familyMember\": [], \"resource\": { } }\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"plans\": [] }\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"listGL\": [], \"page\": 1, \"pageSize\": 10, \"totalItems\": 0, \"totalPages\": 0 }\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"claims\": { } }\n</code></pre>\n<p>Do not look for <code>data</code> on these. Each endpoint's own documentation names its root key.</p>\n<h3 id=\"d-family-d---issuccess-message-data-page\">(d) Family D - <code>isSuccess</code>, <code>message</code>, <code>data</code>, <code>page</code></h3>\n<p>The two <code>ListByCorporateCode</code> endpoints. Unlike every other family, <strong>fields here are omitted when null rather than sent as <code>null</code></strong> - <code>page</code>, <code>errors</code>, <code>corporateCode</code> and others disappear from the body entirely depending on whether you asked for one corporate code or several. Test for key presence, not for null.</p>\n<h3 id=\"success-status-codes\">Success status codes</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Returned by</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Login, ReActivate, and every query endpoint</td>\n</tr>\n<tr>\n<td><code>201</code></td>\n<td><code>Enroll</code> - a member and policy were created</td>\n</tr>\n<tr>\n<td><code>202</code></td>\n<td><code>Enroll-Member</code>, <code>Enroll-Change-Plan</code>, <code>Enroll-Update-Effective</code>, <code>Enroll-Renewal</code>, <code>Terminate</code>, <code>Suspend</code>, <code>Reinstate</code> - accepted and applied downstream</td>\n</tr>\n</tbody>\n</table>\n</div><p>Treat <code>2xx</code> as success rather than matching on <code>200</code>.</p>\n<hr />\n<h2 id=\"4-error-shapes\">4. Error shapes</h2>\n<p>Three distinct error bodies. An integration should handle all three.</p>\n<p><strong>(a) Business rule refusal</strong> - PascalCase, from the exception middleware:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"Status\": 400,\n  \"Errors\": [\n    { \"ErrorCode\": \"MemberAndPolicyExist\", \"Message\": \"Policy for this member already exist. To update the plan, please use PUT method instead.\" }\n  ]\n}\n</code></pre>\n<p><code>Status</code> and <code>Errors[].ErrorCode</code> are always present; <code>Errors[].Message</code> is optional. Common codes:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>MemberAndPolicyExist</code></td>\n<td>The member already holds this policy. Use the PUT endpoint to change the plan.</td>\n</tr>\n<tr>\n<td><code>MemberOrPolicyNotExist</code></td>\n<td>No such member/policy combination.</td>\n</tr>\n<tr>\n<td><code>InternalServerError</code></td>\n<td>Also used for \"Data not found.\" on member lookups - check the message, not just the code.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>(b) Model-binding validation</strong> - RFC 7807, rejected before the handler runs. Note the <code>traceId</code>, which is useful when raising a ticket:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n  \"title\": \"One or more validation errors occurred.\",\n  \"status\": 400,\n  \"errors\": { \"cardNumber\": [\"The cardNumber field is required.\"] },\n  \"traceId\": \"00-3b86a6c4b27dc9b8359723e347dfe8d0-0fb48761a454a525-00\"\n}\n</code></pre>\n<p><strong>(c) Missing or invalid token</strong> - <code>401</code> with an empty body.</p>\n<h3 id=\"the-login-trap\">The Login trap</h3>\n<p><strong><code>Auth/Login</code> returns failures as HTTP <code>200</code>.</strong> A bad client key or server key does not produce a <code>4xx</code>; it produces:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"data\": \"Not Found\" }\n</code></pre>\n<p>Check whether <code>data</code> is a <strong>string</strong> rather than an object before trusting a Login response. This behaviour is specific to Login.</p>\n<hr />\n<h2 id=\"5-endpoint-inventory\">5. Endpoint inventory</h2>\n<h3 id=\"auth\">Auth</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>POST</td>\n<td><code>/api/Auth/Login</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"enrolment\">Enrolment</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/Enroll</code></td>\n<td>Create member + policy</td>\n</tr>\n<tr>\n<td>PUT</td>\n<td><code>/api/Member/Enroll-Member</code></td>\n<td>Update member, add dependant</td>\n</tr>\n<tr>\n<td>PUT</td>\n<td><code>/api/Member/Enroll-Change-Plan</code></td>\n<td>Change plan</td>\n</tr>\n<tr>\n<td>PUT</td>\n<td><code>/api/Member/Enroll-Update-Effective</code></td>\n<td>Change policy effective dates</td>\n</tr>\n<tr>\n<td>PUT</td>\n<td><code>/api/Member/Enroll-Renewal</code></td>\n<td>Renew policy</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/Suspend</code></td>\n<td>Suspend a policy</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/Reinstate</code></td>\n<td>Reverse a suspension</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/Terminate</code></td>\n<td>Terminate a policy</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/ReActivate</code></td>\n<td>Re-enrol a terminated member</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/api/Member/Enroll/{memberId}/{policyNumber}/{corporateCode}</code></td>\n<td>Read an enrolment</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/Enroll-Member-Bulk</code></td>\n<td>Bulk enrol - NOVA-style record</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/New-Enroll-Member-Bulk</code></td>\n<td>Bulk enrol - product-based record</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"members\">Members</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/ListMemberByClientCode</code></td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/api/Member/FindByCardNumber/{cardNo}</code></td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/api/Member/GetBenefitsByCardNumber/{cardNo}</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/ListByCorporateCode</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"claims\">Claims</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/GetListClaim</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/GetDataClaim</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/DownloadIGL</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/DownloadFGL</code></td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/api/Claims/ValidationCashless</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Claims/SubmitClaimCashless</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Claims/SubmitClaim</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Claims/Upload/{claimNumber}</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Claims/HistoryClaim</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Claims/GetListDataByClaimNumber</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/api/Claims/ListByCorporateCode</code></td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/api/Claims/PolicyDetails</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"providers\">Providers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>POST</td>\n<td><code>/api/Member/ListProviderFacility</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Not documented here, deliberately:</strong> <code>Member/All/{page}</code> is an unscoped listing intended for internal use, and <code>Member/Enroll-Member-Alianz</code> is a client-specific bulk variant. <code>Claims/GetDataByClaimNumber</code> is a GET duplicate of <code>Member/GetDataClaim</code> - use the documented POST.</p>\n<hr />\n<h2 id=\"6-dates-numbers-and-paging\">6. Dates, numbers and paging</h2>\n<ul>\n<li>Enrolment request dates (<code>dateOfBirth</code>, <code>startDate</code>, <code>endDate</code>) are <code>yyyy-MM-dd</code>.</li>\n<li>Bulk enrolment dates are <strong>strings</strong> with no enforced format - follow the template you were given.</li>\n<li>Claim dates in responses are ISO-8601 datetimes.</li>\n<li>Money is a JSON number. Currency is named in a sibling field where relevant.</li>\n<li>Paged query endpoints take <code>page</code> as an object: <code>{ \"page\": 1, \"pageSize\": 10, \"query\": null }</code>, defaults <code>1</code> / <code>10</code>.</li>\n<li>The <code>ListByCorporateCode</code> endpoints take paging as <code>{ \"page\": 1, \"pageSize\": 10 }</code> and accept <code>corporateCode</code> as <strong>either a single string or an array of strings</strong>.</li>\n</ul>\n<hr />\n<h2 id=\"7-example-data\">7. Example data</h2>\n<p>Every example in this folder is synthetic and follows one fictional journey:</p>\n<blockquote>\n<p><strong>John Doe</strong>, member <code>MEM00000001</code>, policy <code>POL0000000000001</code>, corporate <code>CORP01</code>, card <code>9999000000000001</code>, claim <code>CL2601010000001H</code>.</p>\n</blockquote>\n<p>No card number, claim number, member name, policy number or key in any example is real.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"_postman_id":"523f522d-2941-42db-a086-102b1051e12d"},{"name":"V3","item":[{"name":"Cambridge API - V3","item":[{"name":"OAuth","item":[{"name":"Get Token","event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Store the access token for every other request in this folder.","if (pm.response.code === 200) {","    const res = pm.response.json();","    pm.collectionVariables.set(\"accessToken\", res.access_token);","}"]}}],"id":"8a40a088-70ca-4fd3-8460-06de5954a317","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/oauth/token","description":"<p>Obtain a machine access token via the client-credentials grant.</p>\n<p><strong><code>POST /v3/api/oauth/token</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td>None - this is the only unauthenticated endpoint</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td>-</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>The only way a machine integration authenticates. The token's <code>permissions</code> and <code>bindings</code> claims are resolved at issue time from the API client's grants and the tenant's data bindings, so <strong>a permission or binding change takes effect on the next token, not the current one.</strong></p>\n<p>Token lifetime is 60 minutes. There is no refresh mechanism - request a new token.</p>\n<p>This request's post-response script writes <code>access_token</code> into the <code>accessToken</code> collection variable, which every other request in this folder inherits.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Must be <code>client_credentials</code> (case-insensitive).</td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The API client's identifier.</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The API client's secret, as issued at creation or rotation.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Credentials are not stored in this collection.</strong> <code>{{clientId}}</code> and <code>{{clientSecret}}</code> are secret-typed environment variables with no saved value.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Token issued.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Unsupported grant type, or client authentication failed.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---200\">Response fields - <code>200</code></h3>\n<p>All three fields are always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>access_token</code></td>\n<td>string(jwt)</td>\n<td>No</td>\n<td>Signed JWT, audience <code>cambridge-api</code>.</td>\n</tr>\n<tr>\n<td><code>token_type</code></td>\n<td>string</td>\n<td>No</td>\n<td>Always <code>Bearer</code>.</td>\n</tr>\n<tr>\n<td><code>expires_in</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td>Seconds until expiry - <code>3600</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---400\">Response fields - <code>400</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>invalid_client</code> or <code>unsupported_grant_type</code>.</td>\n</tr>\n<tr>\n<td><code>error_description</code></td>\n<td>string</td>\n<td>No</td>\n<td>Human-readable cause.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Unknown client ID, wrong secret, disabled client and expired client all collapse into one <code>invalid_client</code> response <strong>on purpose</strong> - a caller cannot use the error to learn whether a client ID exists.</p>\n</blockquote>\n","urlObject":{"path":["v3","api","oauth","token"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"214fae99-4bad-402b-8901-18633c69897e","name":"Token issued","originalRequest":{"auth":{"type":"noauth"},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/oauth/token"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIs...\",\n    \"token_type\": \"Bearer\",\n    \"expires_in\": 3600\n}"},{"id":"af5838ae-c4ed-460c-8d62-ffdd77651625","name":"Invalid client","originalRequest":{"auth":{"type":"noauth"},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/oauth/token"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"invalid_client\",\n    \"error_description\": \"Client authentication failed.\"\n}"},{"id":"6a3fdd68-1810-481e-813d-7b819213a556","name":"Unsupported grant type","originalRequest":{"auth":{"type":"noauth"},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/oauth/token"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"unsupported_grant_type\",\n    \"error_description\": \"Only client_credentials grant type is supported.\"\n}"}],"_postman_id":"8a40a088-70ca-4fd3-8460-06de5954a317"}],"id":"ad1f3fa8-f8e0-4314-b2c0-2372323d0bde","description":"<p>Obtain the machine access token.</p>\n<p>Run <strong>Get Token</strong> first - its post-response script writes the token into the <code>accessToken</code> collection variable, which every other request in this folder inherits.</p>\n","_postman_id":"ad1f3fa8-f8e0-4314-b2c0-2372323d0bde","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}},{"name":"Claim","item":[{"name":"Search Claim","item":[{"name":"Search Cases","id":"d2886413-1509-44a4-a2da-67dece214b8d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/search?page=1&pageSize=10&cardNumber=202601010-00000001","description":"<p>Search cases and claims within the tenant's scope.</p>\n<p><strong><code>GET /v3/api/cases/search</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:search</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Results pre-filtered to corporate + client bindings</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Returns a paged, filtered list of cases the calling tenant is permitted to see. Results are <strong>already</strong> restricted to the tenant's corporate and client bindings, so a caller never needs to filter again on its own side - a case outside those bindings is absent from the page rather than returned with an error.</p>\n<p>Parameter names bind case-insensitively, so <code>page</code> and <code>Page</code> both reach the same field.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>query</td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>-</td>\n<td>Member's card number to filter by.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>query</td>\n<td>string</td>\n<td>enum</td>\n<td>No</td>\n<td>-</td>\n<td><code>New Case</code>, <code>Registered</code>, <code>FGL Review</code>, <code>FGL Released</code>, <code>Payment In Progress</code>, <code>Paid</code>, <code>Void</code>.</td>\n</tr>\n<tr>\n<td><code>tipePerawatan</code></td>\n<td>query</td>\n<td>string</td>\n<td>enum</td>\n<td>No</td>\n<td>-</td>\n<td><code>Rawat inap</code> (inpatient), <code>Rawat jalan</code> (outpatient).</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>query</td>\n<td>integer</td>\n<td>int32, min 1</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>query</td>\n<td>integer</td>\n<td>int32, min 1</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size.</td>\n</tr>\n<tr>\n<td><code>view</code></td>\n<td>query</td>\n<td>integer</td>\n<td>int32</td>\n<td>No</td>\n<td>-</td>\n<td>Alias for <code>pageSize</code>. <strong>When present it wins.</strong></td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>bearer</td>\n<td>Yes</td>\n<td>-</td>\n<td><code>Bearer &lt;access_token&gt;</code> from Get Token.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The page, possibly empty. An out-of-scope or unmatched search is an empty page, <strong>not</strong> an error.</td>\n<td><code>V3ListData&lt;CaseDto&gt;</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Malformed query value, e.g. <code>page=abc</code>.</td>\n<td>RFC 7807 problem document</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing, expired or wrong-audience token.</td>\n<td><strong>Empty body</strong> + <code>WWW-Authenticate</code> header</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Token valid but lacks <code>cases:search</code>.</td>\n<td><strong>Empty body</strong></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---envelope\">Response fields - envelope</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data.list</code></td>\n<td>array</td>\n<td>No</td>\n<td>The page of case summaries. Empty array, never null.</td>\n</tr>\n<tr>\n<td><code>data.page</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td>Current page number.</td>\n</tr>\n<tr>\n<td><code>data.view</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td><strong>The page size</strong> - not a view name.</td>\n</tr>\n<tr>\n<td><code>data.totalPage</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td>Total pages available.</td>\n</tr>\n<tr>\n<td><code>data.totalRecord</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td>Total matching records across all pages.</td>\n</tr>\n<tr>\n<td><code>data.query</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Free-text query echo; <code>null</code> in current usage.</td>\n</tr>\n<tr>\n<td><code>data.filter</code></td>\n<td>object</td>\n<td>No</td>\n<td>Echoes back the request that produced this page.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---datalist\">Response fields - <code>data.list[]</code></h3>\n<p><strong>Every one of these 67 fields is nullable.</strong> All are always present in the JSON.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer(int64)</td>\n<td>Internal record ID.</td>\n</tr>\n<tr>\n<td><code>claimNo</code></td>\n<td>string</td>\n<td><strong>The claim number</strong> - pass to Get Case Detail, Validate Billing, Release GL and Void.</td>\n</tr>\n<tr>\n<td><code>claimNoPayor</code></td>\n<td>string</td>\n<td>Payor's own claim reference.</td>\n</tr>\n<tr>\n<td><code>idTask</code></td>\n<td>string</td>\n<td>Workflow task ID.</td>\n</tr>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>memberName</code></td>\n<td>string</td>\n<td>Member's name.</td>\n</tr>\n<tr>\n<td><code>memberNumber</code>, <code>insuranceNumber</code>, <code>polisNumber</code></td>\n<td>string</td>\n<td>Member identifiers.</td>\n</tr>\n<tr>\n<td><code>dob</code></td>\n<td>string(date-time)</td>\n<td>Date of birth.</td>\n</tr>\n<tr>\n<td><code>joinDate</code>, <code>reinstateDate</code></td>\n<td>string(date-time)</td>\n<td>Membership dates.</td>\n</tr>\n<tr>\n<td><code>claimStatus</code></td>\n<td>string</td>\n<td>Current status. <strong><code>Registered</code> is the only value the Void endpoint accepts.</strong></td>\n</tr>\n<tr>\n<td><code>prevStatus</code>, <code>lastStatus</code></td>\n<td>string</td>\n<td>Previous and last status.</td>\n</tr>\n<tr>\n<td><code>claimStatusGroup</code></td>\n<td>string</td>\n<td>Coarse grouping, e.g. <code>Closed</code>.</td>\n</tr>\n<tr>\n<td><code>aceStatus</code></td>\n<td>string</td>\n<td>ACE interpretation status; <code>null</code> when ACE has not run.</td>\n</tr>\n<tr>\n<td><code>remark</code>, <code>exclussionRemark</code></td>\n<td>string</td>\n<td>Free text. <em>(The double-s spelling is the real field name.)</em></td>\n</tr>\n<tr>\n<td><code>plafon</code></td>\n<td>number(decimal)</td>\n<td>Plan ceiling.</td>\n</tr>\n<tr>\n<td><code>limitAvailable</code></td>\n<td>number(decimal)</td>\n<td>Remaining limit. <strong>Never exposed by Price Eligibility, by design.</strong></td>\n</tr>\n<tr>\n<td><code>paid</code>, <code>totalPaid</code></td>\n<td>number(decimal)</td>\n<td>Amount paid.</td>\n</tr>\n<tr>\n<td><code>totalClaim</code></td>\n<td>number(decimal)</td>\n<td>Amount claimed.</td>\n</tr>\n<tr>\n<td><code>totalExcess</code></td>\n<td>number(decimal)</td>\n<td>Amount falling to the patient.</td>\n</tr>\n<tr>\n<td><code>isCoShare</code>, <code>isDeductable</code>, <code>isFamilySharing</code></td>\n<td>boolean</td>\n<td>Cost-sharing flags.</td>\n</tr>\n<tr>\n<td><code>coShare</code>, <code>deductable</code></td>\n<td>number(decimal)</td>\n<td>Cost-sharing amounts.</td>\n</tr>\n<tr>\n<td><code>roomPrice</code>, <code>occupiedPrice</code></td>\n<td>number(decimal)</td>\n<td>Room rates.</td>\n</tr>\n<tr>\n<td><code>kursFrom</code>, <code>kursTo</code>, <code>remarksCurrency</code></td>\n<td>string</td>\n<td>Currency codes.</td>\n</tr>\n<tr>\n<td><code>rate</code>, <code>rateInput</code>, <code>bufferRate</code></td>\n<td>number(decimal)</td>\n<td>FX rates.</td>\n</tr>\n<tr>\n<td><code>exchange</code></td>\n<td>string</td>\n<td>FX rate <strong>as a string</strong> - inconsistent with the three above.</td>\n</tr>\n<tr>\n<td><code>diagnoseCode</code></td>\n<td>string</td>\n<td>ICD-10 code.</td>\n</tr>\n<tr>\n<td><code>diagnoseDesc</code></td>\n<td>string</td>\n<td>Diagnosis description.</td>\n</tr>\n<tr>\n<td><code>providerCode</code>, <code>providerName</code></td>\n<td>string</td>\n<td>Treating provider.</td>\n</tr>\n<tr>\n<td><code>treatmentType</code></td>\n<td>string</td>\n<td><code>Rawat inap</code> / <code>Rawat jalan</code>.</td>\n</tr>\n<tr>\n<td><code>benefitType</code></td>\n<td>string</td>\n<td>e.g. <code>OUTPATIENT</code>, <code>TELEMEDICINE</code>.</td>\n</tr>\n<tr>\n<td><code>claimType</code></td>\n<td>string</td>\n<td>e.g. <code>CASHLESS</code>.</td>\n</tr>\n<tr>\n<td><code>claimSource</code></td>\n<td>string</td>\n<td>e.g. <code>Web Provider</code>.</td>\n</tr>\n<tr>\n<td><code>customerCode</code>, <code>customerName</code></td>\n<td>string</td>\n<td>Corporate.</td>\n</tr>\n<tr>\n<td><code>holdingCode</code>, <code>holdingName</code></td>\n<td>string</td>\n<td>Holding group.</td>\n</tr>\n<tr>\n<td><code>planDetailCode</code>, <code>planNameDetail</code></td>\n<td>string</td>\n<td>Plan.</td>\n</tr>\n<tr>\n<td><code>claimDate</code>, <code>admisionDate</code>, <code>dischargeDate</code></td>\n<td>string(date-time)</td>\n<td>Claim and treatment dates. <em>(<code>admisionDate</code> - the single-d spelling is the real field name.)</em></td>\n</tr>\n<tr>\n<td><code>dateBegin</code>, <code>dateEnd</code></td>\n<td>string(date-time)</td>\n<td>Policy period.</td>\n</tr>\n<tr>\n<td><code>datePaid</code>, <code>closedAt</code>, <code>startPickUp</code></td>\n<td>string(date-time)</td>\n<td>Settlement milestones.</td>\n</tr>\n<tr>\n<td><code>createdAt</code>, <code>updatedAt</code></td>\n<td>string(date-time)</td>\n<td>Audit timestamps.</td>\n</tr>\n<tr>\n<td><code>onGoingDay</code>, <code>onGoingHour</code></td>\n<td>integer(int32)</td>\n<td>Elapsed time in state.</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>string</td>\n<td>Human-readable duration, e.g. <code>1d 2h</code>.</td>\n</tr>\n<tr>\n<td><code>analystName</code>, <code>avatar</code></td>\n<td>string</td>\n<td>Assigned analyst.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases","search"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[{"description":{"content":"<p>Page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Page size. Default 10.</p>\n","type":"text/plain"},"key":"pageSize","value":"10"},{"description":{"content":"<p>Member's card number to filter by.</p>\n","type":"text/plain"},"key":"cardNumber","value":"202601010-00000001"},{"disabled":true,"description":{"content":"<p>New Case | Registered | FGL Review | FGL Released | Payment In Progress | Paid | Void</p>\n","type":"text/plain"},"key":"status","value":""},{"disabled":true,"description":{"content":"<p>Rawat inap (inpatient) | Rawat jalan (outpatient)</p>\n","type":"text/plain"},"key":"tipePerawatan","value":""},{"disabled":true,"description":{"content":"<p>Alias for pageSize. When present it wins.</p>\n","type":"text/plain"},"key":"view","value":""}],"variable":[]}},"response":[{"id":"c5527ac5-e859-4993-814f-b95314feec1b","name":"Page of results","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/search?page=1&pageSize=10&cardNumber=202601010-00000001","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases","search"],"query":[{"key":"page","value":"1","description":"Page number. Default 1."},{"key":"pageSize","value":"10","description":"Page size. Default 10."},{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number to filter by."},{"key":"status","value":"","description":"New Case | Registered | FGL Review | FGL Released | Payment In Progress | Paid | Void","disabled":true},{"key":"tipePerawatan","value":"","description":"Rawat inap (inpatient) | Rawat jalan (outpatient)","disabled":true},{"key":"view","value":"","description":"Alias for pageSize. When present it wins.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"list\": [\n            {\n                \"id\": 10000001,\n                \"dob\": \"1990-01-01T00:00:00\",\n                \"insuranceNumber\": \"INS00000001\",\n                \"polisNumber\": \"POL0000000000001\",\n                \"memberNumber\": \"MEM00000001\",\n                \"cardNumber\": \"202601010-00000001\",\n                \"memberName\": \"John Doe\",\n                \"plafon\": 10000000.0,\n                \"paid\": 2500000.0,\n                \"claimStatus\": \"Paid\",\n                \"prevStatus\": \"Payment In Progress\",\n                \"claimStatusGroup\": \"Closed\",\n                \"limitAvailable\": 7500000.0,\n                \"dateBegin\": \"2026-01-01T00:00:00\",\n                \"dateEnd\": \"2026-12-31T23:59:59\",\n                \"claimNo\": \"CL2601010000001H\",\n                \"claimSource\": \"Web Provider\",\n                \"customerName\": \"Sample Corporate\",\n                \"customerCode\": \"CORP01\",\n                \"holdingName\": \"Sample Holding\",\n                \"holdingCode\": \"HLD01\",\n                \"planDetailCode\": \"PLAN-001\",\n                \"planNameDetail\": \"Sample Inpatient Plan (PLAN-001)\",\n                \"providerCode\": \"PRV001\",\n                \"providerName\": \"Sample Clinic\",\n                \"onGoingDay\": 0,\n                \"onGoingHour\": 0,\n                \"claimDate\": \"2026-01-01T19:52:31\",\n                \"admisionDate\": \"2026-01-01T00:00:00\",\n                \"dischargeDate\": \"2026-01-01T00:00:00\",\n                \"claimType\": \"CASHLESS\",\n                \"remark\": \"Paid claim\",\n                \"totalPaid\": 2500000.0,\n                \"totalExcess\": 0.0,\n                \"totalClaim\": 2500000.0,\n                \"lastStatus\": \"Paid\",\n                \"diagnoseCode\": \"A09\",\n                \"diagnoseDesc\": \"Diarrhoea and gastroenteritis of infectious origin\",\n                \"exclussionRemark\": \"\",\n                \"claimNoPayor\": \"PAY00000001\",\n                \"joinDate\": \"2026-01-01T00:00:00\",\n                \"reinstateDate\": null,\n                \"benefitType\": \"OUTPATIENT\",\n                \"kursFrom\": \"IDR\",\n                \"kursTo\": \"IDR\",\n                \"rate\": 1.0,\n                \"exchange\": \"1.0\",\n                \"isCoShare\": false,\n                \"coShare\": 0.0,\n                \"isDeductable\": false,\n                \"deductable\": 0.0,\n                \"roomPrice\": 500000.0,\n                \"occupiedPrice\": 500000.0,\n                \"remarksCurrency\": \"IDR\",\n                \"rateInput\": 1.0,\n                \"bufferRate\": 1.0,\n                \"treatmentType\": \"Rawat jalan\",\n                \"isFamilySharing\": false,\n                \"datePaid\": \"2026-01-15T08:07:58\",\n                \"createdAt\": \"2026-01-01T12:52:50\",\n                \"updatedAt\": \"2026-01-15T08:07:58\",\n                \"startPickUp\": null,\n                \"closedAt\": \"2026-01-15T08:07:58\",\n                \"analystName\": \"Sample Analyst\",\n                \"avatar\": null,\n                \"duration\": \"1d 2h\",\n                \"idTask\": \"TASK00000001\",\n                \"aceStatus\": null\n            }\n        ],\n        \"page\": 1,\n        \"view\": 10,\n        \"totalPage\": 1,\n        \"totalRecord\": 1,\n        \"query\": null,\n        \"filter\": {\n            \"page\": 1,\n            \"pageSize\": 10,\n            \"view\": null,\n            \"cardNumber\": \"202601010-00000001\",\n            \"status\": null,\n            \"tipePerawatan\": null\n        }\n    }\n}"},{"id":"932020f0-a549-4f01-9ba8-89258a02f11b","name":"No results","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/search?page=1&pageSize=10&cardNumber=202601010-00000001","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases","search"],"query":[{"key":"page","value":"1","description":"Page number. Default 1."},{"key":"pageSize","value":"10","description":"Page size. Default 10."},{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number to filter by."},{"key":"status","value":"","description":"New Case | Registered | FGL Review | FGL Released | Payment In Progress | Paid | Void","disabled":true},{"key":"tipePerawatan","value":"","description":"Rawat inap (inpatient) | Rawat jalan (outpatient)","disabled":true},{"key":"view","value":"","description":"Alias for pageSize. When present it wins.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"list\": [],\n        \"page\": 1,\n        \"view\": 10,\n        \"totalPage\": 0,\n        \"totalRecord\": 0,\n        \"query\": null,\n        \"filter\": {\n            \"page\": 1,\n            \"pageSize\": 10,\n            \"view\": null,\n            \"cardNumber\": \"202601010-00000001\",\n            \"status\": null,\n            \"tipePerawatan\": null\n        }\n    }\n}"},{"id":"50233a2e-064b-4d69-8bde-840929ed973e","name":"Unauthenticated - empty body","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/search?page=1&pageSize=10&cardNumber=202601010-00000001","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases","search"],"query":[{"key":"page","value":"1","description":"Page number. Default 1."},{"key":"pageSize","value":"10","description":"Page size. Default 10."},{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number to filter by."},{"key":"status","value":"","description":"New Case | Registered | FGL Review | FGL Released | Payment In Progress | Paid | Void","disabled":true},{"key":"tipePerawatan","value":"","description":"Rawat inap (inpatient) | Rawat jalan (outpatient)","disabled":true},{"key":"view","value":"","description":"Alias for pageSize. When present it wins.","disabled":true}]}},"status":"Unauthorized","code":401,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"470bb639-4adf-4998-9153-12cc4e8b607a","name":"Missing permission - empty body","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/search?page=1&pageSize=10&cardNumber=202601010-00000001","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases","search"],"query":[{"key":"page","value":"1","description":"Page number. Default 1."},{"key":"pageSize","value":"10","description":"Page size. Default 10."},{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number to filter by."},{"key":"status","value":"","description":"New Case | Registered | FGL Review | FGL Released | Payment In Progress | Paid | Void","disabled":true},{"key":"tipePerawatan","value":"","description":"Rawat inap (inpatient) | Rawat jalan (outpatient)","disabled":true},{"key":"view","value":"","description":"Alias for pageSize. When present it wins.","disabled":true}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"d2886413-1509-44a4-a2da-67dece214b8d"},{"name":"Get Case Detail","id":"a933e7e5-d245-4104-a0c2-389e2f807b26","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber","description":"<p>Retrieve one case in full, including documents and status log.</p>\n<p><strong><code>GET /v3/api/cases/{claimNumber}</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:read</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + corporate/client bindings</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim/case number, e.g. <code>CL2601010000001H</code>.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;access_token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The case.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>The claim falls outside the tenant's provider/corporate/client bindings.</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>No such claim number.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<p>All fields are nullable and always present.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code>, <code>cardNumber</code>, <code>providerCode</code></td>\n<td>string</td>\n<td>Identifiers.</td>\n</tr>\n<tr>\n<td><code>claimStatus</code></td>\n<td>string</td>\n<td>Current status.</td>\n</tr>\n<tr>\n<td><code>claimStatusDisplay</code></td>\n<td>string</td>\n<td>Display form, e.g. <code>Open</code>, <code>Closed</code>.</td>\n</tr>\n<tr>\n<td><code>claimStatusPrev</code>, <code>claimStatusPrevOriginal</code></td>\n<td>string</td>\n<td>Previous status, two variants.</td>\n</tr>\n<tr>\n<td><code>isConfirmRelease</code></td>\n<td>boolean</td>\n<td>Whether release has been confirmed.</td>\n</tr>\n<tr>\n<td><code>remark</code></td>\n<td>string</td>\n<td>Free-text remark.</td>\n</tr>\n<tr>\n<td><code>remarkRejectVoid</code></td>\n<td>string</td>\n<td><strong>The reason supplied when the case was voided.</strong></td>\n</tr>\n<tr>\n<td><code>claimArea</code>, <code>benefitType</code>, <code>claimType</code>, <code>claimSource</code>, <code>treatmentType</code></td>\n<td>string</td>\n<td>Classification.</td>\n</tr>\n<tr>\n<td><code>indate</code>, <code>outdate</code></td>\n<td>string(date-time)</td>\n<td>Admission / discharge. <strong><code>outdate</code> is set automatically on void.</strong></td>\n</tr>\n<tr>\n<td><code>claimDate</code>, <code>paymentDate</code>, <code>createdDate</code>, <code>updatedDate</code></td>\n<td>string(date-time)</td>\n<td>Milestones.</td>\n</tr>\n<tr>\n<td><code>invoiceNumber</code></td>\n<td>string</td>\n<td>Invoice reference.</td>\n</tr>\n<tr>\n<td><code>deliveryNotes</code></td>\n<td>string</td>\n<td>Delivery notes.</td>\n</tr>\n<tr>\n<td><code>members</code></td>\n<td>string[]</td>\n<td>Member names on the case. Initialised to <code>[]</code> but typed nullable.</td>\n</tr>\n<tr>\n<td><code>counter</code></td>\n<td>integer(int32)</td>\n<td>Visit counter.</td>\n</tr>\n<tr>\n<td><code>aceStatus</code></td>\n<td>string</td>\n<td>ACE status.</td>\n</tr>\n<tr>\n<td><code>claimDocuments</code></td>\n<td>object[]</td>\n<td>Document groups. Initialised to <code>[]</code> but typed nullable.</td>\n</tr>\n<tr>\n<td><code>logs</code></td>\n<td>object[]</td>\n<td>Status trail. Initialised to <code>[]</code> but typed nullable.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>claimDocuments[]</code></strong> - <code>label</code> string, <code>area</code> string, <code>document</code> object[]. All nullable.</p>\n<p><strong><code>claimDocuments[].document[]</code></strong> - <code>id</code> integer(int64), <code>name</code> string, <code>status</code> string, <code>isArchive</code> boolean, <code>isActive</code> boolean, <code>receiveDate</code> string(date-time). All nullable.</p>\n<p><strong><code>logs[]</code></strong> - <code>action</code> string, <code>remark</code> string, <code>createdAt</code> string(date-time), <code>createdBy</code> string. All nullable.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases",":claimNumber"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[{"description":{"content":"<p>The claim/case number, e.g. CL2601010000001H.</p>\n","type":"text/plain"},"type":"any","value":"CL2601010000001H","key":"claimNumber"}]}},"response":[{"id":"dcfaf5a9-ede5-41cb-9272-80e81e9163f9","name":"Case detail","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number, e.g. CL2601010000001H."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"treatmentType\": \"Rawat jalan\",\n        \"providerCode\": \"PRV001\",\n        \"claimNumber\": \"CL2601010000001H\",\n        \"cardNumber\": \"202601010-00000001\",\n        \"isConfirmRelease\": false,\n        \"claimStatusDisplay\": \"Closed\",\n        \"claimStatus\": \"Void\",\n        \"claimStatusPrev\": \"Registered\",\n        \"claimStatusPrevOriginal\": \"Registered\",\n        \"claimArea\": \"\",\n        \"benefitType\": \"TELEMEDICINE\",\n        \"remark\": null,\n        \"remarkRejectVoid\": \"Pasien membatalkan janji temu sebelum konsultasi.\",\n        \"indate\": \"2026-01-01T00:00:00\",\n        \"outdate\": \"2026-01-01T10:36:44.004885\",\n        \"claimDate\": \"2026-01-01T10:32:03.587625\",\n        \"paymentDate\": null,\n        \"deliveryNotes\": null,\n        \"createdDate\": \"2026-01-01T10:32:03.587\",\n        \"updatedDate\": \"2026-01-01T10:36:44.004\",\n        \"members\": [\"John Doe\"],\n        \"counter\": 1,\n        \"claimDocuments\": [\n            {\n                \"label\": \"Group_batch_0000000000000_sample\",\n                \"area\": \"settlement\",\n                \"document\": [\n                    {\n                        \"id\": 10000001,\n                        \"name\": \"260101000000_CL2601010000001H_FPG.pdf\",\n                        \"status\": \"VALID\",\n                        \"isArchive\": false,\n                        \"isActive\": true,\n                        \"receiveDate\": \"2026-01-01T19:20:07.772\"\n                    }\n                ]\n            },\n            { \"label\": \"Chat\", \"area\": \"Chat\", \"document\": [] }\n        ],\n        \"logs\": [\n            {\n                \"action\": \"CREATE\",\n                \"remark\": \"CLAIM CREATED\",\n                \"createdAt\": \"2026-01-01T10:32:03.587\",\n                \"createdBy\": \"provider@example.com\"\n            }\n        ],\n        \"invoiceNumber\": \"INV00000001\",\n        \"claimSource\": \"Web Provider\",\n        \"claimType\": \"CASHLESS\",\n        \"aceStatus\": null\n    }\n}"},{"id":"f90c9ab5-c3ec-4c35-b227-a0c9717564af","name":"Access denied","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number, e.g. CL2601010000001H."}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Access denied\",\n    \"data\": null\n}"},{"id":"859aba51-023b-4452-bdd9-714afdebdb53","name":"Case not found","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number, e.g. CL2601010000001H."}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Case not found\",\n    \"data\": null\n}"}],"_postman_id":"a933e7e5-d245-4104-a0c2-389e2f807b26"}],"id":"411265fe-d918-4574-807b-36af655cdbf3","description":"<p>Read-only views over cases already in the system: a paged, filtered list, and a single case's full detail including documents and status log.</p>\n","_postman_id":"411265fe-d918-4574-807b-36af655cdbf3","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}},{"name":"Member Eligibility","item":[{"name":"Check Member Eligibility","id":"9e098962-e441-4c7a-8362-616f13f134d8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"providerCode\": \"PRV001\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/member-eligibility","description":"<p>Confirm the member is active and return their benefit structure.</p>\n<p><strong><code>POST /v3/api/cases/member-eligibility</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:read</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + member corporate/client bindings</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p><strong>Run this first.</strong> It supplies the <code>benefitCode</code> values that Create Case and Price Eligibility require.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>dob</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Member's date of birth.</td>\n</tr>\n<tr>\n<td><code>providerCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Provider code; resolved from the tenant's bindings when omitted.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Member is active; benefit structure returned.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Member unknown, inactive or suspended.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Provider, corporate or client scope boundary crossed.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>memberStatus</code></td>\n<td>boolean</td>\n<td>No</td>\n<td><code>true</code> = active.</td>\n</tr>\n<tr>\n<td><code>isSuspended</code>, <code>isAso</code>, <code>isIndividual</code>, <code>isGroup</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Status flags.</td>\n</tr>\n<tr>\n<td><code>isVip</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td><code>0</code> = not VIP. <strong>An int, not a bool.</strong></td>\n</tr>\n<tr>\n<td><code>benefits</code></td>\n<td>array</td>\n<td>No</td>\n<td>Never null; empty array at worst.</td>\n</tr>\n<tr>\n<td><code>memberId</code>, <code>memberInsuranceNumber</code>, <code>cardNumber</code>, <code>nik</code>, <code>memberName</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Identity.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code>, <code>corporateName</code>, <code>insurerCode</code>, <code>insurerName</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Scope.</td>\n</tr>\n<tr>\n<td><code>status</code>, <code>type</code>, <code>remark</code>, <code>division</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Classification.</td>\n</tr>\n<tr>\n<td><code>memberType</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>e.g. <code>Conventional</code>.</td>\n</tr>\n<tr>\n<td><code>gender</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>M</code> / <code>F</code>.</td>\n</tr>\n<tr>\n<td><code>maritalStatus</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>S</code> / <code>M</code>.</td>\n</tr>\n<tr>\n<td><code>productCode</code>, <code>policyNo</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Product and policy.</td>\n</tr>\n<tr>\n<td><code>dateOfBirth</code>, <code>policyStart</code>, <code>policyEnd</code>, <code>joinDate</code>, <code>effectiveDate</code>, <code>expiryDate</code></td>\n<td><strong>string</strong></td>\n<td>Yes</td>\n<td><strong>Strings, not dates.</strong> Pass-through from upstream; do not assume they parse.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---benefits\">Response fields - <code>benefits[]</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code>, <code>planId</code></td>\n<td>integer(int64)</td>\n<td>No</td>\n<td>Internal IDs.</td>\n</tr>\n<tr>\n<td><code>annualLimit</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Annual limit.</td>\n</tr>\n<tr>\n<td><code>isFamilyShared</code>, <code>isShowProvider</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Flags.</td>\n</tr>\n<tr>\n<td><code>subBenefits</code></td>\n<td>array</td>\n<td>No</td>\n<td>Never null.</td>\n</tr>\n<tr>\n<td><code>benefitCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><strong>The value Create Case and Price Eligibility need.</strong></td>\n</tr>\n<tr>\n<td><code>benefitName</code>, <code>planName</code>, <code>planCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Naming.</td>\n</tr>\n<tr>\n<td><code>condition</code>, <code>tnc</code>, <code>tncOverseas</code>, <code>tncCategory</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Terms.</td>\n</tr>\n<tr>\n<td><code>planStart</code>, <code>planEnd</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Strings, not dates.</td>\n</tr>\n<tr>\n<td><code>sharingCode</code>, <code>currency</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Sharing and currency.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---benefitssubbenefits\">Response fields - <code>benefits[].subBenefits[]</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code>, <code>subBenefitId</code></td>\n<td>integer(int64)</td>\n<td>No</td>\n<td>Internal IDs.</td>\n</tr>\n<tr>\n<td><code>isCashless</code></td>\n<td>boolean</td>\n<td>No</td>\n<td><strong>Price Eligibility only considers cashless sub-benefits.</strong></td>\n</tr>\n<tr>\n<td><code>isReimburstement</code>, <code>isAsCharge</code>, <code>isPrimary</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Flags. <em>(The misspelling is the real field name.)</em></td>\n</tr>\n<tr>\n<td><code>annualLimit</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Sub-benefit limit.</td>\n</tr>\n<tr>\n<td><code>coShare</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td><strong><code>100</code> means the insurer covers 100%.</strong></td>\n</tr>\n<tr>\n<td><code>condition</code></td>\n<td>array</td>\n<td>No</td>\n<td>Quota rules; never null.</td>\n</tr>\n<tr>\n<td><code>subBenefitCode</code>, <code>category</code>, <code>subBenefitName</code>, <code>clientsSubBenefit</code>, <code>type</code>, <code>sharingCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Classification.</td>\n</tr>\n<tr>\n<td><code>preDisability</code>, <code>postDisability</code>, <code>disabilityByIcd</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Disability terms.</td>\n</tr>\n<tr>\n<td><code>details</code></td>\n<td>array</td>\n<td>Yes</td>\n<td>Normalised to an array or null. <strong>Upstream sends null, an array, a single object, or a JSON-encoded string</strong> - a converter absorbs all of those.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>subBenefits[].condition[]</code></strong> - <code>id</code> integer(int64), <code>amount</code> number(decimal), <code>type</code> string (e.g. <code>Active Polis</code>), <code>conditionType</code> string (e.g. <code>qty</code>). This is the visit-quota rule that Price Eligibility evaluates.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>message</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Exclusion/Member Nonactive.</td>\n<td>Member unknown, inactive or suspended.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the specified provider.</td>\n<td><code>providerCode</code> outside the tenant's provider bindings.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the member's corporate scope.</td>\n<td>Member's corporate code outside the tenant's bindings.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the member's client scope.</td>\n<td>Member's client code outside the tenant's bindings.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>The live API may also return a raw downstream code such as <code>StatusInactive</code> in <code>message</code> for the same <code>400</code>. Handle on status code, not on message text.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases","member-eligibility"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"777602ed-5251-40c7-b362-c04f345b668d","name":"Member active","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"providerCode\": \"PRV001\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/member-eligibility"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"status\": null,\n        \"corporateCode\": \"CORP01\",\n        \"corporateName\": \"Sample Corporate\",\n        \"insurerCode\": \"CLI01\",\n        \"insurerName\": \"Sample Insurance\",\n        \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n        \"memberInsuranceNumber\": \"INS00000001\",\n        \"cardNumber\": \"202601010-00000001\",\n        \"nik\": \"0000000000000001\",\n        \"memberName\": \"John Doe\",\n        \"memberStatus\": true,\n        \"memberType\": \"Conventional\",\n        \"dateOfBirth\": \"1990-01-01\",\n        \"gender\": \"M\",\n        \"maritalStatus\": \"S\",\n        \"isSuspended\": false,\n        \"isVip\": 0,\n        \"isAso\": false,\n        \"isIndividual\": true,\n        \"isGroup\": false,\n        \"productCode\": \"PRD001\",\n        \"policyNo\": \"POL0000000000001\",\n        \"policyStart\": \"2026-01-01\",\n        \"policyEnd\": \"2026-12-31\",\n        \"joinDate\": \"2026-01-01\",\n        \"remark\": null,\n        \"type\": null,\n        \"effectiveDate\": null,\n        \"expiryDate\": null,\n        \"benefits\": [\n            {\n                \"id\": 10000001,\n                \"benefitCode\": \"00000001\",\n                \"benefitName\": \"TELEMEDICINE\",\n                \"planName\": \"Sample Telemedicine Plan (TELE-001)\",\n                \"planCode\": \"TELE-001\",\n                \"planId\": 0,\n                \"annualLimit\": 0.0,\n                \"condition\": null,\n                \"tnc\": null,\n                \"tncOverseas\": null,\n                \"tncCategory\": null,\n                \"planStart\": null,\n                \"planEnd\": null,\n                \"isFamilyShared\": false,\n                \"isShowProvider\": false,\n                \"sharingCode\": null,\n                \"currency\": \"IDR\",\n                \"subBenefits\": [\n                    {\n                        \"id\": 10000002,\n                        \"subBenefitCode\": null,\n                        \"category\": \"OUTPATIENT\",\n                        \"subBenefitName\": \"Medicine GP\",\n                        \"clientsSubBenefit\": null,\n                        \"isCashless\": true,\n                        \"isReimburstement\": false,\n                        \"isAsCharge\": false,\n                        \"annualLimit\": 0.0,\n                        \"type\": \"OUTPATIENT\",\n                        \"coShare\": 100.0,\n                        \"sharingCode\": null,\n                        \"isPrimary\": false,\n                        \"details\": null,\n                        \"condition\": [\n                            {\n                                \"id\": 10000003,\n                                \"amount\": 3.0,\n                                \"type\": \"Active Polis\",\n                                \"conditionType\": \"qty\"\n                            }\n                        ],\n                        \"subBenefitId\": 0,\n                        \"preDisability\": null,\n                        \"postDisability\": null,\n                        \"disabilityByIcd\": null\n                    }\n                ]\n            }\n        ],\n        \"division\": \"\"\n    }\n}"},{"id":"baaa524a-bb3f-4a8d-aeac-fde3d989df96","name":"Member inactive","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"providerCode\": \"PRV001\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/member-eligibility"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Exclusion/Member Nonactive.\",\n    \"data\": null\n}"},{"id":"04780dca-4901-47d8-a64a-a1d007398486","name":"Outside corporate scope","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"providerCode\": \"PRV001\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/member-eligibility"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Access denied to the member's corporate scope.\",\n    \"data\": null\n}"}],"_postman_id":"9e098962-e441-4c7a-8362-616f13f134d8"}],"id":"bacf11d7-c916-42bb-8739-9a5d02dcea5f","description":"<p>Confirms a member is active and returns their benefit structure.</p>\n<p><strong>Run this first.</strong> It supplies the <code>benefitCode</code> values that Create Case and Price Eligibility require.</p>\n","_postman_id":"bacf11d7-c916-42bb-8739-9a5d02dcea5f","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}},{"name":"Price Eligibility","item":[{"name":"Check Price Eligibility","id":"4c5a7e3b-80b1-4cce-ae31-22976dc71399","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"amount\": 100000\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/price-eligibility","description":"<p>Check whether an amount is covered, before a case exists.</p>\n<p><strong><code>POST /v3/api/cases/price-eligibility</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:read</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + member corporate/client bindings, plus claim scope in add-on mode</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Lets a provider gate a booking <strong>without ever learning the member's remaining limits or visit counts.</strong> Two moments in the partner flow use it:</p>\n<ol>\n<li><strong>Pre-booking check</strong> - before any case exists. Confirm coverage for the consultation price before committing to the booking. No <code>claimNumber</code> is available yet.</li>\n<li><strong>Prescription add-on check</strong> - after the consultation, once the case exists and the FGL is released. Supply the original <code>claimNumber</code> so the consultation's own consumption is excluded - an add-on against the member's final allowed visit must not be refused because the consultation itself already used that visit.</li>\n</ol>\n<p><strong>The response is deliberately binary in money terms:</strong> either the insurer pays (minus any static plan-rule co-pay such as co-share or a per-visit cap) or the patient pays the whole amount. No response value is ever derived from the member's remaining limit or remaining visit count.</p>\n<p>A not-eligible verdict always carries <strong>the same one generic message</strong>, whatever the underlying reason - limit exhausted, visits exhausted, price above cover, exclusion, or no applicable cashless sub-benefit (the last of these is itself a <code>200</code> coverage verdict, not an error). Do not branch integration logic on that wording changing per case; it never will, and no more specific reason is ever returned.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>dob</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>Member's date of birth.</td>\n</tr>\n<tr>\n<td><code>benefitCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>Benefit code to check, matched against the member's benefits as returned by Member Eligibility.</td>\n</tr>\n<tr>\n<td><code>amount</code></td>\n<td>number</td>\n<td>decimal</td>\n<td>Yes</td>\n<td>The price to check. <strong>Must be greater than 0</strong> - an explicit guard rejects zero or negative.</td>\n</tr>\n<tr>\n<td><code>providerCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>Provider code; resolved from the tenant's bindings when omitted.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td>The original consultation's claim number - <strong>only</strong> for the prescription add-on check. Omit for the pre-booking check.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>A coverage verdict - <strong>including <code>eligible: false</code></strong>, which is not an error.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Empty payload, non-positive amount, inactive member, or unknown benefit code.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Provider, corporate, client or claim scope boundary crossed.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>eligible</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the amount is covered.</td>\n</tr>\n<tr>\n<td><code>patientPayAmount</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>What the patient pays. Equals the full requested amount when <code>eligible</code> is <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>null</code> when eligible; the one generic non-coverage string otherwise.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Three fields on the claim service's internal verdict - <code>coveredAmount</code>, <code>reasons[]</code> and <code>resolvedRules</code> - are deliberately dropped before the response leaves Cambridge. Do not expect them.</p>\n</blockquote>\n<h3 id=\"failures---400\">Failures - <code>400</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Cause</th>\n<th>message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Payload empty or malformed</td>\n<td>Request payload cannot be empty.</td>\n</tr>\n<tr>\n<td><code>amount</code> zero or negative</td>\n<td>Amount must be greater than zero.</td>\n</tr>\n<tr>\n<td>Member unknown, inactive or suspended</td>\n<td>Exclusion/Member Nonactive.</td>\n</tr>\n<tr>\n<td><code>benefitCode</code> not on the member's product</td>\n<td>Benefit code '{benefitCode}' was not found for this member.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"failures---403\">Failures - <code>403</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Cause</th>\n<th>message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>providerCode</code> outside the tenant's provider bindings</td>\n<td>Access denied to the specified provider.</td>\n</tr>\n<tr>\n<td>Member's corporate code outside the tenant's bindings</td>\n<td>Access denied to the member's corporate scope.</td>\n</tr>\n<tr>\n<td>Member's client code outside the tenant's bindings</td>\n<td>Access denied to the member's client scope.</td>\n</tr>\n<tr>\n<td>Tenant has no bindings at all but supplied a <code>claimNumber</code></td>\n<td>Access denied to the specified claim.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code> unknown, or belonging to another tenant</td>\n<td>Claim number '{claimNumber}' was not found or access is denied.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code>'s provider outside the tenant's provider bindings</td>\n<td>Access denied to the claim '{claimNumber}' due to provider scope.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code>'s corporate/client code outside the tenant's bindings</td>\n<td>Access denied to the claim '{claimNumber}' due to corporate/client scope.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases","price-eligibility"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"5052619a-33bd-4813-8e9b-9053fa53d563","name":"Eligible","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"amount\": 100000\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/price-eligibility"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"eligible\": true,\n        \"patientPayAmount\": 0,\n        \"message\": null\n    }\n}"},{"id":"98acc0e4-c391-471d-904c-e1926392a621","name":"Not eligible","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"amount\": 100000\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/price-eligibility"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"eligible\": false,\n        \"patientPayAmount\": 100000,\n        \"message\": \"This amount is not covered under the member's current plan.\"\n    }\n}"},{"id":"c326895e-b7cd-41a8-95d1-69f5a3735990","name":"Benefit not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"amount\": 100000\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/price-eligibility"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Benefit code '00000001' was not found for this member.\",\n    \"data\": null\n}"},{"id":"63601cb0-4e55-4638-91e4-258f9eea539e","name":"Amount not greater than zero","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"amount\": 100000\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/price-eligibility"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Amount must be greater than zero.\",\n    \"data\": null\n}"}],"_postman_id":"4c5a7e3b-80b1-4cce-ae31-22976dc71399"}],"id":"25295163-d53c-420c-acb4-1831cf0d445f","description":"<p>Answers one question: is this amount covered?</p>\n<p>Used at two moments in the partner flow - before a booking exists, and again for a prescription add-on after the guarantee letter is released. The response is binary in money terms and never discloses the member's remaining limit or visit count.</p>\n","_postman_id":"25295163-d53c-420c-acb4-1831cf0d445f","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}},{"name":"Claim Outpatient","item":[{"name":"1. Create Case","id":"cc8ab766-367d-4ddd-8e1b-eb079c0c4970","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"providerCode\": \"PRV001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"polyCode\": \"\",\n  \"polyName\": \"\",\n  \"doctor\": \"\",\n  \"phone\": \"+628000000001\",\n  \"treatmentType\": \"Rawat jalan\",\n  \"indate\": \"2026-01-01\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases","description":"<p>Create a case and submit a cashless claim.</p>\n<p><strong><code>POST /v3/api/cases</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + member corporate/client bindings</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Registers the case and returns its claim number. The new case is in <code>Registered</code> status, which is the only status the Void endpoint accepts.</p>\n<blockquote>\n<p><strong>Note:</strong> the downstream Claim Service returns a binary PDF (the registration form / guarantee letter) on success. Cambridge intercepts that response, extracts the generated claim number from the <code>Content-Disposition</code> filename (e.g. <code>Register_Form_CL2601010000001H.pdf</code>) and returns JSON. Partners never see the PDF.</p>\n</blockquote>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>providerCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Healthcare provider code.</td>\n</tr>\n<tr>\n<td><code>dob</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>Yes</td>\n<td>-</td>\n<td>Member's date of birth.</td>\n</tr>\n<tr>\n<td><code>benefitCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Benefit code selected for the treatment, from Member Eligibility.</td>\n</tr>\n<tr>\n<td><code>providerName</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Provider name.</td>\n</tr>\n<tr>\n<td><code>providerAddress</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Provider address.</td>\n</tr>\n<tr>\n<td><code>providerCity</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Provider city.</td>\n</tr>\n<tr>\n<td><code>polyCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Polyclinic code.</td>\n</tr>\n<tr>\n<td><code>polyName</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Polyclinic name.</td>\n</tr>\n<tr>\n<td><code>doctor</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Doctor's name.</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Provider phone number.</td>\n</tr>\n<tr>\n<td><code>treatmentType</code></td>\n<td>string</td>\n<td>enum</td>\n<td>No</td>\n<td><code>Rawat jalan</code></td>\n<td><code>Rawat inap</code> / <code>Rawat jalan</code>.</td>\n</tr>\n<tr>\n<td><code>indate</code></td>\n<td>string</td>\n<td><code>yyyy-MM-dd</code></td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Admission date.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Optional fields default to <strong>empty strings, not null</strong> - omitting them sends <code>\"\"</code> downstream.</p>\n</blockquote>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Case created; claim number returned.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Member suspended or inactive, or benefit validation failed.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Provider or member scope boundary crossed.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>The generated claim number. Defaults to <code>\"\"</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Example message</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Exclusion/Member Nonactive.</td>\n<td>Member suspended, inactive, or benefit validation failed.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the specified provider.</td>\n<td><code>providerCode</code>, or the member's corporate/client codes, fall outside the tenant's bindings.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>The live API may also return a raw downstream code such as <code>ActiveClaim</code> in <code>message</code> for the same <code>400</code>. Handle on status code, not on message text.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"2ec80fd4-d724-44a3-8ab8-702223c82b57","name":"Case created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"providerCode\": \"PRV001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"polyCode\": \"\",\n  \"polyName\": \"\",\n  \"doctor\": \"\",\n  \"phone\": \"+628000000001\",\n  \"treatmentType\": \"Rawat jalan\",\n  \"indate\": \"2026-01-01\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"claimNumber\": \"CL2601010000001H\"\n    }\n}"},{"id":"17777d4e-855d-4c47-b7a5-9a71c456f941","name":"Member inactive","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"providerCode\": \"PRV001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"polyCode\": \"\",\n  \"polyName\": \"\",\n  \"doctor\": \"\",\n  \"phone\": \"+628000000001\",\n  \"treatmentType\": \"Rawat jalan\",\n  \"indate\": \"2026-01-01\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Exclusion/Member Nonactive.\",\n    \"data\": null\n}"},{"id":"36cd1507-8ea2-4469-8980-6487f6b1d787","name":"Access denied to provider","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"cardNumber\": \"202601010-00000001\",\n  \"providerCode\": \"PRV001\",\n  \"dob\": \"1990-01-01\",\n  \"benefitCode\": \"00000001\",\n  \"providerName\": \"Sample Clinic\",\n  \"providerAddress\": \"1 Sample Street\",\n  \"providerCity\": \"Jakarta\",\n  \"polyCode\": \"\",\n  \"polyName\": \"\",\n  \"doctor\": \"\",\n  \"phone\": \"+628000000001\",\n  \"treatmentType\": \"Rawat jalan\",\n  \"indate\": \"2026-01-01\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Access denied to the specified provider.\",\n    \"data\": null\n}"}],"_postman_id":"cc8ab766-367d-4ddd-8e1b-eb079c0c4970"},{"name":"2. Validate Outpatient Billing","id":"999e7881-bc41-47b3-bb65-3566f6efd10f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"idBenefit\": 10000001,\n    \"claimNumber\": \"CL2601010000001H\",\n    \"cardNumber\": \"202601010-00000001\",\n    \"claimAmount\": 100000,\n    \"exclusionAmount\": 0,\n    \"prorate\": false,\n    \"qty\": 1,\n    \"roomBenefit\": false,\n    \"coShare\": 100\n  }\n]","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/validate-billing","description":"<p>Validate the billing lines on a case before releasing the guarantee letter.</p>\n<p><strong><code>POST /v3/api/cases/validate-billing</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + corporate/client bindings, per claim in the list</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p><strong>The request body is an array</strong>, one entry per billing line. The response reports batch totals plus a per-line breakdown of what the insurer covers and what falls to the patient as excess.</p>\n<h3 id=\"request-body---array-item\">Request body - array item</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>idBenefit</code></td>\n<td>integer(int64)</td>\n<td>Yes*</td>\n<td>-</td>\n<td>The benefit ID.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>-</td>\n<td>The claim being billed.</td>\n</tr>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>-</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>claimAmount</code></td>\n<td>number(decimal)</td>\n<td>Yes*</td>\n<td>-</td>\n<td>The amount claimed for this line.</td>\n</tr>\n<tr>\n<td><code>exclusionAmount</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td><code>0</code></td>\n<td>Excluded amount.</td>\n</tr>\n<tr>\n<td><code>prorate</code></td>\n<td>boolean</td>\n<td>No</td>\n<td><code>false</code></td>\n<td>Prorate the line.</td>\n</tr>\n<tr>\n<td><code>qty</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Quantity.</td>\n</tr>\n<tr>\n<td><code>roomBenefit</code></td>\n<td>boolean</td>\n<td>No</td>\n<td><code>false</code></td>\n<td>Treat as a room benefit.</td>\n</tr>\n<tr>\n<td><code>coShare</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td><code>100</code></td>\n<td>Co-share percentage.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p><strong>* Send <code>idBenefit</code> and <code>claimAmount</code> explicitly.</strong> They are marked required but sit on non-nullable numeric types, where the framework's required check only rejects null. Omit <code>claimAmount</code> and the line is validated as a <strong>zero-amount line</strong> rather than rejected with a <code>400</code>.</p>\n</blockquote>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Lines validated; totals and per-line results returned.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Empty or malformed array.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>A claim in the list falls outside the tenant's bindings.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Downstream call succeeded.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>No</td>\n<td>e.g. <code>Successfully processed requests</code>.</td>\n</tr>\n<tr>\n<td><code>isValidate</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Validation verdict.</td>\n</tr>\n<tr>\n<td><code>totalClaim</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Total claimed across the batch.</td>\n</tr>\n<tr>\n<td><code>totalPaid</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Total insurer-covered.</td>\n</tr>\n<tr>\n<td><code>totalExcess</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Total falling to the patient.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>array</td>\n<td>No</td>\n<td>Per-line results; empty array, never null.</td>\n</tr>\n<tr>\n<td><code>data[].idBenefit</code></td>\n<td>integer(int64)</td>\n<td>No</td>\n<td>The benefit ID from the request line.</td>\n</tr>\n<tr>\n<td><code>data[].paid</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Insurer-covered for this line.</td>\n</tr>\n<tr>\n<td><code>data[].excess</code></td>\n<td>number(decimal)</td>\n<td>No</td>\n<td>Patient-paid for this line.</td>\n</tr>\n<tr>\n<td><code>data[].remark</code></td>\n<td>string</td>\n<td><strong>Yes</strong></td>\n<td>Declared non-nullable in the contract, but <strong>the live response returns <code>null</code></strong>. Treat as nullable.</td>\n</tr>\n<tr>\n<td><code>data[].sharingCode</code></td>\n<td>string</td>\n<td><strong>Yes</strong></td>\n<td>Same mismatch as <code>remark</code>.</td>\n</tr>\n<tr>\n<td><code>data[].isPrimary</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Primary sub-benefit flag.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Example message</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Request payload cannot be empty.</td>\n<td>Empty or malformed array.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the claim 'CL2601010000001H' due to provider/corporate/client scope.</td>\n<td>A claim in the list falls outside the tenant's bindings.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases","validate-billing"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"c0b4bc82-27ef-4d8b-866f-41cfd732888d","name":"Partially covered","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"idBenefit\": 10000001,\n    \"claimNumber\": \"CL2601010000001H\",\n    \"cardNumber\": \"202601010-00000001\",\n    \"claimAmount\": 100000,\n    \"exclusionAmount\": 0,\n    \"prorate\": false,\n    \"qty\": 1,\n    \"roomBenefit\": false,\n    \"coShare\": 100\n  }\n]","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/validate-billing"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"isSuccess\": true,\n        \"message\": \"Successfully processed requests\",\n        \"isValidate\": true,\n        \"totalClaim\": 10000000,\n        \"totalPaid\": 120030.00,\n        \"totalExcess\": 9879970.00,\n        \"data\": [\n            {\n                \"idBenefit\": 10000001,\n                \"paid\": 120030.00,\n                \"excess\": 9879970.00,\n                \"remark\": \"Excess of inner limit or condition limit\",\n                \"sharingCode\": \"\",\n                \"isPrimary\": false\n            }\n        ]\n    }\n}"},{"id":"15103ae0-4d3c-4c14-9da3-07b8b3c0b3fd","name":"Fully excess","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"idBenefit\": 10000001,\n    \"claimNumber\": \"CL2601010000001H\",\n    \"cardNumber\": \"202601010-00000001\",\n    \"claimAmount\": 100000,\n    \"exclusionAmount\": 0,\n    \"prorate\": false,\n    \"qty\": 1,\n    \"roomBenefit\": false,\n    \"coShare\": 100\n  }\n]","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/validate-billing"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"isSuccess\": true,\n        \"message\": \"Successfully processed requests\",\n        \"isValidate\": true,\n        \"totalClaim\": 100000,\n        \"totalPaid\": 0,\n        \"totalExcess\": 100000,\n        \"data\": [\n            {\n                \"idBenefit\": 10000001,\n                \"paid\": 0,\n                \"excess\": 100000,\n                \"remark\": null,\n                \"sharingCode\": null,\n                \"isPrimary\": false\n            }\n        ]\n    }\n}"},{"id":"fcd8d98f-9f60-49a2-b88c-46b7ec425e5d","name":"Empty payload","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"idBenefit\": 10000001,\n    \"claimNumber\": \"CL2601010000001H\",\n    \"cardNumber\": \"202601010-00000001\",\n    \"claimAmount\": 100000,\n    \"exclusionAmount\": 0,\n    \"prorate\": false,\n    \"qty\": 1,\n    \"roomBenefit\": false,\n    \"coShare\": 100\n  }\n]","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/validate-billing"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Request payload cannot be empty.\",\n    \"data\": null\n}"},{"id":"7c998d78-8e8e-4959-a6f3-1ccf161fb801","name":"Claim outside scope","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"idBenefit\": 10000001,\n    \"claimNumber\": \"CL2601010000001H\",\n    \"cardNumber\": \"202601010-00000001\",\n    \"claimAmount\": 100000,\n    \"exclusionAmount\": 0,\n    \"prorate\": false,\n    \"qty\": 1,\n    \"roomBenefit\": false,\n    \"coShare\": 100\n  }\n]","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/validate-billing"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Access denied to the claim 'CL2601010000001H' due to provider/corporate/client scope.\",\n    \"data\": null\n}"}],"_postman_id":"999e7881-bc41-47b3-bb65-3566f6efd10f"},{"name":"3. Release Guarantee Letter","id":"0d3f23fb-cd3d-4a31-a8e5-11b20e0614ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNo\": \"CL2601010000001H\",\n  \"icdCode1\": \"A01\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"doctor\": \"Dr. Sample\",\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"remark\": \"\",\n  \"updatedBy\": \"analyst@example.com\",\n  \"benefitDetail\": {\n    \"id\": 10000001,\n    \"benefitName\": \"TELEMEDICINE\",\n    \"planName\": \"Sample Telemedicine Plan (TELE-001)\",\n    \"benefitCode\": \"00000001\",\n    \"condition\": null,\n    \"annualLimit\": 0,\n    \"subBenefits\": [\n      {\n        \"id\": 10000002,\n        \"category\": \"OUTPATIENT\",\n        \"SubBenefitName\": \"Medicine GP\",\n        \"isCashless\": true,\n        \"isReimburstement\": false,\n        \"type\": \"OUTPATIENT\",\n        \"claimValue\": 100000,\n        \"excessValue\": 0,\n        \"details\": null,\n        \"condition\": [\n          { \"Id\": 10000003, \"Type\": \"Active Polis\", \"Amount\": 3, \"ConditionType\": \"qty\" }\n        ],\n        \"coShare\": 100\n      }\n    ]\n  },\n  \"emailProvider\": \"provider@example.com\",\n  \"treatmentDate\": \"2026-01-01T00:00:00+00:00\",\n  \"treatmentPlan\": \"\",\n  \"costEstimation\": \"\",\n  \"currency\": \"\",\n  \"planPolis\": \"Sample Telemedicine Plan (TELE-001)\",\n  \"memberName\": \"John Doe\",\n  \"diagnose\": \"Sample diagnosis\",\n  \"noPolis\": \"POL0000000000001\",\n  \"nameProvider\": \"Sample Clinic\",\n  \"insuranceName\": \"Sample Insurance\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/outpatient/release-gl","description":"<p>Process the claim and release the guarantee letter, moving the case to FGL Released.</p>\n<p><strong><code>POST /v3/api/cases/outpatient/release-gl</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + corporate/client bindings</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Calls the downstream <code>ProcessClaim/OUTPATIENT</code> and <code>UpdateStatus</code> operations in sequence.</p>\n<p><strong>After this succeeds the case can no longer be voided through the API</strong> - voiding is then an operations action.</p>\n<h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Format</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNo</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>The claim number.</td>\n</tr>\n<tr>\n<td><code>icdCode1</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Primary ICD-10 diagnosis code.</td>\n</tr>\n<tr>\n<td><code>icdCode2</code> - <code>icdCode4</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>null</code></td>\n<td>Additional diagnosis codes.</td>\n</tr>\n<tr>\n<td><code>doctor</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Treating doctor.</td>\n</tr>\n<tr>\n<td><code>polyCode</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Polyclinic code.</td>\n</tr>\n<tr>\n<td><code>polyName</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Polyclinic name.</td>\n</tr>\n<tr>\n<td><code>remark</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Free-text remarks.</td>\n</tr>\n<tr>\n<td><code>updatedBy</code></td>\n<td>string</td>\n<td>email</td>\n<td>Yes</td>\n<td>-</td>\n<td>Email of the user releasing the letter.</td>\n</tr>\n<tr>\n<td><code>benefitDetail</code></td>\n<td>object</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>The benefit structure, including per-sub-benefit <code>claimValue</code>. <strong>An object, not a string.</strong></td>\n</tr>\n<tr>\n<td><code>emailProvider</code></td>\n<td>string</td>\n<td>email</td>\n<td>Yes</td>\n<td>-</td>\n<td>Provider email address.</td>\n</tr>\n<tr>\n<td><code>treatmentDate</code></td>\n<td>string</td>\n<td>date-time</td>\n<td>Yes*</td>\n<td>-</td>\n<td>ISO-8601 treatment date <strong>with offset</strong>.</td>\n</tr>\n<tr>\n<td><code>treatmentPlan</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Treatment plan description.</td>\n</tr>\n<tr>\n<td><code>costEstimation</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Cost estimate.</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>-</td>\n<td>No</td>\n<td><code>\"\"</code></td>\n<td>Currency code.</td>\n</tr>\n<tr>\n<td><code>planPolis</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Policy plan name.</td>\n</tr>\n<tr>\n<td><code>memberName</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Member name.</td>\n</tr>\n<tr>\n<td><code>diagnose</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Diagnosis description.</td>\n</tr>\n<tr>\n<td><code>noPolis</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Policy number.</td>\n</tr>\n<tr>\n<td><code>nameProvider</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Provider name.</td>\n</tr>\n<tr>\n<td><code>insuranceName</code></td>\n<td>string</td>\n<td>-</td>\n<td>Yes</td>\n<td>-</td>\n<td>Insurer name.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p><strong>* Send <code>treatmentDate</code> explicitly.</strong> Like <code>claimAmount</code> on Validate Billing, it sits on a non-nullable value type - omitting it sends <code>0001-01-01T00:00:00</code> downstream rather than returning a <code>400</code>. <code>benefitDetail</code> is enforced properly, because it is a reference type.</p>\n</blockquote>\n<p>Carry <code>benefitDetail</code> through from Member Eligibility, setting <code>claimValue</code> per sub-benefit.</p>\n<h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Guarantee letter released.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Empty payload, or the downstream release failed.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>The claim falls outside the tenant's bindings.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Always <code>true</code> on a <code>200</code>.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>No</td>\n<td>Always <code>SUCCESS</code>.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>The claim acted on.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Example message</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Request payload cannot be empty.</td>\n<td>Empty payload, or the downstream release failed.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the claim 'CL2601010000001H' due to provider/corporate/client scope.</td>\n<td>The claim falls outside the tenant's bindings.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases","outpatient","release-gl"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"42f0337c-d32a-4eab-bc46-4932e176d8a3","name":"Guarantee letter released","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNo\": \"CL2601010000001H\",\n  \"icdCode1\": \"A01\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"doctor\": \"Dr. Sample\",\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"remark\": \"\",\n  \"updatedBy\": \"analyst@example.com\",\n  \"benefitDetail\": {\n    \"id\": 10000001,\n    \"benefitName\": \"TELEMEDICINE\",\n    \"planName\": \"Sample Telemedicine Plan (TELE-001)\",\n    \"benefitCode\": \"00000001\",\n    \"condition\": null,\n    \"annualLimit\": 0,\n    \"subBenefits\": [\n      {\n        \"id\": 10000002,\n        \"category\": \"OUTPATIENT\",\n        \"SubBenefitName\": \"Medicine GP\",\n        \"isCashless\": true,\n        \"isReimburstement\": false,\n        \"type\": \"OUTPATIENT\",\n        \"claimValue\": 100000,\n        \"excessValue\": 0,\n        \"details\": null,\n        \"condition\": [\n          { \"Id\": 10000003, \"Type\": \"Active Polis\", \"Amount\": 3, \"ConditionType\": \"qty\" }\n        ],\n        \"coShare\": 100\n      }\n    ]\n  },\n  \"emailProvider\": \"provider@example.com\",\n  \"treatmentDate\": \"2026-01-01T00:00:00+00:00\",\n  \"treatmentPlan\": \"\",\n  \"costEstimation\": \"\",\n  \"currency\": \"\",\n  \"planPolis\": \"Sample Telemedicine Plan (TELE-001)\",\n  \"memberName\": \"John Doe\",\n  \"diagnose\": \"Sample diagnosis\",\n  \"noPolis\": \"POL0000000000001\",\n  \"nameProvider\": \"Sample Clinic\",\n  \"insuranceName\": \"Sample Insurance\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/outpatient/release-gl"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"isSuccess\": true,\n        \"message\": \"SUCCESS\",\n        \"claimNumber\": \"CL2601010000001H\"\n    }\n}"},{"id":"ac388b64-8dab-4b11-bae1-bbc26696c473","name":"Empty payload","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNo\": \"CL2601010000001H\",\n  \"icdCode1\": \"A01\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"doctor\": \"Dr. Sample\",\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"remark\": \"\",\n  \"updatedBy\": \"analyst@example.com\",\n  \"benefitDetail\": {\n    \"id\": 10000001,\n    \"benefitName\": \"TELEMEDICINE\",\n    \"planName\": \"Sample Telemedicine Plan (TELE-001)\",\n    \"benefitCode\": \"00000001\",\n    \"condition\": null,\n    \"annualLimit\": 0,\n    \"subBenefits\": [\n      {\n        \"id\": 10000002,\n        \"category\": \"OUTPATIENT\",\n        \"SubBenefitName\": \"Medicine GP\",\n        \"isCashless\": true,\n        \"isReimburstement\": false,\n        \"type\": \"OUTPATIENT\",\n        \"claimValue\": 100000,\n        \"excessValue\": 0,\n        \"details\": null,\n        \"condition\": [\n          { \"Id\": 10000003, \"Type\": \"Active Polis\", \"Amount\": 3, \"ConditionType\": \"qty\" }\n        ],\n        \"coShare\": 100\n      }\n    ]\n  },\n  \"emailProvider\": \"provider@example.com\",\n  \"treatmentDate\": \"2026-01-01T00:00:00+00:00\",\n  \"treatmentPlan\": \"\",\n  \"costEstimation\": \"\",\n  \"currency\": \"\",\n  \"planPolis\": \"Sample Telemedicine Plan (TELE-001)\",\n  \"memberName\": \"John Doe\",\n  \"diagnose\": \"Sample diagnosis\",\n  \"noPolis\": \"POL0000000000001\",\n  \"nameProvider\": \"Sample Clinic\",\n  \"insuranceName\": \"Sample Insurance\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/outpatient/release-gl"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Request payload cannot be empty.\",\n    \"data\": null\n}"},{"id":"0f7cc1e9-90da-4017-b0cf-ab68549ae95f","name":"Claim outside scope","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"claimNo\": \"CL2601010000001H\",\n  \"icdCode1\": \"A01\",\n  \"icdCode2\": \"\",\n  \"icdCode3\": \"\",\n  \"icdCode4\": \"\",\n  \"doctor\": \"Dr. Sample\",\n  \"polyCode\": \"POLY01\",\n  \"polyName\": \"Sample Poly\",\n  \"remark\": \"\",\n  \"updatedBy\": \"analyst@example.com\",\n  \"benefitDetail\": {\n    \"id\": 10000001,\n    \"benefitName\": \"TELEMEDICINE\",\n    \"planName\": \"Sample Telemedicine Plan (TELE-001)\",\n    \"benefitCode\": \"00000001\",\n    \"condition\": null,\n    \"annualLimit\": 0,\n    \"subBenefits\": [\n      {\n        \"id\": 10000002,\n        \"category\": \"OUTPATIENT\",\n        \"SubBenefitName\": \"Medicine GP\",\n        \"isCashless\": true,\n        \"isReimburstement\": false,\n        \"type\": \"OUTPATIENT\",\n        \"claimValue\": 100000,\n        \"excessValue\": 0,\n        \"details\": null,\n        \"condition\": [\n          { \"Id\": 10000003, \"Type\": \"Active Polis\", \"Amount\": 3, \"ConditionType\": \"qty\" }\n        ],\n        \"coShare\": 100\n      }\n    ]\n  },\n  \"emailProvider\": \"provider@example.com\",\n  \"treatmentDate\": \"2026-01-01T00:00:00+00:00\",\n  \"treatmentPlan\": \"\",\n  \"costEstimation\": \"\",\n  \"currency\": \"\",\n  \"planPolis\": \"Sample Telemedicine Plan (TELE-001)\",\n  \"memberName\": \"John Doe\",\n  \"diagnose\": \"Sample diagnosis\",\n  \"noPolis\": \"POL0000000000001\",\n  \"nameProvider\": \"Sample Clinic\",\n  \"insuranceName\": \"Sample Insurance\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/outpatient/release-gl"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Access denied to the claim 'CL2601010000001H' due to provider/corporate/client scope.\",\n    \"data\": null\n}"}],"_postman_id":"0d3f23fb-cd3d-4a31-a8e5-11b20e0614ab"},{"name":"4. Void Case","id":"1c32e037-94fa-413e-bff3-b85cc96533a7","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"reason\": \"Pasien membatalkan janji temu sebelum konsultasi.\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber/void","description":"<p>Cancel a case that was registered but never progressed.</p>\n<p><strong><code>POST /v3/api/cases/{claimNumber}/void</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td><strong>Tenant scoping</strong></td>\n<td>Provider + corporate/client bindings</td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>For a booking that never happened, or a mis-keyed registration. The reason is stored against the claim and surfaces as <code>remarkRejectVoid</code> on Get Case Detail.</p>\n<blockquote>\n<p><strong>Only a case still in <code>Registered</code> status may be voided through this API.</strong> The downstream Claim Service itself accepts Void from almost any status; Cambridge deliberately narrows that to the pre-guarantee-letter window. Once the guarantee letter has been released, voiding is an operations action, not an API action.</p>\n</blockquote>\n<p><strong>Voiding is idempotent.</strong> A case that is already <code>Void</code> returns <code>200</code> with the same success body rather than an error, so a partner's retry after a timeout is safe.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claimNumber</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>The claim/case number to void.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;access_token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>reason</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Why the case is being voided. Stored as the claim's <code>remarkRejectVoid</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Voided - <strong>or already void</strong>, which returns the same body.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Case has moved past <code>Registered</code>, downstream update failed, or body missing.</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Provider or corporate/client scope boundary crossed.</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>No such claim number.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isSuccess</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Always <code>true</code> on a <code>200</code>.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>No</td>\n<td>Always <code>SUCCESS</code>.</td>\n</tr>\n<tr>\n<td><code>claimNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>The claim acted on.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>message</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>404</td>\n<td>Case not found.</td>\n<td>No such claim number.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the specified claim.</td>\n<td>Restricted tenant holding no provider/corporate/client bindings.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the claim '{claimNumber}' due to provider scope.</td>\n<td>The case's provider is outside the tenant's provider bindings.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Access denied to the claim '{claimNumber}' due to corporate/client scope.</td>\n<td>The case is outside the tenant's corporate/client bindings.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>This case can no longer be voided via the API.</td>\n<td>The case has moved past <code>Registered</code> - for example the FGL is already released.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>Failed to void the claim in the external Claim Service.</td>\n<td>The downstream status update did not succeed.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>Request payload cannot be empty.</td>\n<td>Missing body.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>The status recorded downstream is <code>Void</code> with source <code>Provider</code>, attributed to the calling tenant user (or the tenant's internal service account for machine callers). The Claim Service sets the case's <code>outdate</code> automatically.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","cases",":claimNumber","void"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[{"description":{"content":"<p>The claim/case number to void.</p>\n","type":"text/plain"},"type":"any","value":"CL2601010000001H","key":"claimNumber"}]}},"response":[{"id":"2978eaa6-9ae1-42c7-9121-84fcf8b242db","name":"Voided","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"reason\": \"Pasien membatalkan janji temu sebelum konsultasi.\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber/void","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber","void"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number to void."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"isSuccess\": true,\n        \"message\": \"SUCCESS\",\n        \"claimNumber\": \"CL2601010000001H\"\n    }\n}"},{"id":"7abeb2c3-e6b5-43e8-8ced-19347d96a0cc","name":"Already void - idempotent retry","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"reason\": \"Pasien membatalkan janji temu sebelum konsultasi.\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber/void","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber","void"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number to void."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"isSuccess\": true,\n        \"message\": \"SUCCESS\",\n        \"claimNumber\": \"CL2601010000001H\"\n    }\n}"},{"id":"f676836b-b0bc-4736-9a62-a7ac50172cdc","name":"Too late to void","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"reason\": \"Pasien membatalkan janji temu sebelum konsultasi.\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber/void","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber","void"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number to void."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"This case can no longer be voided via the API.\",\n    \"data\": null\n}"},{"id":"c86ffb73-0a18-4247-a497-03409718cc07","name":"Case not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"reason\": \"Pasien membatalkan janji temu sebelum konsultasi.\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/cases/:claimNumber/void","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","cases",":claimNumber","void"],"variable":[{"key":"claimNumber","value":"CL2601010000001H","description":"The claim/case number to void."}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"error\",\n    \"message\": \"Case not found.\",\n    \"data\": null\n}"}],"_postman_id":"1c32e037-94fa-413e-bff3-b85cc96533a7"}],"id":"2579cc72-af46-4e56-897b-d4b72995af6b","description":"<p>The outpatient cashless sequence, in order. Create the case, validate each billing line, release the guarantee letter.</p>\n<p><strong>Void</strong> reverses step 1 while the case is still <code>Registered</code>. Once the guarantee letter is released, voiding is an operations action, not an API action.</p>\n","_postman_id":"2579cc72-af46-4e56-897b-d4b72995af6b","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}}],"id":"e8ec27f8-e56d-4927-ae50-24c4c73a8e5c","description":"<p>The Cases API. Search and read cases, check member and price eligibility, create a cashless case, validate its billing, release the guarantee letter, and void a case that never happened.</p>\n<p><strong>Telemedicine partner flow:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Member Eligibility -&gt; Price Eligibility -&gt; Create Case -&gt; consultation -&gt; Release GL\n                                                      |\n                     optional prescription -&gt; Price Eligibility (with claimNumber)\n</code></pre><p>All Cases endpoints use the <code>cambridge-api</code> scheme and are scoped to the tenant's data bindings.</p>\n","_postman_id":"e8ec27f8-e56d-4927-ae50-24c4c73a8e5c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}},{"name":"Member","item":[{"name":"Search Member","item":[{"name":"Search Members","id":"1ff6309b-5b85-464e-a57e-1054337396e1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"page\": 1,\n  \"pageSize\": 10,\n  \"cardNumber\": \"202601010-00000001\",\n  \"memberName\": \"John Doe\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"clientCode\": \"CLI01\",\n  \"corporateName\": \"Sample Corporate\",\n  \"memberStatus\": \"Active\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/search","description":"<p>Search the member book within the tenant's scope.</p>\n<p><strong><code>POST /v3/api/Members/search</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permission</strong></td>\n<td><code>members:search</code></td>\n</tr>\n<tr>\n<td><strong>Tenant restriction</strong></td>\n<td><strong>Tenants of type <code>Provider</code> are refused</strong> with <code>401</code></td>\n</tr>\n<tr>\n<td><strong>Content-Type</strong></td>\n<td><code>application/json</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body\">Request body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td><code>1</code></td>\n<td>Page number, minimum 1.</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>integer(int32)</td>\n<td>No</td>\n<td><code>10</code></td>\n<td>Page size, minimum 1, <strong>maximum 100</strong>.</td>\n</tr>\n<tr>\n<td><code>cardNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Filter by card number.</td>\n</tr>\n<tr>\n<td><code>memberName</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Filter by member name.</td>\n</tr>\n<tr>\n<td><code>policyNumber</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Filter by policy number.</td>\n</tr>\n<tr>\n<td><code>clientCode</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Filter by client code.</td>\n</tr>\n<tr>\n<td><code>corporateName</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Filter by corporate name.</td>\n</tr>\n<tr>\n<td><code>memberStatus</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td>Filter by status, e.g. <code>Active</code>.</td>\n</tr>\n<tr>\n<td><code>corporateCode</code>, <code>companyName</code>, <code>productName</code>, <code>planCode</code></td>\n<td>string</td>\n<td>No</td>\n<td>-</td>\n<td><strong>Accepted but not applied.</strong> These bind on the request but are not forwarded to the downstream member search, so they currently have no effect on the result set.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The page of members.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Paging validation failed. Framework error shape.</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Caller's tenant type is <code>Provider</code>. Framework error shape.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---datalist\">Response fields - <code>data.list[]</code></h3>\n<p>All sixteen fields are <code>string</code> and nullable - <strong>including the dates</strong>.</p>\n<p><code>memberId</code>, <code>cardNumber</code>, <code>memberName</code>, <code>policyNumber</code>, <code>productCode</code>, <code>productName</code>, <code>planCode</code>, <code>planName</code>, <code>corporateCode</code>, <code>corporateName</code>, <code>clientCode</code>, <code>memberStatus</code>, <code>effectiveDate</code> <em>(string, not a date)</em>, <code>expiredDate</code> <em>(string, not a date)</em>, <code>relation</code>, <code>mappingId</code>.</p>\n<p>Envelope fields - <code>page</code>, <code>view</code>, <code>totalPage</code>, <code>totalRecord</code>, <code>query</code>, <code>filter</code> - are as described in the folder overview.</p>\n<h3 id=\"failures\">Failures</h3>\n<p>These use the framework error shape (PascalCase), not the V3 envelope. <code>Status</code> and <code>Errors[].ErrorCode</code> are always present; <code>Errors[].Message</code> is optional.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>ErrorCode</th>\n<th>Message</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>UNAUTHORIZED</td>\n<td>Search is unauthorized for Provider tenants.</td>\n<td>Caller's tenant type is <code>Provider</code>.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>VALIDATION_FAILED</td>\n<td>Page must be greater than or equal to 1.</td>\n<td><code>page</code> below 1.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>VALIDATION_FAILED</td>\n<td>PageSize must be greater than or equal to 1.</td>\n<td><code>pageSize</code> below 1.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>VALIDATION_FAILED</td>\n<td>PageSize cannot exceed 100.</td>\n<td><code>pageSize</code> above 100.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","Members","search"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[]}},"response":[{"id":"35118f1b-ece9-4070-8872-82dd9946658e","name":"Page of members","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"page\": 1,\n  \"pageSize\": 10,\n  \"cardNumber\": \"202601010-00000001\",\n  \"memberName\": \"John Doe\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"clientCode\": \"CLI01\",\n  \"corporateName\": \"Sample Corporate\",\n  \"memberStatus\": \"Active\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/search"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"list\": [\n            {\n                \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n                \"cardNumber\": \"202601010-00000001\",\n                \"memberName\": \"John Doe\",\n                \"policyNumber\": \"POL0000000000001\",\n                \"productCode\": \"PRD001\",\n                \"productName\": \"Sample Product\",\n                \"planCode\": \"PLAN-001\",\n                \"planName\": \"Sample Inpatient Plan (PLAN-001)\",\n                \"corporateCode\": \"CORP01\",\n                \"corporateName\": \"Sample Corporate\",\n                \"clientCode\": \"CLI01\",\n                \"memberStatus\": \"Active\",\n                \"effectiveDate\": \"2026-01-01T00:00:00+00:00\",\n                \"expiredDate\": \"2026-12-31T00:00:00+00:00\",\n                \"relation\": \"P\",\n                \"mappingId\": \"00001\"\n            }\n        ],\n        \"page\": 1,\n        \"view\": 10,\n        \"totalPage\": 1,\n        \"totalRecord\": 1,\n        \"query\": null,\n        \"filter\": {\n            \"page\": 1,\n            \"pageSize\": 10,\n            \"cardNumber\": \"202601010-00000001\",\n            \"memberName\": null,\n            \"policyNumber\": null,\n            \"clientCode\": null,\n            \"corporateName\": null,\n            \"corporateCode\": null,\n            \"companyName\": null,\n            \"productName\": null,\n            \"planCode\": null,\n            \"memberStatus\": null\n        }\n    }\n}"},{"id":"79e80080-e344-42bb-975a-408ff4edb89d","name":"Provider tenant refused","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"page\": 1,\n  \"pageSize\": 10,\n  \"cardNumber\": \"202601010-00000001\",\n  \"memberName\": \"John Doe\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"clientCode\": \"CLI01\",\n  \"corporateName\": \"Sample Corporate\",\n  \"memberStatus\": \"Active\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/search"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 401,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"UNAUTHORIZED\",\n            \"Message\": \"Search is unauthorized for Provider tenants.\"\n        }\n    ]\n}"},{"id":"6d940014-a888-4214-a702-5912c908e1e8","name":"Page size too large","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"page\": 1,\n  \"pageSize\": 10,\n  \"cardNumber\": \"202601010-00000001\",\n  \"memberName\": \"John Doe\",\n  \"policyNumber\": \"POL0000000000001\",\n  \"clientCode\": \"CLI01\",\n  \"corporateName\": \"Sample Corporate\",\n  \"memberStatus\": \"Active\"\n}","options":{"raw":{"language":"json"}}},"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/search"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"VALIDATION_FAILED\",\n            \"Message\": \"PageSize cannot exceed 100.\"\n        }\n    ]\n}"}],"_postman_id":"1ff6309b-5b85-464e-a57e-1054337396e1"},{"name":"Get Member Detail","id":"ee26024b-0843-4a96-8119-8b1e8d85065a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/:cardNumber","description":"<p>Retrieve one member in full, including plans and family members.</p>\n<p><strong><code>GET /v3/api/Members/{cardNumber}</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Auth scheme</strong></td>\n<td><code>cambridge-api</code> (Bearer)</td>\n</tr>\n<tr>\n<td><strong>Permissions</strong></td>\n<td><code>members:search</code> (controller) <strong>and</strong> <code>members:read</code> (action)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"description\">Description</h3>\n<p>Needs <strong>both</strong> permissions - <code>members:search</code> at the controller and <code>members:read</code> at the action. A client holding only <code>members:read</code> is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cardNumber</code></td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>Member's card number.</td>\n</tr>\n<tr>\n<td><code>Authorization</code></td>\n<td>header</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>Bearer &lt;access_token&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"responses\">Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>The member.</td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td>Blank card number. Framework error shape.</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>No such member. Framework error shape.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields---data\">Response fields - <code>data</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Null?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>isActive</code></td>\n<td>boolean</td>\n<td>No</td>\n<td><strong>The only non-nullable field on this response.</strong></td>\n</tr>\n<tr>\n<td><code>memberId</code>, <code>cardNumber</code>, <code>memberName</code>, <code>policyNumber</code>, <code>insuranceNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Identity.</td>\n</tr>\n<tr>\n<td><code>clientName</code>, <code>clientCode</code>, <code>corporateName</code>, <code>corporateCode</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Scope.</td>\n</tr>\n<tr>\n<td><code>dob</code>, <code>effectiveDate</code>, <code>expiredDate</code></td>\n<td><strong>string</strong></td>\n<td>Yes</td>\n<td>Strings, not dates.</td>\n</tr>\n<tr>\n<td><code>sex</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>M</code> / <code>F</code>.</td>\n</tr>\n<tr>\n<td><code>memberType</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>e.g. <code>Principal</code>.</td>\n</tr>\n<tr>\n<td><code>maritalStatus</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>S</code> / <code>M</code>.</td>\n</tr>\n<tr>\n<td><code>productCode</code>, <code>productName</code>, <code>productType</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>e.g. <code>group insurance</code>.</td>\n</tr>\n<tr>\n<td><code>relation</code>, <code>relationStatus</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>e.g. <code>P</code> for principal.</td>\n</tr>\n<tr>\n<td><code>plans</code></td>\n<td>array</td>\n<td>Yes</td>\n<td><strong>May be null, not just empty.</strong></td>\n</tr>\n<tr>\n<td><code>familyMembers</code></td>\n<td>array</td>\n<td>Yes</td>\n<td><strong>May be null, not just empty.</strong></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>plans[]</code></strong> - <code>benefitCode</code>, <code>benefitName</code>, <code>planCode</code>, <code>planName</code> string; <code>annualLimit</code> number(decimal); <code>planStart</code>, <code>planEnd</code> string; <code>isFamilyShared</code> boolean; <code>subBenefits</code> array. All nullable.</p>\n<p><strong><code>plans[].subBenefits[]</code></strong> - <code>benefitCode</code> string, <code>benefitName</code> string, <code>limit</code> number(decimal). All nullable.</p>\n<blockquote>\n<p><strong>This sub-benefit is much thinner than Member Eligibility's</strong> - three fields versus twenty. Partners needing <code>isCashless</code>, <code>coShare</code> or <code>condition[]</code> must call Member Eligibility, not Member Detail.</p>\n</blockquote>\n<p><strong><code>familyMembers[]</code></strong> - <code>memberId</code>, <code>memberName</code>, <code>cardNumber</code>, <code>relation</code>, <code>relationStatus</code>. All string, all nullable.</p>\n<h3 id=\"failures\">Failures</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Body</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>{\"Status\":400,\"Errors\":[{\"ErrorCode\":\"VALIDATION_FAILED\",\"Message\":\"Card number is required.\"}]}</code></td>\n<td>Blank card number.</td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>{\"Status\":404,\"Errors\":[{\"ErrorCode\":\"MEMBER_NOT_FOUND\",\"Message\":\"Member not found.\"}]}</code></td>\n<td>No such member.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}},"urlObject":{"path":["v3","api","Members",":cardNumber"],"host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"query":[],"variable":[{"description":{"content":"<p>Member's card number.</p>\n","type":"text/plain"},"type":"any","value":"202601010-00000001","key":"cardNumber"}]}},"response":[{"id":"17840ace-07ff-4a56-aedb-354c4ce5595d","name":"Member detail","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/:cardNumber","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","Members",":cardNumber"],"variable":[{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"message\": \"OK\",\n    \"data\": {\n        \"memberId\": \"00000000-0000-0000-0000-000000000001\",\n        \"cardNumber\": \"202601010-00000001\",\n        \"memberName\": \"John Doe\",\n        \"policyNumber\": \"POL0000000000001\",\n        \"insuranceNumber\": \"INS00000001\",\n        \"isActive\": true,\n        \"clientName\": \"Sample Insurance\",\n        \"clientCode\": \"CLI01\",\n        \"corporateName\": \"Sample Corporate\",\n        \"corporateCode\": \"CORP01\",\n        \"dob\": \"1990-01-01\",\n        \"sex\": \"M\",\n        \"memberType\": \"Principal\",\n        \"maritalStatus\": \"S\",\n        \"productCode\": \"PRD001\",\n        \"productName\": \"Sample Product\",\n        \"productType\": \"group insurance\",\n        \"effectiveDate\": \"2026-01-01T00:00:00+00:00\",\n        \"expiredDate\": \"2026-12-31T00:00:00+00:00\",\n        \"relation\": \"P\",\n        \"relationStatus\": \"P\",\n        \"plans\": [\n            {\n                \"benefitCode\": \"IP\",\n                \"benefitName\": \"INPATIENT\",\n                \"planCode\": \"PLAN-001\",\n                \"planName\": \"Sample Inpatient Plan (PLAN-001)\",\n                \"annualLimit\": 0,\n                \"planStart\": \"2025-12-31T17:00:00\",\n                \"planEnd\": \"2026-12-30T17:00:00\",\n                \"isFamilyShared\": false,\n                \"subBenefits\": [\n                    {\n                        \"benefitCode\": \"A1B2C3D4\",\n                        \"benefitName\": \"Additional Benefit - Sample Rider (For Dependants only)\",\n                        \"limit\": 30000000\n                    }\n                ]\n            }\n        ],\n        \"familyMembers\": []\n    }\n}"},{"id":"f703b238-0b0e-41db-8953-66b43b62cc0c","name":"Blank card number","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/:cardNumber","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","Members",":cardNumber"],"variable":[{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 400,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"VALIDATION_FAILED\",\n            \"Message\": \"Card number is required.\"\n        }\n    ]\n}"},{"id":"0e6796fd-7e45-450e-9f60-e8b920094a2b","name":"Member not found","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v3/api/Members/:cardNumber","host":["https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app"],"path":["v3","api","Members",":cardNumber"],"variable":[{"key":"cardNumber","value":"202601010-00000001","description":"Member's card number."}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": 404,\n    \"Errors\": [\n        {\n            \"ErrorCode\": \"MEMBER_NOT_FOUND\",\n            \"Message\": \"Member not found.\"\n        }\n    ]\n}"}],"_postman_id":"ee26024b-0843-4a96-8119-8b1e8d85065a"}],"id":"dd259789-a274-4ac9-b8d4-742bca9976c5","description":"<p>Both Members endpoints use the <code>cambridge-api</code> scheme.</p>\n<p>The controller-level policy is <code>members:search</code>, so an API client needs <code>members:search</code> even to fetch a single member's detail, plus <code>members:read</code> for the detail action itself.</p>\n<p><strong>Tenants of type <code>Provider</code> are refused</strong> on member search with <code>401</code>.</p>\n","_postman_id":"dd259789-a274-4ac9-b8d4-742bca9976c5","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}}],"id":"737c732a-c109-4535-bb1b-e3133707200c","description":"<p>The Members API. Search the member book and read a single member's detail including plans and sub-benefits.</p>\n","_postman_id":"737c732a-c109-4535-bb1b-e3133707200c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","name":"Cambridge API - V3","type":"folder"}}}],"id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a","description":"<p>The v3.0+ integration surface: OAuth, Cases and Members.</p>\n<p><strong>Authorisation is configured on this folder</strong> - Bearer Token, value <code></code>. Every request below inherits it. Only <strong>Get Token</strong> overrides to <em>No Auth</em>.</p>\n<p>Run <strong>OAuth &gt; Get Token</strong> first; its post-response script stores <code>accessToken</code> for every other request.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"_postman_id":"057eb0da-9a5a-4d61-87a0-2c8e333eb93a"}],"id":"3de7590e-fbb9-4b52-a65e-c510e14f7b96","description":"<h1 id=\"cambridge-openapi-v3---cases--member\">Cambridge OpenAPI V3 - Cases &amp; Member</h1>\n<p>The v3 integration surface for partners: OAuth, Cases and Members. Every request is authenticated with a Cambridge-signed JWT, authorised against the permissions held by the caller, and scoped to the data that caller's tenant is allowed to see before any downstream call is made.</p>\n<p>The tenant-administration endpoints under <code>/v3/api/admin/...</code> are out of scope for this documentation; they serve the internal console, not integrating partners.</p>\n<hr />\n<h2 id=\"changelog\">Changelog</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Date</strong></th>\n<th><strong>Description</strong></th>\n<th><strong>Version</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Aug 2026</td>\n<td>Added <strong>Void a Case</strong> (<code>POST /v3/api/cases/{claimNumber}/void</code>) - cancels a case that has not yet had its guarantee letter released; a retry against an already-voided case succeeds as a no-op.</td>\n<td>3.2.0</td>\n</tr>\n<tr>\n<td>Aug 2026</td>\n<td>Added <strong>Price Eligibility</strong> (<code>POST /v3/api/cases/price-eligibility</code>) - checks whether an amount is covered before a case exists. Binary in money terms; never discloses the member's remaining limit or visit count.</td>\n<td>3.1.0</td>\n</tr>\n<tr>\n<td>May 2026</td>\n<td>V3 multi-tenant OAuth, Cases Search, Get Case Detail, Create Case, Validate Outpatient Billing, Release Guarantee Letter, Member Eligibility, Member Search and Get Member Detail.</td>\n<td>3.0.0</td>\n</tr>\n<tr>\n<td>Oct 2025</td>\n<td>New API for submitting claim history; improved performance.</td>\n<td>2.7.0</td>\n</tr>\n<tr>\n<td>Feb 2025</td>\n<td>Changed the Find By Card Number response structure; added an endpoint for retrieving a member's benefit; updated the staging base URL.</td>\n<td>2.6.1</td>\n</tr>\n<tr>\n<td>Jan 2025</td>\n<td>List Member by Client Code; enhanced Provider List filtering by distance.</td>\n<td>2.5.3</td>\n</tr>\n<tr>\n<td>Oct 2024</td>\n<td>Claim, Member's Data and Provider List.</td>\n<td>2.4.4</td>\n</tr>\n<tr>\n<td>Aug 2024</td>\n<td>Enrollment Process.</td>\n<td>1.0.0</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"1-overview\">1. Overview</h2>\n<p>V1 and V2 of the Cambridge API were single-tenant proxies in front of NOVA. <strong>V3 is a first-party, multi-tenant identity and authorisation system.</strong></p>\n<h3 id=\"11-the-integration-token\">1.1 The integration token</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>JWT audience / auth scheme</td>\n<td><code>cambridge-api</code></td>\n</tr>\n<tr>\n<td>Identity</td>\n<td>An API Client (client ID + secret)</td>\n</tr>\n<tr>\n<td>Obtained from</td>\n<td><code>POST /v3/api/oauth/token</code></td>\n</tr>\n<tr>\n<td>Access token lifetime</td>\n<td>60 minutes</td>\n</tr>\n<tr>\n<td>Refresh mechanism</td>\n<td>None - request a new token</td>\n</tr>\n<tr>\n<td>Gated by</td>\n<td>Permissions (<code>cases:read</code>, <code>members:search</code>, ...)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Client credentials are issued by a tenant administrator through the console. If you need a client ID and secret, or a permission added to an existing one, ask the tenant's administrator rather than calling any endpoint yourself.</p>\n<p><strong>Credentials are never stored in this collection.</strong> <code>{{clientId}}</code> and <code>{{clientSecret}}</code> are secret-typed environment variables with no saved value - supply them in your own environment at integration time.</p>\n<h3 id=\"12-tenant-scoping-data-bindings\">1.2 Tenant scoping (data bindings)</h3>\n<p>Every tenant has a type - <code>Client</code>, <code>Corporate</code>, <code>Broker</code>, <code>Provider</code> or <code>Full</code> - and a set of data bindings, the codes it is permitted to act within:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Binding type</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ProviderCode</code></td>\n<td>The clinics/hospitals this tenant operates.</td>\n</tr>\n<tr>\n<td><code>CorporateCode</code></td>\n<td>The corporates whose members this tenant may act for.</td>\n</tr>\n<tr>\n<td><code>ClientCode</code></td>\n<td>The insurer/client whose book this tenant may act within.</td>\n</tr>\n<tr>\n<td><code>CustomerGroupCode</code></td>\n<td>Customer group scoping.</td>\n</tr>\n<tr>\n<td><code>BrokerCode</code></td>\n<td>Broker scoping.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Bindings are embedded in the token and re-checked server-side on every scoped operation. A tenant of type <code>Full</code> is unrestricted and skips these checks; every other tenant type must pass them. <strong>A restricted tenant holding no bindings at all is denied rather than granted everything.</strong></p>\n<p>Scoping failures return <code>403</code> with a message naming the boundary that was crossed - see each endpoint's failure table.</p>\n<p>Search results are already restricted to the tenant's bindings - a search never needs to be filtered again on the caller's side.</p>\n<hr />\n<h2 id=\"2-conventions\">2. Conventions</h2>\n<h3 id=\"21-base-path-and-versioning\">2.1 Base path and versioning</h3>\n<p>Versioning is by URL segment. Every V3 route sits under <code>/v3/api</code>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Staging:     https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app\nProduction:  (to be confirmed)\n\n&lt;host&gt;/v3/api/&lt;resource&gt;\n</code></pre><p>Routing is case-insensitive, so <code>/v3/api/members/...</code> and <code>/v3/api/Members/...</code> reach the same action.</p>\n<p><strong>No shorter alias is served.</strong> <code>/v3/cases/search</code> returns <code>404</code> - verified against staging on 2026-09-21. Only the <code>/v3/api/...</code> form is served by the application itself; any shorter alias would have to be provided by a gateway or reverse proxy in front of Cambridge.</p>\n<h3 id=\"22-success-envelope\">2.2 Success envelope</h3>\n<p>The Cases and Members endpoints wrap their payload in the standard V3 envelope (<code>V3Response&lt;T&gt;</code>):</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"success\",\n  \"message\": \"OK\",\n  \"data\": { }\n}\n</code></pre>\n<p>List endpoints put <code>V3ListData&lt;T&gt;</code> in <code>data</code>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"success\",\n  \"message\": \"OK\",\n  \"data\": {\n    \"list\": [],\n    \"page\": 1,\n    \"view\": 10,\n    \"totalPage\": 0,\n    \"totalRecord\": 0,\n    \"query\": null,\n    \"filter\": { }\n  }\n}\n</code></pre>\n<p><code>view</code> is the page size; <code>filter</code> echoes back the request that produced the page.</p>\n<p>The token endpoint deliberately does <strong>not</strong> use the envelope, because it is OAuth-shaped rather than resource-shaped: <code>POST /v3/api/oauth/token</code> returns the standard OAuth token object at the top level.</p>\n<h3 id=\"23-field-presence---read-this-before-writing-a-deserialiser\">2.3 Field presence - read this before writing a deserialiser</h3>\n<p><strong>Every field documented on a Cases or Members response is always present.</strong> A field with no value arrives as <code>\"field\": null</code>, never as a missing key. Most fields are nullable; a client may index every key but must null-check nearly all of them.</p>\n<p>Because presence is universal, the response tables in this documentation carry a <strong>Null?</strong> column rather than a required column. The three non-enveloped shapes - the token response, the framework error and the RFC 7807 document - are the only places where presence varies, and they are marked individually.</p>\n<h3 id=\"24-error-shapes\">2.4 Error shapes</h3>\n<p>There are four distinct error bodies in V3. An integration should handle all four.</p>\n<p><strong>(a) Handled business failures on Cases</strong> - returned by the Cases controller itself, in the V3 envelope with <code>status: \"error\"</code> and <code>data: null</code>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"error\",\n  \"message\": \"Case not found\",\n  \"data\": null\n}\n</code></pre>\n<p><strong>(b) Framework exceptions</strong> - thrown by the Members service and rendered by the exception middleware. Note the <strong>PascalCase</strong> property names; this shape does not follow the camelCase envelope above, because the middleware writes the body outside the MVC pipeline:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"Status\": 404,\n  \"Errors\": [\n    { \"ErrorCode\": \"MEMBER_NOT_FOUND\", \"Message\": \"Member not found.\" }\n  ]\n}\n</code></pre>\n<p><code>Status</code> and <code>Errors[].ErrorCode</code> are always present; <code>Errors[].Message</code> is optional.</p>\n<p><strong>(c) Model-binding validation</strong> - a request that fails a required or type check is rejected before the handler runs, as an RFC 7807 problem document:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"type\": \"https://tools.ietf.org/html/rfc9110#section-15.5.1\",\n  \"title\": \"One or more validation errors occurred.\",\n  \"status\": 400,\n  \"errors\": { \"CardNumber\": [\"The CardNumber field is required.\"] }\n}\n</code></pre>\n<p><code>errors</code> appears only on binding failures.</p>\n<p><strong>(d) Authentication / authorisation refusals</strong> - a missing, expired or wrong-audience token returns <code>401</code> with an <strong>empty body</strong> and a <code>WWW-Authenticate: Bearer</code> header; a token that fails a permission policy returns <code>403</code> with an <strong>empty body</strong>. The JSON <code>403</code> bodies documented per endpoint are scoping refusals, raised after authorisation has already passed.</p>\n<blockquote>\n<p>The empty <code>401</code> is served with <code>content-type: text/html</code> and <code>Content-Length: 0</code>. A strict client that branches on content-type before checking length may trip on this - check the status code and length, not the content type.</p>\n</blockquote>\n<h3 id=\"25-permission-catalogue\">2.5 Permission catalogue</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Permission</th>\n<th>Grants</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cases:search</code></td>\n<td>Search cases/claims within the tenant's scope.</td>\n</tr>\n<tr>\n<td><code>cases:read</code></td>\n<td>Read case detail, member eligibility and price eligibility.</td>\n</tr>\n<tr>\n<td><code>cases:write</code></td>\n<td>Submit, validate, release and void cases within the tenant's scope.</td>\n</tr>\n<tr>\n<td><code>members:search</code></td>\n<td>Search members within the tenant's scope.</td>\n</tr>\n<tr>\n<td><code>members:read</code></td>\n<td>Read a member's detail.</td>\n</tr>\n</tbody>\n</table>\n</div><p>A tenant holds a permission ceiling; an API client may only be granted permissions inside it, so a permission your integration needs may have to be added to the tenant first.</p>\n<h3 id=\"26-endpoint-inventory\">2.6 Endpoint inventory</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n<th>Auth scheme</th>\n<th>Gate</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/oauth/token</code></td>\n<td>none</td>\n<td>-</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/v3/api/cases/search</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:search</code></td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/v3/api/cases/{claimNumber}</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:read</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/cases</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/cases/validate-billing</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/cases/outpatient/release-gl</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/cases/member-eligibility</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:read</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/cases/price-eligibility</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:read</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/cases/{claimNumber}/void</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>cases:write</code></td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/v3/api/Members/search</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>members:search</code></td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/v3/api/Members/{cardNumber}</code></td>\n<td><code>cambridge-api</code></td>\n<td><code>members:search</code> + <code>members:read</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"27-dates-numbers-and-enums\">2.7 Dates, numbers and enums</h3>\n<ul>\n<li>Request date fields (<code>dob</code>, <code>indate</code>) are <strong>strings</strong> in <code>yyyy-MM-dd</code>. <code>treatmentDate</code> is a full ISO-8601 datetime with offset.</li>\n<li><strong>Cases</strong> responses return dates as ISO-8601 datetimes. <strong>Members</strong> responses return them as pass-through <strong>strings</strong> - do not assume they parse.</li>\n<li>Money is a JSON number in the plan's currency (IDR unless stated otherwise) - never a formatted string.</li>\n<li><code>claimStatus</code>: <code>New Case</code>, <code>Registered</code>, <code>FGL Review</code>, <code>FGL Released</code>, <code>Payment In Progress</code>, <code>Paid</code>, <code>Void</code>.</li>\n<li><code>treatmentType</code> / <code>tipePerawatan</code>: <code>Rawat inap</code> (inpatient), <code>Rawat jalan</code> (outpatient).</li>\n</ul>\n<h3 id=\"28-status-codes-at-a-glance\">2.8 Status codes at a glance</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning in V3</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>Success - <strong>including</strong> a not-eligible price-eligibility verdict and an already-void case.</td>\n</tr>\n<tr>\n<td>400</td>\n<td>Validation failure, business rule refusal, or a downstream failure Cambridge handled.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>No/invalid/expired token, wrong audience, or a <code>Provider</code> tenant calling member search.</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Permission policy failed (empty body), or a tenant scoping boundary was crossed (JSON body).</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Case or member not found - or outside the caller's tenant.</td>\n</tr>\n<tr>\n<td>500</td>\n<td>Unhandled error; the body carries no detail beyond a generic message.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"3-example-data\">3. Example data</h2>\n<p>Every example in this folder follows one fictional journey, so the values can be traced end to end:</p>\n<blockquote>\n<p><strong>John Doe</strong>, card <code>202601010-00000001</code>, telemedicine benefit <code>00000001</code> under plan <code>TELE-001</code>, treated at <strong>Sample Clinic</strong> (<code>PRV001</code>), producing claim <code>CL2601010000001H</code>.</p>\n</blockquote>\n<p><strong>No value in any example is real.</strong> Card numbers, claim numbers, benefit codes, plan codes, internal IDs, names and emails are synthetic and structurally valid.</p>\n<hr />\n<h2 id=\"4-appendix---jwt-claims\">4. Appendix - JWT claims</h2>\n<p>The <code>cambridge-api</code> token (audience <code>cambridge-api</code>, 60 minutes) carries:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Claim</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>sub</code></td>\n<td>API client's internal ID.</td>\n</tr>\n<tr>\n<td><code>tenant_id</code></td>\n<td>Owning tenant.</td>\n</tr>\n<tr>\n<td><code>tenant_type</code></td>\n<td><code>Client</code>, <code>Corporate</code>, <code>Broker</code>, <code>Provider</code> or <code>Full</code>.</td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>The public client identifier.</td>\n</tr>\n<tr>\n<td><code>permissions</code></td>\n<td>JSON array of permission codes.</td>\n</tr>\n<tr>\n<td><code>bindings</code></td>\n<td>JSON array of <code>{ \"type\": \"...\", \"key\": \"...\" }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>It is HMAC-SHA256 signed with the shared JWT key and validated on issuer, audience, lifetime and signature. <strong>The claims are a snapshot taken at issue time</strong> - treat the token as read-only and request a new one after any permission or binding change.</p>\n","_postman_id":"3de7590e-fbb9-4b52-a65e-c510e14f7b96","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"8f4d874e-b270-46dd-a3bd-07ae76c56d25","id":"8f4d874e-b270-46dd-a3bd-07ae76c56d25","name":"Cambridge API","type":"folder"}}}],"id":"8f4d874e-b270-46dd-a3bd-07ae76c56d25","description":"<p>This Cambridge API contains features that can be used in your members management system.</p>\n<h2 id=\"https-request\">HTTP(S) Request</h2>\n<p>Cambridge OpenAPI can be requested through HTTP(S) Request to Cambridge OpenAPI Base URL endpoint. The HTTP(S) Header has to be used to allow proper authentication.</p>\n<h2 id=\"api-base-url\">API Base URL</h2>\n<ul>\n<li><p>Sandbox Environment: <a href=\"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app/v1\">Base URL for Staging</a></p>\n</li>\n<li><p>Production Environtment: <a href=\"https://id-cambridge.healthmetrics.com/v1\">Base URL for Production</a></p>\n</li>\n</ul>\n<h2 id=\"https-header\">HTTP(S) Header</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Value</th>\n<th>Definition</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Content-Type</td>\n<td>application/json</td>\n<td>The Content-Type field indicates that JSON type is acceptable to send to the recipient</td>\n</tr>\n<tr>\n<td>Accept</td>\n<td>application/json</td>\n<td>The Accept field is used to specify that JSON type is acceptable for the response</td>\n</tr>\n<tr>\n<td>Authorization</td>\n<td>BEARER_TOKEN</td>\n<td>The Authorization field credentials can be found in Login Responses.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"content-type-and-accept-header\">Content-Type and Accept Header</h3>\n<p>In Cambridge API, the input and output parameters of the methods will be in JSON format. To accept JSON input and output parameters, you need to add the following HTTP(S) header:</p>\n<ul>\n<li><p>Content-Type: application/json</p>\n</li>\n<li><p>Accept: application/json</p>\n</li>\n</ul>\n","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"33d4caeb-abc9-4265-ad08-49919ab5e41d","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"1ace515b-3de3-480c-8cde-d45e482ca94b","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"8f4d874e-b270-46dd-a3bd-07ae76c56d25"}],"event":[{"listen":"prerequest","script":{"id":"55cedf42-7cad-4920-864a-8d6c8b6922ca","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"fe0aa6ea-df49-4a47-949c-ecc0b8197c87","type":"text/javascript","exec":[""]}}],"variable":[{"key":"baseUrl","value":"https://hms-id-svc-cambridge-stg-928498666018.asia-southeast2.run.app","type":"string","description":"Staging. Production to be confirmed."},{"key":"key","value":"","type":"string"},{"key":"server","value":"","type":"string"},{"key":"accessToken","value":"","type":"string","description":"Written by Get Token's post-response script."},{"key":"BearerToken","value":"","type":"string","description":"Written by Login's post-response script."}]}