{
  "info": {
    "name": "WALT Connect — Partner API v1",
    "description": "Postman collection for the WALT Connect Partner API v1, following the end-to-end flow in the integration guide §6:\nhttps://www.underwritinguk.ai/developers/guide/#s6-end-to-end-integration-flow\n\n**Set up**\n1. Create a Postman *environment* (e.g. \"WALT sandbox\") with `baseUrl`, `clientId` and `clientSecret`. Mark `clientSecret` as type **secret**. Never put credentials in the collection itself or share them in a workspace.\n2. `baseUrl` defaults to the intended sandbox host, `https://dev-api.underwritinguk.ai/v1`. Set it in your environment to the base URL your onboarding email gives. Production (by arrangement) is `https://api.underwritinguk.ai/v1`, with separate production credentials.\n3. Run the requests in order. The collection pre-request script fetches and caches the OAuth token automatically; scripts store `caseId` and `assessmentId` for the following steps.\n\n**Sandbox only:** use synthetic data. The surname (`personaSurname`, default `Approve`) selects a test persona (guide §11). Never send real personal data to the sandbox.\n\n**Folders**\n- *End-to-end flow (guide §6)* and *Webhooks & reconciliation*: the curated flow, with scripts that carry `caseId` and `assessmentId` forward.\n- *API reference (every operation)*: one request per operation of the published OpenAPI document (`/developers/openapi.json`), grouped by tag. Path parameters use collection variables (`{{caseId}}`, `{{individualId}}`, …).\n\nGenerated from the backend's OpenAPI export by `tools/api-docs.mjs`; do not edit the downloaded file by hand.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "version": "1.0.0"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{accessToken}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// WALT Connect — obtain and cache an OAuth 2.0 client-credentials token (guide §4.1).",
          "// Runs before every request. Requests a new token only when none is cached or the",
          "// cached one expires within 60 seconds, so the token endpoint (30/min) is not hammered.",
          "(function () {",
          "const path = pm.request.url.getPath();",
          "if (path.endsWith('/oauth/token')) return;",
          "",
          "const token = pm.collectionVariables.get('accessToken');",
          "const expiresAt = Number(pm.collectionVariables.get('accessTokenExpiresAt') || 0);",
          "if (token && Date.now() < expiresAt - 60 * 1000) return;",
          "",
          "const clientId = pm.variables.get('clientId');",
          "const clientSecret = pm.variables.get('clientSecret');",
          "if (!clientId || !clientSecret) {",
          "  throw new Error('WALT Connect: set clientId and clientSecret (use an environment, secret type) before sending requests.');",
          "}",
          "const basic = typeof btoa === 'function'",
          "  ? btoa(clientId + ':' + clientSecret)",
          "  : require('crypto-js').enc.Base64.stringify(require('crypto-js').enc.Utf8.parse(clientId + ':' + clientSecret));",
          "const form = [{ key: 'grant_type', value: 'client_credentials' }];",
          "const scope = pm.variables.get('scope');",
          "if (scope) form.push({ key: 'scope', value: scope });",
          "",
          "pm.sendRequest({",
          "  url: pm.variables.replaceIn('{{baseUrl}}') + '/oauth/token',",
          "  method: 'POST',",
          "  header: [",
          "    { key: 'Authorization', value: 'Basic ' + basic },",
          "    { key: 'Content-Type', value: 'application/x-www-form-urlencoded' },",
          "    { key: 'Accept', value: 'application/json' }",
          "  ],",
          "  body: { mode: 'urlencoded', urlencoded: form }",
          "}, (err, res) => {",
          "  if (err) { console.error('WALT token request failed', err); return; }",
          "  if (res.code !== 200) { console.error('WALT token request returned ' + res.code, res.text()); return; }",
          "  const body = res.json();",
          "  pm.collectionVariables.set('accessToken', body.access_token);",
          "  pm.collectionVariables.set('accessTokenExpiresAt', String(Date.now() + (Number(body.expires_in) || 900) * 1000));",
          "});",
          "})();"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "End-to-end flow (guide §6)",
      "description": "Run top to bottom against the sandbox.",
      "item": [
        {
          "name": "1. Get an access token",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('token issued', () => pm.response.to.have.status(200));",
                  "const b = pm.response.json();",
                  "if (b.access_token) {",
                  "  pm.collectionVariables.set('accessToken', b.access_token);",
                  "  pm.collectionVariables.set('accessTokenExpiresAt', String(Date.now() + (Number(b.expires_in) || 900) * 1000));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/x-www-form-urlencoded",
                "type": "text"
              }
            ],
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                {
                  "key": "grant_type",
                  "value": "client_credentials",
                  "type": "text"
                },
                {
                  "key": "scope",
                  "value": "{{scope}}",
                  "type": "text",
                  "disabled": true,
                  "description": "Enable to request specific scopes."
                }
              ]
            },
            "url": {
              "raw": "{{baseUrl}}/oauth/token",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "oauth",
                "token"
              ]
            },
            "description": "Optional — the collection pre-request script does this for you. Included to show the call (guide §4.1). Uses HTTP Basic with client_id:client_secret.",
            "auth": {
              "type": "basic",
              "basic": [
                {
                  "key": "username",
                  "value": "{{clientId}}",
                  "type": "string"
                },
                {
                  "key": "password",
                  "value": "{{clientSecret}}",
                  "type": "string"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "2. Entitlements (cache 24 h)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('200 OK', () => pm.response.to.have.status(200));"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/account",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "account"
              ]
            },
            "description": "Modules, allowed case types, quota and rate limits. Once a day is enough."
          },
          "response": []
        },
        {
          "name": "3. Create the case",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.collectionVariables.set('externalRef', 'postman-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('201 Created', () => pm.response.to.have.status(201));",
                  "const b = pm.response.json();",
                  "if (b.id) pm.collectionVariables.set('caseId', b.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "type": "text",
                "description": "A fresh UUID per send. In production, generate one key per logical operation and REUSE it on retries (guide §5)."
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_ref\": \"{{externalRef}}\",\n  \"case_type\": \"full\",\n  \"loan\": {\n    \"facility_amount_gbp\": 392000,\n    \"term_months\": 12,\n    \"loan_type\": \"bridge\",\n    \"interest_type\": \"retained\",\n    \"exit_strategy\": \"sale\",\n    \"exit_strategy_detail\": \"Sale of the property after refurbishment\"\n  },\n  \"individuals\": [\n    {\n      \"external_ref\": \"{{externalRef}}-IND1\",\n      \"is_primary\": true,\n      \"role\": \"borrower\",\n      \"title\": \"mr\",\n      \"first_name\": \"John\",\n      \"middle_name\": null,\n      \"surname\": \"{{personaSurname}}\",\n      \"date_of_birth\": \"1980-04-12\",\n      \"gender\": \"male\",\n      \"nationality\": \"GB\",\n      \"country_of_birth\": \"GB\",\n      \"residence_country\": \"GB\",\n      \"email\": \"john.doe@example.com\",\n      \"phone\": \"+447700900123\",\n      \"address\": {\n        \"line1\": \"10 Example Street\",\n        \"line2\": null,\n        \"city\": \"London\",\n        \"postcode\": \"SW1A 1AA\",\n        \"country\": \"GB\"\n      }\n    }\n  ],\n  \"companies\": [\n    {\n      \"external_ref\": \"{{externalRef}}-CO1\",\n      \"role\": \"borrower\",\n      \"company_name\": \"Example Holdings Ltd\",\n      \"company_number\": \"12345678\",\n      \"address\": {\n        \"line1\": \"1 Example Place\",\n        \"city\": \"London\",\n        \"postcode\": \"EC1A 1BB\",\n        \"country\": \"GB\"\n      }\n    }\n  ],\n  \"ownerships\": [\n    {\n      \"individual_external_ref\": \"{{externalRef}}-IND1\",\n      \"company_external_ref\": \"{{externalRef}}-CO1\",\n      \"relationship\": \"director_shareholder\",\n      \"ownership_percent\": 100\n    }\n  ],\n  \"properties\": [\n    {\n      \"external_ref\": \"{{externalRef}}-PROP1\",\n      \"address\": {\n        \"line1\": \"22 Sample Road\",\n        \"city\": \"Manchester\",\n        \"postcode\": \"M1 1AE\",\n        \"country\": \"GB\"\n      },\n      \"uprn\": \"100012345678\",\n      \"asset_type\": \"residential\",\n      \"property_type\": \"terraced\",\n      \"tenure\": \"freehold\",\n      \"num_rooms\": 3,\n      \"charge_type\": \"first\",\n      \"purchase_price_gbp\": 520000,\n      \"units_in_building\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/cases",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cases"
              ]
            },
            "description": "One transactional call with all subjects (guide §6 Step 3). A new externalRef is generated per send so repeated runs do not hit 409 case_exists. Synthetic data only."
          },
          "response": []
        },
        {
          "name": "3b. Look up the case by external_ref",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/cases?external_ref={{externalRef}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cases"
              ],
              "query": [
                {
                  "key": "external_ref",
                  "value": "{{externalRef}}"
                }
              ]
            },
            "description": "How to recover a case after `409 case_exists` or a lost response."
          },
          "response": []
        },
        {
          "name": "4. Upload a document",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "type": "text",
                "description": "A fresh UUID per send. In production, generate one key per logical operation and REUSE it on retries (guide §5)."
              }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "Pick a synthetic PDF (max 25 MB)."
                },
                {
                  "key": "document_type",
                  "value": "valuation_report",
                  "type": "text"
                },
                {
                  "key": "external_ref",
                  "value": "{{externalRef}}-DOC1",
                  "type": "text"
                }
              ]
            },
            "url": {
              "raw": "{{baseUrl}}/cases/{{caseId}}/documents",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cases",
                "{{caseId}}",
                "documents"
              ]
            },
            "description": "Optional. Wait until the document status is `available` before quoting and assessing (guide §6 Step 4)."
          },
          "response": []
        },
        {
          "name": "4b. List documents",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/cases/{{caseId}}/documents",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cases",
                "{{caseId}}",
                "documents"
              ]
            },
            "description": "Check that every document is `available`."
          },
          "response": []
        },
        {
          "name": "5. Quote",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/cases/{{caseId}}/assessments/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cases",
                "{{caseId}}",
                "assessments",
                "quote"
              ]
            },
            "description": "Free and side-effect free: token cost, subjects searched vs reused, missing data."
          },
          "response": []
        },
        {
          "name": "6. Start the assessment",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('202 Accepted', () => pm.response.to.have.status(202));",
                  "const b = pm.response.json();",
                  "if (b.id) pm.collectionVariables.set('assessmentId', b.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "type": "text",
                "description": "A fresh UUID per send. In production, generate one key per logical operation and REUSE it on retries (guide §5)."
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"mode\": \"incremental\",\n  \"checks\": {\n    \"exclude\": []\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/cases/{{caseId}}/assessments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cases",
                "{{caseId}}",
                "assessments"
              ]
            },
            "description": "Asynchronous (202). Costs tokens in production."
          },
          "response": []
        },
        {
          "name": "7. Poll the assessment",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const b = pm.response.json(); console.log('status', b.status, b.progress || '');"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assessments/{{assessmentId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assessments",
                "{{assessmentId}}"
              ]
            },
            "description": "Fallback when you cannot receive webhooks. Poll no more often than every 10 s; back off to 60 s after 5 minutes."
          },
          "response": []
        },
        {
          "name": "8a. Decision",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assessments/{{assessmentId}}/decision",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assessments",
                "{{assessmentId}}",
                "decision"
              ]
            },
            "description": "Advisory recommendation, scores, steps and conditions. Store `version`; never apply an older one."
          },
          "response": []
        },
        {
          "name": "8b. Derived check results",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assessments/{{assessmentId}}/checks?limit=100",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assessments",
                "{{assessmentId}}",
                "checks"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "100"
                }
              ]
            },
            "description": "Derived per-check results. Raw provider data is never returned."
          },
          "response": []
        },
        {
          "name": "8c. PDF report",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/assessments/{{assessmentId}}/report",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "assessments",
                "{{assessmentId}}",
                "report"
              ]
            },
            "description": "303 to a 5-minute link. Postman follows the redirect; save the PDF with \"Save response\". Never store the link."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks & reconciliation",
      "item": [
        {
          "name": "List webhook endpoints",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhook-endpoints",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhook-endpoints"
              ]
            },
            "description": "Needs the `webhooks:manage` scope."
          },
          "response": []
        },
        {
          "name": "Event log (last 7 days)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/events?since=2026-10-01T00:00:00Z",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "events"
              ],
              "query": [
                {
                  "key": "since",
                  "value": "2026-10-01T00:00:00Z"
                }
              ]
            },
            "description": "Catch up on missed events."
          },
          "response": []
        }
      ]
    },
    {
      "name": "API reference (every operation)",
      "description": "Every operation of developers/openapi.json (WALT Partner API 1.0.0), one folder per tag. Generated by tools/api-docs.mjs; bodies are minimal examples built from the schemas (required fields only). Path parameters use collection variables such as {{caseId}}.",
      "item": [
        {
          "name": "oauth",
          "description": "Access tokens (OAuth 2.0 client credentials).",
          "item": [
            {
              "name": "Get an access token (OAuth 2.0 client credentials)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/x-www-form-urlencoded",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/oauth/token",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "oauth",
                    "token"
                  ]
                },
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "grant_type",
                      "value": "client_credentials",
                      "type": "text"
                    },
                    {
                      "key": "scope",
                      "value": "{{scope}}",
                      "type": "text",
                      "disabled": true
                    },
                    {
                      "key": "client_id",
                      "value": "{{clientId}}",
                      "type": "text",
                      "disabled": true
                    },
                    {
                      "key": "client_secret",
                      "value": "{{clientSecret}}",
                      "type": "text",
                      "disabled": true
                    }
                  ]
                },
                "auth": {
                  "type": "basic",
                  "basic": [
                    {
                      "key": "username",
                      "value": "{{clientId}}",
                      "type": "string"
                    },
                    {
                      "key": "password",
                      "value": "{{clientSecret}}",
                      "type": "string"
                    }
                  ]
                },
                "description": "RFC 6749 §4.4. Authenticate with HTTP Basic (`client_secret_basic`) or with `client_id` + `client_secret` in the form body (`client_secret_post`), never both. The token lasts 15 minutes: cache it and renew it about 60 seconds before it expires. Errors follow RFC 6749 §5.2.\n\nAuthentication: HTTP Basic (client_id:client_secret).\n\nOperation: `createAccessToken`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "account",
          "description": "Entitlements, quota and limits.",
          "item": [
            {
              "name": "Entitlements, quota and limits",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/account",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "account"
                  ]
                },
                "description": "Entitlements, quota and limits\n\nScopes: `account:read`.\n\nOperation: `getAccount`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "catalog",
          "description": "The checks WALT runs and the data they need.",
          "item": [
            {
              "name": "Checks, their step, module and required data",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/check-catalog",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "check-catalog"
                  ]
                },
                "description": "Checks, their step, module and required data\n\nScopes: any.\n\nOperation: `getCheckCatalog`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "cases",
          "description": "Loan applications, created with all their subjects in one call.",
          "item": [
            {
              "name": "List and filter cases (cursor pagination)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases"
                  ],
                  "query": [
                    {
                      "key": "external_ref",
                      "value": "string",
                      "disabled": true,
                      "description": "Exact match on your record id"
                    },
                    {
                      "key": "status",
                      "value": "string",
                      "disabled": true,
                      "description": "open | closed"
                    },
                    {
                      "key": "updated_since",
                      "value": "2026-01-31T09:00:00Z",
                      "disabled": true,
                      "description": "ISO 8601 timestamp, e.g. 2026-10-09T14:03:22Z"
                    },
                    {
                      "key": "created_via",
                      "value": "string",
                      "disabled": true,
                      "description": "api | webapp"
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "string",
                      "disabled": true,
                      "description": "next_cursor of the previous page"
                    }
                  ]
                },
                "description": "List and filter cases (cursor pagination)\n\nScopes: `cases:read`.\n\nOperation: `listCases`."
              },
              "response": []
            },
            {
              "name": "Create a case with its subjects (one transactional call)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation; reuse it on retries"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"case_type\": \"full\",\n  \"companies\": [\n    {\n      \"address\": {\n        \"city\": \"London\",\n        \"country\": \"GB\",\n        \"line1\": \"1 Example Place\",\n        \"postcode\": \"EC1A 1BB\"\n      },\n      \"company_name\": \"Example Holdings Ltd\",\n      \"company_number\": \"12345678\",\n      \"external_ref\": \"001Qy00000AcmeAAA\",\n      \"role\": \"borrower\"\n    }\n  ],\n  \"external_ref\": \"006Qy00000AbCdEIAV\",\n  \"individuals\": [\n    {\n      \"address\": {\n        \"city\": \"London\",\n        \"country\": \"GB\",\n        \"line1\": \"10 Example Street\",\n        \"postcode\": \"SW1A 1AA\"\n      },\n      \"country_of_birth\": \"GB\",\n      \"date_of_birth\": \"1980-04-12\",\n      \"email\": \"john.doe@example.com\",\n      \"external_ref\": \"003Qy00000JdoeAAA\",\n      \"first_name\": \"John\",\n      \"gender\": \"male\",\n      \"is_primary\": true,\n      \"nationality\": \"GB\",\n      \"phone\": \"+447700900123\",\n      \"residence_country\": \"GB\",\n      \"role\": \"borrower\",\n      \"surname\": \"Doe\",\n      \"title\": \"mr\"\n    }\n  ],\n  \"loan\": {\n    \"exit_strategy\": \"sale\",\n    \"exit_strategy_detail\": \"Sale of the property after refurbishment\",\n    \"facility_amount_gbp\": 392000,\n    \"interest_type\": \"retained\",\n    \"loan_type\": \"bridge\",\n    \"term_months\": 12\n  },\n  \"ownerships\": [\n    {\n      \"company_external_ref\": \"001Qy00000AcmeAAA\",\n      \"individual_external_ref\": \"003Qy00000JdoeAAA\",\n      \"ownership_percent\": 100,\n      \"relationship\": \"director_shareholder\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"external_ref\": \"a0BQy000001PropAAA\",\n      \"address\": {\n        \"city\": \"Manchester\",\n        \"country\": \"GB\",\n        \"line1\": \"22 Sample Road\",\n        \"postcode\": \"M1 1AE\"\n      },\n      \"uprn\": \"100012345678\",\n      \"asset_type\": \"residential\",\n      \"property_type\": \"terraced\",\n      \"tenure\": \"freehold\",\n      \"num_rooms\": 3,\n      \"charge_type\": \"first\",\n      \"purchase_price_gbp\": 520000,\n      \"units_in_building\": 1\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Create a case with its subjects (one transactional call)\n\nScopes: `cases:write`.\n\nOperation: `createCase`."
              },
              "response": []
            },
            {
              "name": "Read a case",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}"
                  ]
                },
                "description": "Read a case\n\nScopes: `cases:read`.\n\nOperation: `getCase`."
              },
              "response": []
            },
            {
              "name": "Update a case and its loan details",
              "request": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "ETag from a previous GET; a mismatch returns 412"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"external_ref\": \"string\",\n  \"reference\": \"string\",\n  \"case_type\": \"credit_identity\",\n  \"loan\": {\n    \"facility_amount_gbp\": 0,\n    \"term_months\": 1,\n    \"loan_type\": \"bridge\",\n    \"interest_type\": \"retained\",\n    \"exit_strategy\": \"sale\",\n    \"exit_strategy_detail\": \"string\",\n    \"ltv_basis\": \"day_180\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update a case and its loan details\n\nScopes: `cases:write`.\n\nOperation: `updateCase`."
              },
              "response": []
            },
            {
              "name": "Close a case",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/close",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "close"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"completed\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Any credential with ``cases:write`` that can see the case may close it,\nexactly as it may edit it. Closing an already-closed case returns it\nunchanged.\n\nScopes: `cases:write`.\n\nOperation: `closeCase`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "parties",
          "description": "Individuals, companies, properties and ownerships of a case.",
          "item": [
            {
              "name": "Add an individual",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/individuals",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "individuals"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"role\": \"borrower\",\n  \"title\": \"mr\",\n  \"first_name\": \"string\",\n  \"surname\": \"string\",\n  \"date_of_birth\": \"2026-01-31\",\n  \"address\": {\n    \"line1\": \"string\",\n    \"city\": \"string\",\n    \"postcode\": \"string\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Add an individual\n\nScopes: `cases:write`.\n\nOperation: `createIndividual`."
              },
              "response": []
            },
            {
              "name": "Read an individual",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/individuals/{{individualId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "individuals",
                    "{{individualId}}"
                  ]
                },
                "description": "Read an individual\n\nScopes: `cases:read`.\n\nOperation: `getIndividual`."
              },
              "response": []
            },
            {
              "name": "Update an individual",
              "request": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "The subject's ETag; a mismatch returns 412"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/individuals/{{individualId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "individuals",
                    "{{individualId}}"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"external_ref\": \"string\",\n  \"is_primary\": false,\n  \"role\": \"borrower\",\n  \"title\": \"mr\",\n  \"first_name\": \"string\",\n  \"middle_name\": \"string\",\n  \"surname\": \"string\",\n  \"date_of_birth\": \"2026-01-31\",\n  \"gender\": \"male\",\n  \"nationality\": \"string\",\n  \"country_of_birth\": \"string\",\n  \"residence_country\": \"string\",\n  \"email\": \"string\",\n  \"phone\": \"string\",\n  \"address\": {\n    \"country\": \"string\",\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"postcode\": \"string\"\n  },\n  \"previous_addresses\": [\n    {\n      \"country\": \"string\",\n      \"line1\": \"string\",\n      \"line2\": \"string\",\n      \"city\": \"string\",\n      \"postcode\": \"string\",\n      \"from\": \"2026-01-31\",\n      \"to\": \"2026-01-31\"\n    }\n  ],\n  \"passport_number\": \"string\",\n  \"source_of_funds\": {\n    \"mode\": \"invite\"\n  },\n  \"bank_account\": {\n    \"sort_code\": \"string\",\n    \"account_number\": \"string\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update an individual\n\nScopes: `cases:write`.\n\nOperation: `updateIndividual`."
              },
              "response": []
            },
            {
              "name": "Remove an individual (and its ownerships)",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "The subject's ETag; a mismatch returns 412"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/individuals/{{individualId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "individuals",
                    "{{individualId}}"
                  ]
                },
                "description": "Remove an individual (and its ownerships)\n\nScopes: `cases:write`.\n\nOperation: `deleteIndividual`."
              },
              "response": []
            },
            {
              "name": "Add a company",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/companies",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "companies"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"company_name\": \"string\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Add a company\n\nScopes: `cases:write`.\n\nOperation: `createCompany`."
              },
              "response": []
            },
            {
              "name": "Read a company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/companies/{{companyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "companies",
                    "{{companyId}}"
                  ]
                },
                "description": "Read a company\n\nScopes: `cases:read`.\n\nOperation: `getCompany`."
              },
              "response": []
            },
            {
              "name": "Update a company",
              "request": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "The subject's ETag; a mismatch returns 412"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/companies/{{companyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "companies",
                    "{{companyId}}"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"external_ref\": \"string\",\n  \"role\": \"borrower\",\n  \"company_name\": \"string\",\n  \"company_number\": \"string\",\n  \"jurisdiction\": \"string\",\n  \"address\": {\n    \"country\": \"string\",\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"postcode\": \"string\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update a company\n\nScopes: `cases:write`.\n\nOperation: `updateCompany`."
              },
              "response": []
            },
            {
              "name": "Remove a company (and its ownerships)",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "The subject's ETag; a mismatch returns 412"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/companies/{{companyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "companies",
                    "{{companyId}}"
                  ]
                },
                "description": "Remove a company (and its ownerships)\n\nScopes: `cases:write`.\n\nOperation: `deleteCompany`."
              },
              "response": []
            },
            {
              "name": "Add a property",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/properties",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "properties"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"address\": {\n    \"line1\": \"string\",\n    \"city\": \"string\",\n    \"postcode\": \"string\"\n  },\n  \"asset_type\": \"residential\",\n  \"tenure\": \"freehold\",\n  \"charge_type\": \"first\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Add a property\n\nScopes: `cases:write`.\n\nOperation: `createProperty`."
              },
              "response": []
            },
            {
              "name": "Read a property",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/properties/{{propertyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "properties",
                    "{{propertyId}}"
                  ]
                },
                "description": "Read a property\n\nScopes: `cases:read`.\n\nOperation: `getProperty`."
              },
              "response": []
            },
            {
              "name": "Update a property",
              "request": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "The subject's ETag; a mismatch returns 412"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/properties/{{propertyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "properties",
                    "{{propertyId}}"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"external_ref\": \"string\",\n  \"address\": {\n    \"country\": \"string\",\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"postcode\": \"string\"\n  },\n  \"uprn\": \"string\",\n  \"asset_type\": \"residential\",\n  \"property_type\": \"flat\",\n  \"tenure\": \"freehold\",\n  \"tenure_unexpired_years\": 0,\n  \"num_rooms\": 0,\n  \"floor_area_sqft\": 1,\n  \"charge_type\": \"first\",\n  \"first_charge_amount_gbp\": 0,\n  \"first_charge_lender\": \"string\",\n  \"purchase_price_gbp\": 0,\n  \"asking_price_gbp\": 0,\n  \"estimated_value_gbp\": 0,\n  \"units_in_building\": 0,\n  \"units\": [\n    {\n      \"label\": \"string\",\n      \"beds\": 0,\n      \"area_sqm\": 0,\n      \"epc\": \"string\",\n      \"rent_pcm_gbp\": 0,\n      \"value_gbp\": 0\n    }\n  ],\n  \"target_rent_pcm_gbp\": 0,\n  \"service_charge_ground_rent_gbp\": 0,\n  \"maintenance_costs_gbp\": 0,\n  \"development_type\": \"residential\",\n  \"proposed_units\": 0,\n  \"planning_status\": \"none\",\n  \"estimated_build_costs_gbp\": 0,\n  \"year_built\": 0,\n  \"condition\": \"excellent\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update a property\n\nScopes: `cases:write`.\n\nOperation: `updateProperty`."
              },
              "response": []
            },
            {
              "name": "Remove a property",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "If-Match",
                    "value": "",
                    "type": "text",
                    "disabled": true,
                    "description": "The subject's ETag; a mismatch returns 412"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/properties/{{propertyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "properties",
                    "{{propertyId}}"
                  ]
                },
                "description": "Remove a property\n\nScopes: `cases:write`.\n\nOperation: `deleteProperty`."
              },
              "response": []
            },
            {
              "name": "Link an individual to a company",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/ownerships",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "ownerships"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"individual_id\": \"{{individualId}}\",\n  \"company_id\": \"{{companyId}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Link an individual to a company\n\nScopes: `cases:write`.\n\nOperation: `createOwnership`."
              },
              "response": []
            },
            {
              "name": "Unlink an individual from a company",
              "request": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/ownerships?individual_id={{individualId}}&company_id={{companyId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "ownerships"
                  ],
                  "query": [
                    {
                      "key": "individual_id",
                      "value": "{{individualId}}",
                      "description": "The individual of the link"
                    },
                    {
                      "key": "company_id",
                      "value": "{{companyId}}",
                      "description": "The company of the link"
                    }
                  ]
                },
                "description": "Unlink an individual from a company\n\nScopes: `cases:write`.\n\nOperation: `deleteOwnership`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "transcripts",
          "description": "Call transcripts pushed server-to-server (v1.1), used by the borrower_call step. Untrusted text: sanitised, pseudonymised, never returned.",
          "item": [
            {
              "name": "List a case's call transcripts (metadata only)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/call-transcripts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "call-transcripts"
                  ]
                },
                "description": "List a case's call transcripts (metadata only)\n\nScopes: `cases:read`.\n\nOperation: `listCallTranscripts`."
              },
              "response": []
            },
            {
              "name": "Push a call transcript (used by the borrower_call step)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/call-transcripts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "call-transcripts"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"text\": \"string\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Push a call transcript (used by the borrower_call step)\n\nScopes: `cases:write`.\n\nOperation: `createCallTranscript`."
              },
              "response": []
            },
            {
              "name": "Read a call transcript's metadata",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/call-transcripts/{{transcriptId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "call-transcripts",
                    "{{transcriptId}}"
                  ]
                },
                "description": "Read a call transcript's metadata\n\nScopes: `cases:read`.\n\nOperation: `getCallTranscript`."
              },
              "response": []
            },
            {
              "name": "Delete a call transcript",
              "request": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/call-transcripts/{{transcriptId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "call-transcripts",
                    "{{transcriptId}}"
                  ]
                },
                "description": "Delete a call transcript\n\nScopes: `cases:write`.\n\nOperation: `deleteCallTranscript`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "documents",
          "description": "Documents such as the RICS valuation report.",
          "item": [
            {
              "name": "List a case's documents and their scan status",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/documents",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "documents"
                  ]
                },
                "description": "List a case's documents and their scan status\n\nScopes: `cases:read`.\n\nOperation: `listDocuments`."
              },
              "response": []
            },
            {
              "name": "Upload a document (malware-scanned before use)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/documents",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "documents"
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": [],
                      "description": "PDF, JPEG or PNG, at most 25 MB"
                    },
                    {
                      "key": "document_type",
                      "value": "valuation_report",
                      "type": "text",
                      "description": "valuation_report is the RICS valuation used for LTV"
                    },
                    {
                      "key": "external_ref",
                      "value": "string",
                      "type": "text",
                      "disabled": true,
                      "description": "Your record id"
                    }
                  ]
                },
                "description": "Upload a document (malware-scanned before use)\n\nScopes: `documents:write`.\n\nOperation: `uploadDocument`."
              },
              "response": []
            },
            {
              "name": "Download a document you uploaded (streamed)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/documents/{{documentId}}/content",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "documents",
                    "{{documentId}}",
                    "content"
                  ]
                },
                "description": "Download a document you uploaded (streamed)\n\nScopes: `cases:read`.\n\nOperation: `getDocumentContent`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "lookups",
          "description": "Address and UPRN lookup.",
          "item": [
            {
              "name": "Address and UPRN candidates for a UK postcode",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/lookups/addresses?postcode=string",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "lookups",
                    "addresses"
                  ],
                  "query": [
                    {
                      "key": "postcode",
                      "value": "string",
                      "description": "UK postcode"
                    },
                    {
                      "key": "line1",
                      "value": "string",
                      "disabled": true,
                      "description": "Narrows to one address (and its UPRN)"
                    }
                  ]
                },
                "description": "Address and UPRN candidates for a UK postcode\n\nScopes: `lookups:read`.\n\nOperation: `lookupAddresses`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "assessments",
          "description": "Quotes and assessments (runs of WALT's checks).",
          "item": [
            {
              "name": "Quote an assessment: cost, per-subject reuse plan, missing data (free)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/assessments/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "assessments",
                    "quote"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"mode\": \"incremental\",\n  \"checks\": {\n    \"exclude\": [\n      \"string\"\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Quote an assessment: cost, per-subject reuse plan, missing data (free)\n\nScopes: `assessments:write`.\n\nOperation: `quoteAssessment`."
              },
              "response": []
            },
            {
              "name": "List a case's assessments (newest first, cursor pagination)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/assessments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "assessments"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "50",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "string",
                      "disabled": true,
                      "description": "next_cursor of the previous page"
                    }
                  ]
                },
                "description": "List a case's assessments (newest first, cursor pagination)\n\nScopes: `assessments:read`.\n\nOperation: `listAssessments`."
              },
              "response": []
            },
            {
              "name": "Start an assessment (asynchronous)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation; reuse it on retries"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/cases/{{caseId}}/assessments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "cases",
                    "{{caseId}}",
                    "assessments"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"mode\": \"incremental\",\n  \"checks\": {\n    \"exclude\": [\n      \"string\"\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Start an assessment (asynchronous)\n\nScopes: `assessments:write`.\n\nOperation: `startAssessment`."
              },
              "response": []
            },
            {
              "name": "Status, progress, pending actions and billing of an assessment",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/assessments/{{assessmentId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "assessments",
                    "{{assessmentId}}"
                  ]
                },
                "description": "Status, progress, pending actions and billing of an assessment\n\nScopes: `assessments:read`.\n\nOperation: `getAssessment`."
              },
              "response": []
            },
            {
              "name": "Cancel a queued or running assessment",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/assessments/{{assessmentId}}/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "assessments",
                    "{{assessmentId}}",
                    "cancel"
                  ]
                },
                "description": "Stops the assessment before its next provider call. Charged only if a\nprovider had already been called; no cooldown applies. An assessment that\nis not being processed is cancelled at once; one in progress stops at its\nnext checkpoint (``cancel_requested: true`` until then — keep polling). An\nassessment that already finished is returned unchanged.\n\nScopes: `assessments:write`.\n\nOperation: `cancelAssessment`."
              },
              "response": []
            },
            {
              "name": "The Decision of an assessment (advisory; a person decides)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/assessments/{{assessmentId}}/decision",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "assessments",
                    "{{assessmentId}}",
                    "decision"
                  ]
                },
                "description": "The Decision of an assessment (advisory; a person decides)\n\nScopes: `assessments:read`.\n\nOperation: `getDecision`."
              },
              "response": []
            },
            {
              "name": "Derived per-check results (no raw vendor data)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/assessments/{{assessmentId}}/checks",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "assessments",
                    "{{assessmentId}}",
                    "checks"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "100",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "string",
                      "disabled": true,
                      "description": "next_cursor of the previous page"
                    }
                  ]
                },
                "description": "Derived per-check results (no raw vendor data)\n\nScopes: `assessments:read`.\n\nOperation: `listCheckResults`."
              },
              "response": []
            },
            {
              "name": "The PDF report, streamed (no redirect, no link to store)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/pdf",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/assessments/{{assessmentId}}/report",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "assessments",
                    "{{assessmentId}}",
                    "report"
                  ]
                },
                "description": "Rendered from this assessment's stored results with no provider, LLM\nor network call, without vendor appendices, and returned directly in the\nresponse body (no redirect to a short-lived link). Needs ``pii:read`` as\nwell as ``reports:read`` (the report contains unminimised personal data).\nConcurrent renders are limited: 429 with Retry-After when busy.\n\nScopes: `reports:read`, `pii:read`.\n\nOperation: `getReport`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "webhooks",
          "description": "Signed webhook endpoints (HMAC-SHA256 `WALT-Signature`), test ping, secret rotation and the delivery log.",
          "item": [
            {
              "name": "List webhook endpoints",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints"
                  ]
                },
                "description": "List webhook endpoints\n\nScopes: `webhooks:manage`.\n\nOperation: `listWebhookEndpoints`."
              },
              "response": []
            },
            {
              "name": "Register a webhook endpoint",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "type": "text",
                    "description": "UUID v4, one per logical operation"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"string\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Register a webhook endpoint\n\nScopes: `webhooks:manage`.\n\nOperation: `createWebhookEndpoint`."
              },
              "response": []
            },
            {
              "name": "Get a webhook endpoint",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints/{{endpointId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints",
                    "{{endpointId}}"
                  ]
                },
                "description": "Get a webhook endpoint\n\nScopes: `webhooks:manage`.\n\nOperation: `getWebhookEndpoint`."
              },
              "response": []
            },
            {
              "name": "Update, disable or re-enable a webhook endpoint",
              "request": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints/{{endpointId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints",
                    "{{endpointId}}"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"string\",\n  \"events\": [\n    \"assessment.completed\"\n  ],\n  \"description\": \"string\",\n  \"status\": \"active\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update, disable or re-enable a webhook endpoint\n\nScopes: `webhooks:manage`.\n\nOperation: `updateWebhookEndpoint`."
              },
              "response": []
            },
            {
              "name": "Delete a webhook endpoint",
              "request": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints/{{endpointId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints",
                    "{{endpointId}}"
                  ]
                },
                "description": "Delete a webhook endpoint\n\nScopes: `webhooks:manage`.\n\nOperation: `deleteWebhookEndpoint`."
              },
              "response": []
            },
            {
              "name": "Send a ping event now",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints/{{endpointId}}/test",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints",
                    "{{endpointId}}",
                    "test"
                  ]
                },
                "description": "Send a ping event now\n\nScopes: `webhooks:manage`.\n\nOperation: `testWebhookEndpoint`."
              },
              "response": []
            },
            {
              "name": "Rotate the signing secret (both secrets sign for 24 h)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints/{{endpointId}}/rotate-secret",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints",
                    "{{endpointId}}",
                    "rotate-secret"
                  ]
                },
                "description": "Rotate the signing secret (both secrets sign for 24 h)\n\nScopes: `webhooks:manage`.\n\nOperation: `rotateWebhookSecret`."
              },
              "response": []
            },
            {
              "name": "Delivery log of an endpoint (newest first)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/webhook-endpoints/{{endpointId}}/deliveries",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "webhook-endpoints",
                    "{{endpointId}}",
                    "deliveries"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "string",
                      "disabled": true,
                      "description": "pending | failed | succeeded | dead"
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "string",
                      "disabled": true
                    }
                  ]
                },
                "description": "Delivery log of an endpoint (newest first)\n\nScopes: `webhooks:manage`.\n\nOperation: `listWebhookDeliveries`."
              },
              "response": []
            }
          ]
        },
        {
          "name": "events",
          "description": "The event log of the last 7 days, for reconciliation.",
          "item": [
            {
              "name": "Event log of the last 7 days (reconciliation)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/events",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "events"
                  ],
                  "query": [
                    {
                      "key": "since",
                      "value": "string",
                      "disabled": true,
                      "description": "ISO 8601; at most 7 days ago (older values are clamped)"
                    },
                    {
                      "key": "type",
                      "value": "string",
                      "disabled": true,
                      "description": "Only this event type"
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "string",
                      "disabled": true
                    }
                  ]
                },
                "description": "Event log of the last 7 days (reconciliation)\n\nScopes: `assessments:read`.\n\nOperation: `listEvents`."
              },
              "response": []
            }
          ]
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://dev-api.underwritinguk.ai/v1",
      "type": "string",
      "description": "Intended sandbox host by default: set the base URL from your onboarding email in your environment. Production (by arrangement): https://api.underwritinguk.ai/v1"
    },
    {
      "key": "clientId",
      "value": "",
      "type": "string",
      "description": "Set in your environment, not here."
    },
    {
      "key": "clientSecret",
      "value": "",
      "type": "string",
      "description": "Set in your environment as a SECRET variable, not here."
    },
    {
      "key": "scope",
      "value": "",
      "type": "string",
      "description": "Optional, space-separated (e.g. \"cases:write assessments:write assessments:read reports:read\"). Empty = every scope granted to the credential."
    },
    {
      "key": "accessToken",
      "value": "",
      "type": "string",
      "description": "Managed by the collection pre-request script."
    },
    {
      "key": "accessTokenExpiresAt",
      "value": "0",
      "type": "string",
      "description": "Epoch ms; managed by the pre-request script."
    },
    {
      "key": "personaSurname",
      "value": "Approve",
      "type": "string",
      "description": "Sandbox test persona: Approve, Conditions, Refer, Decline, Sanctions, Pep, Idvpending, Idvfail, Outage, Slow."
    },
    {
      "key": "externalRef",
      "value": "",
      "type": "string",
      "description": "Set per run by \"3. Create the case\"."
    },
    {
      "key": "caseId",
      "value": "",
      "type": "string"
    },
    {
      "key": "assessmentId",
      "value": "",
      "type": "string"
    },
    {
      "key": "individualId",
      "value": "",
      "type": "string",
      "description": "Path parameter: set it from an earlier response."
    },
    {
      "key": "companyId",
      "value": "",
      "type": "string",
      "description": "Path parameter: set it from an earlier response."
    },
    {
      "key": "propertyId",
      "value": "",
      "type": "string",
      "description": "Path parameter: set it from an earlier response."
    },
    {
      "key": "transcriptId",
      "value": "",
      "type": "string",
      "description": "Path parameter: set it from an earlier response."
    },
    {
      "key": "documentId",
      "value": "",
      "type": "string",
      "description": "Path parameter: set it from an earlier response."
    },
    {
      "key": "endpointId",
      "value": "",
      "type": "string",
      "description": "Path parameter: set it from an earlier response."
    }
  ]
}
