{"info":{"_postman_id":"add258fa-d2da-44f1-a049-e8e7efa6f74a","name":"Global Data Integration","description":"<html><head></head><body><h1 id=\"trustate-global-data-integration-gdi-production-api\">Trustate Global Data Integration (GDI) — Production API</h1>\n<p>Production endpoints for the Trustate Global Data Integration lambda. Use these endpoints to create and update matter records, contacts, assets, and liabilities from your own system.</p>\n<p><strong>Base URL:</strong> <code>https://services.trustate.com/integrations/global-data</code></p>\n<h2 id=\"authentication\">Authentication</h2>\n<p>All routes require two headers:</p>\n<ul>\n<li><code>X-PUBLIC-TOKEN</code> — your public token</li>\n<li><code>X-PRIVATE-KEY</code> — your private key (treat like a password)</li>\n</ul>\n<p>See the <strong>Verify Auth</strong> request for credential setup steps.</p>\n<h2 id=\"endpoints\">Endpoints</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Path</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>GET</td>\n<td><code>/integrations/global-data</code></td>\n<td>Verify credentials, returns API info</td>\n</tr>\n<tr>\n<td>POST</td>\n<td><code>/integrations/global-data/import</code></td>\n<td>Create a new matter record</td>\n</tr>\n<tr>\n<td>PUT</td>\n<td><code>/integrations/global-data/import</code></td>\n<td>Partial update of an existing COMPLETED matter</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"identifying-records-the-source--externalid-dedup-key\">Identifying records: the (source + externalId) dedup key</h2>\n<p>In production, records are identified by the <strong>combination</strong> of <code>IntegrationContext.source</code> and <code>IntegrationContext.externalId</code>. The same <code>externalId</code> may be reused under a different <code>source</code> without collision.</p>\n<h3 id=\"multi-firm-partners\">Multi-firm partners</h3>\n<p>If you serve multiple end-firms and your internal IDs are scoped per firm (so the same <code>externalId</code> could repeat across firms), pick <strong>one</strong> of the following patterns:</p>\n<ul>\n<li><strong>Option A — Different <code>source</code> per end-firm.</strong> Example: <code>source: \"acme-firm-alpha\"</code>, <code>source: \"acme-firm-beta\"</code>.</li>\n<li><strong>Option B — Firm identifier inside <code>externalId</code>.</strong> Example: <code>externalId: \"firm-alpha:matter-12345\"</code>.</li>\n</ul>\n<p>Either works. Pick one and apply it consistently.</p>\n<h2 id=\"duplicate-behavior-on-post-import\">Duplicate behavior on POST <code>/import</code></h2>\n<p>The duplicate check fires only when an existing record has status <code>COMPLETED</code>. Records in any other state do not block a new POST.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Prior record state</th>\n<th>Result</th>\n<th>HTTP code</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No prior record</td>\n<td>New record created (status begins as <code>PENDING</code>)</td>\n<td>201</td>\n</tr>\n<tr>\n<td><code>PENDING</code></td>\n<td>New record created (does not block)</td>\n<td>201</td>\n</tr>\n<tr>\n<td><code>FAILED</code></td>\n<td>New record created (does not block)</td>\n<td>201</td>\n</tr>\n<tr>\n<td><code>COMPLETED</code></td>\n<td>Rejected</td>\n<td>409</td>\n</tr>\n</tbody>\n</table>\n</div><p>To modify an existing <code>COMPLETED</code> record, use <code>PUT /import</code>.</p>\n<h2 id=\"updating-records-put-import\">Updating records: <code>PUT /import</code></h2>\n<p>Use PUT to update a previously COMPLETED matter. PUT is a <strong>partial update</strong> — only fields included in the payload are written; omitted fields are preserved.</p>\n<blockquote>\n<p>⚠️ <strong>Important — wholesale-replace behavior for the three arrays.</strong> When <code>Contacts</code>, <code>Assets</code>, or <code>Liabilities</code> is included in a PUT and is <strong>non-empty</strong>, that array is replaced wholesale; items previously in the array are removed. To leave an array untouched, omit it from the payload or send it as an empty array (<code>[]</code>) — both are treated as no-op. There is no way to clear an array via PUT.</p>\n</blockquote>\n<h3 id=\"whats-required-on-put\">What's required on PUT</h3>\n<ul>\n<li><code>IntegrationContext.externalId</code> and <code>IntegrationContext.source</code> (lookup keys)</li>\n<li>At least one of <code>Matter</code>, <code>Contacts</code>, <code>Assets</code>, <code>Liabilities</code>, or <code>DataFields</code>, and it must be non-empty</li>\n</ul>\n<p>Unlike POST, <code>Matter.displayFirstName</code> and <code>Matter.displayLastName</code> are <strong>not</strong> required on PUT.</p>\n<h3 id=\"status-precondition\">Status precondition</h3>\n<p>PUT only matches records whose <code>IntegrationContext.status</code> is <code>COMPLETED</code>. If the matching record is still <code>PENDING</code> or has <code>FAILED</code>, PUT returns <strong>404</strong>.</p>\n<h2 id=\"datafields\">DataFields</h2>\n<p>Download the latest DataFields schema <a href=\"https://public-access-admin-docs.s3.us-east-2.amazonaws.com/Trustate-GDI-DataFields.json\">here</a>. DataFields keys must be non-empty and must not contain dots.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Trustate Global Data Integration (GDI) — Production API","slug":"trustate-global-data-integration-gdi-production-api"}],"owner":"25122243","collectionId":"add258fa-d2da-44f1-a049-e8e7efa6f74a","publishedId":"2sBXViiqeR","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-01-21T15:58:46.000Z"},"item":[{"name":"Verify Auth","id":"28d577f8-529b-4c96-a16e-efb6a544b475","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"X-PUBLIC-TOKEN","value":""},{"key":"X-PRIVATE-KEY","value":""}],"url":"https://services.trustate.com/integrations/global-data","description":"<h1 id=\"get-integrationsglobal-data\">GET <code>/integrations/global-data</code></h1>\n<p>Returns API info and confirms the supplied credentials are valid. Useful for sanity-checking your token + key pair before sending real imports.</p>\n<h2 id=\"generate-api-credentials-public-token--private-key\">Generate API credentials (Public Token + Private Key)</h2>\n<ol>\n<li><strong>Go to Account Page</strong> — from the Trustate portal, click on your name in the top right and select <strong>Account.</strong></li>\n<li><strong>Create a GDI Access Token</strong><ol>\n<li>Scroll to the <strong>Access Tokens</strong> section and click <strong>+ New Access Token</strong>.</li>\n<li>In the modal:<ul>\n<li><strong>Token Name</strong>: a descriptive name</li>\n<li><strong>Permission</strong>: <strong>All</strong></li>\n<li><strong>Scope</strong>: <strong>Global Data Integration</strong></li>\n<li><strong>Is token specific to your user account?</strong>: as needed</li>\n</ul>\n</li>\n</ol>\n</li>\n<li><strong>Save the token values</strong><ul>\n<li><strong>Public Token</strong> — visible in the Access Tokens table</li>\n<li><strong>Private Key</strong> — used as the paired secret in requests (only visible once)</li>\n</ul>\n</li>\n</ol>\n<p>Treat the Private Key like a password. Store it in a secrets manager or environment variables. Never commit it to source control.</p>\n","urlObject":{"protocol":"https","path":["integrations","global-data"],"host":["services","trustate","com"],"query":[],"variable":[]}},"response":[{"id":"6a5537bb-a251-4d6a-93d8-898079a8f06e","name":"200 OK — Success","originalRequest":{"method":"GET","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"url":"https://services.trustate.com/integrations/global-data"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"data\": {\n        \"message\": \"Global Data Integration API\",\n        \"version\": \"1.0.0\",\n        \"authenticatedWithPublicToken\": \"<your public token, echoed back>\"\n    }\n}"},{"id":"e06bac0e-4c44-453f-8323-b940335fdfad","name":"401 Unauthorized — Auth Failed","originalRequest":{"method":"GET","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":"a"},{"key":"X-PRIVATE-KEY","type":"text","value":"b"}],"url":"https://services.trustate.com/integrations/global-data"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Authentication failed\"\n}"}],"_postman_id":"28d577f8-529b-4c96-a16e-efb6a544b475"},{"name":"Import Data (POST) — Create","id":"052d9bf8-868c-4cf2-9f6e-f276463afecc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-PUBLIC-TOKEN","value":""},{"key":"X-PRIVATE-KEY","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\n    \"externalId\": \"ext-12345-abc-8\",\n    \"source\": \"xyz\"\n  },\n  \"Matter\": {\n    \"matterType\": \"ESTATE_ADMINISTRATION\",\n    \"displayFirstName\": \"John\",\n    \"displayLastName\": \"Doe\",\n    \"decedent\": {\n      \"firstName\": \"John\",\n      \"lastName\": \"Smith\",\n      \"middleName\": \"Soe\",\n      \"dateOfBirth\": \"1950-01-15T00:00:00Z\",\n      \"dateOfDeath\": \"2024-01-01T00:00:00Z\",\n      \"ssn\": \"123-45-6789\",\n      \"address\": {\"street\": \"123 Main Street\", \"city\": \"San Francisco\", \"state\": \"CA\", \"zip\": \"12345\"}\n    },\n    \"client\": {\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Doe\",\n      \"middleName\": \"Marie\",\n      \"emailAddress\": \"jane.doe@example.com\",\n      \"phoneNumber\": \"(555) 123-4567\",\n      \"ssn\": \"987-65-4321\",\n      \"dateOfBirth\": \"1975-03-20T00:00:00Z\",\n      \"isMarried\": true,\n      \"address\": {\"street\": \"456 Oak Avenue\", \"city\": \"Los Angeles\", \"state\": \"CA\", \"zip\": \"90001\"}\n    },\n    \"spouse\": {\n      \"firstName\": \"Mary\",\n      \"lastName\": \"Smith\",\n      \"middleName\": \"Elizabeth\",\n      \"emailAddress\": \"mary.smith@example.com\",\n      \"ssn\": \"222-33-4444\",\n      \"dateOfBirth\": \"1952-07-20T00:00:00Z\"\n    }\n  },\n  \"Contacts\": [\n    {\n      \"firstName\": \"Robert\",\n      \"lastName\": \"Smith\",\n      \"middleName\": \"James\",\n      \"dateOfBirth\": \"1975-06-15T00:00:00Z\",\n      \"email\": \"robert.smith@example.com\",\n      \"phoneNumber\": \"(555) 123-4567\",\n      \"relationship\": \"Child\",\n      \"isSuccessor\": true,\n      \"notes\": \"Primary beneficiary and successor trustee.\"\n    }\n  ],\n  \"Assets\": [\n    {\n      \"assetType\": \"REAL_PROPERTY\",\n      \"assetDescription\": \"Primary Residence - 123 Main St\",\n      \"initialValue\": 750000,\n      \"initialValueDate\": \"2024-01-01T00:00:00Z\",\n      \"currentValue\": 750000,\n      \"currentValueDate\": \"2024-01-01T00:00:00Z\",\n      \"lifetimeHolding\": \"SOLE\",\n      \"distributionType\": \"PROBATE\",\n      \"canIncludeInTaxableEstate\": true,\n      \"category\": \"RECEIPT\",\n      \"allocateTo\": \"PRINCIPAL\"\n    }\n  ],\n  \"Liabilities\": [\n    {\n      \"liabilityName\": \"Mortgage - Wells Fargo\",\n      \"liabilityDescription\": \"Home mortgage on primary residence\",\n      \"balance\": 245000,\n      \"interestRate\": 3.75,\n      \"status\": \"UNPAID\",\n      \"category\": \"DEBTS_OF_DECEDENT_DISBURSEMENT\",\n      \"allocateTo\": \"PRINCIPAL\"\n    }\n  ],\n  \"DataFields\": {\n    \"caseManagerName\": \"Bob Smith\",\n    \"referralSource\": \"attorney\"\n  }\n}\n","options":{"raw":{"language":"json"}}},"url":"https://services.trustate.com/integrations/global-data/import","description":"<h1 id=\"post-integrationsglobal-dataimport--create-a-matter\">POST <code>/integrations/global-data/import</code> — Create a matter</h1>\n<p>Create a new matter record. For updating an existing matter, use the PUT version of this endpoint.</p>\n<h2 id=\"authentication-headers\">Authentication headers</h2>\n<ul>\n<li><code>X-PUBLIC-TOKEN</code> — your public token</li>\n<li><code>X-PRIVATE-KEY</code> — your private key</li>\n</ul>\n<h2 id=\"dedup-key-source--externalid\">Dedup key: <code>source</code> + <code>externalId</code></h2>\n<p>A record is uniquely identified by the <strong>combination</strong> of <code>IntegrationContext.source</code> and <code>IntegrationContext.externalId</code>. The same <code>externalId</code> may be reused under a different <code>source</code> without collision.</p>\n<p><strong>Multi-firm partners — pick one:</strong></p>\n<ul>\n<li><strong>Option A:</strong> Different <code>source</code> per end-firm (e.g. <code>source: \"acme-firm-alpha\"</code>).</li>\n<li><strong>Option B:</strong> Firm identifier inside <code>externalId</code> (e.g. <code>externalId: \"firm-alpha:matter-12345\"</code>).</li>\n</ul>\n<h2 id=\"duplicate-behavior-post\">Duplicate behavior (POST)</h2>\n<p>Duplicate-rejection fires only against <code>COMPLETED</code> records. PENDING and FAILED records do not block a new POST.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Prior record state</th>\n<th>Result</th>\n<th>HTTP code</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No prior record</td>\n<td>New record created</td>\n<td>201</td>\n</tr>\n<tr>\n<td><code>PENDING</code></td>\n<td>New record created (does not block)</td>\n<td>201</td>\n</tr>\n<tr>\n<td><code>FAILED</code></td>\n<td>New record created (does not block)</td>\n<td>201</td>\n</tr>\n<tr>\n<td><code>COMPLETED</code></td>\n<td>Rejected</td>\n<td>409</td>\n</tr>\n</tbody>\n</table>\n</div><p>To modify an existing <code>COMPLETED</code> record, use <code>PUT /import</code>.</p>\n<h2 id=\"required-fields\">Required fields</h2>\n<ul>\n<li><code>IntegrationContext.externalId</code> (non-empty string)</li>\n<li><code>IntegrationContext.source</code> (non-empty string)</li>\n<li><code>Matter.displayFirstName</code> (non-empty string)</li>\n<li><code>Matter.displayLastName</code> (non-empty string)</li>\n</ul>\n<p>All other fields are optional.</p>\n<h2 id=\"payload-format\">Payload format</h2>\n<p>JSON body containing:</p>\n<ul>\n<li><code>IntegrationContext</code> — <code>externalId</code> and <code>source</code></li>\n<li><code>Matter</code> — required <code>displayFirstName</code>/<code>displayLastName</code>; optional <code>matterType</code>, <code>decedent</code>, <code>client</code>, <code>ward</code>, <code>trust</code>, <code>trustee</code>, <code>spouse</code></li>\n<li><code>Contacts</code> (optional) — heirs, beneficiaries, family members, the client</li>\n<li><code>Assets</code> (optional) — estate assets</li>\n<li><code>Liabilities</code> (optional) — estate liabilities</li>\n<li><code>DataFields</code> (optional) — document drafting field values. Download the schema <a href=\"https://public-access-admin-docs.s3.us-east-2.amazonaws.com/Trustate-GDI-DataFields.json\">here</a>. Keys must be non-empty and contain no dots.</li>\n</ul>\n<h2 id=\"middlename-support\"><code>middleName</code> support</h2>\n<p><code>middleName</code> is accepted on <code>Matter.decedent</code>, <code>Matter.client</code>, <code>Matter.ward</code>, <code>Matter.trustee</code>, <code>Matter.spouse</code>, and <code>Contacts[]</code> entries.</p>\n<h2 id=\"matterclient-and-the-client-contact-post\"><code>Matter.client</code> and the Client contact (POST)</h2>\n<p>On POST, the downstream system creates a contact record from <code>Matter.client</code> tagged with <code>Relationship: Client</code>. You do not need to also send the client in <code>Contacts[]</code>. (For how this behaves on PUT, see the PUT request documentation.)</p>\n<p>Note: this contact-tagging is performed by the downstream system that processes the import, not by the import API itself.</p>\n<h2 id=\"contactsrelationship\"><code>Contacts[].relationship</code></h2>\n<p>Free-form string. No enum validation. Recommended values:</p>\n<ul>\n<li><code>Client</code></li>\n<li><code>Spouse</code></li>\n<li><code>Child</code></li>\n<li><code>Parent</code></li>\n<li><code>Sibling</code></li>\n<li><code>Heir</code></li>\n<li><code>Beneficiary</code></li>\n<li><code>Attorney</code></li>\n<li><code>Trustee</code></li>\n<li><code>Executor</code></li>\n</ul>\n<h2 id=\"response-codes\">Response codes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>201</td>\n<td>Created — see Success example</td>\n</tr>\n<tr>\n<td>400</td>\n<td>Validation error (missing required field, bad SSN format, invalid enum value, malformed JSON, etc.)</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Unauthorized — missing or invalid credentials</td>\n</tr>\n<tr>\n<td>409</td>\n<td>Conflict — record with this <code>(source, externalId)</code> already exists with status <code>COMPLETED</code></td>\n</tr>\n<tr>\n<td>500</td>\n<td>Internal error or downstream service failure</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"success-response-shape\">Success response shape</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": true,\n  \"data\": {\n    \"message\": \"Data imported successfully\",\n    \"importId\": \"&lt;estateImportId from downstream&gt;\"\n  }\n}\n</code></pre>\n<h2 id=\"field-reference\">Field reference</h2>\n<h3 id=\"integrationcontext-required\"><code>IntegrationContext</code> (required)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>externalId</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique within a given <code>source</code></td>\n</tr>\n<tr>\n<td><code>source</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Your integration name</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>No</td>\n<td>Ignored on POST — always overridden to <code>PENDING</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"matter-required\"><code>Matter</code> (required)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>displayFirstName</code></td>\n<td>string</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td><code>displayLastName</code></td>\n<td>string</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td><code>matterType</code></td>\n<td>enum: <code>ESTATE_ADMINISTRATION</code> | <code>ESTATE_PLANNING_FUNDING</code> | <code>TRUST_ADMINISTRATION</code> | <code>POA_GUARDIANSHIP</code></td>\n<td>No</td>\n</tr>\n<tr>\n<td><code>decedent</code>, <code>client</code>, <code>ward</code>, <code>trust</code>, <code>trustee</code>, <code>spouse</code></td>\n<td>objects</td>\n<td>No</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"assetsassettype-enum\"><code>Assets[].assetType</code> enum</h3>\n<p><code>ANNUITY</code>, <code>ART</code>, <code>BANK_ACCOUNT</code>, <code>BANK_ACCOUNT_CHECKING</code>, <code>BANK_ACCOUNT_MONEY_MARKET</code>, <code>BANK_ACCOUNT_SAVINGS</code>, <code>BOATS</code>, <code>BONDS</code>, <code>BUSINESSES</code>, <code>CD</code>, <code>CRYPTOCURRENCY</code>, <code>DIVIDEND</code>, <code>FIREARM</code>, <code>FOREIGN_ASSET</code>, <code>INHERITANCE</code>, <code>INTELLECTUAL_PROPERTY</code>, <code>INVESTMENT_ACCOUNT</code>, <code>LAND</code>, <code>LIFE_INSURANCE</code>, <code>MOTOR_VEHICLES</code>, <code>OTHER</code>, <code>OUTRIGHT_STOCK</code>, <code>PAYABLE</code>, <code>PENSION</code>, <code>REAL_PROPERTY</code>, <code>RECEIVABLE</code>, <code>RETIREMENT_ACCOUNT</code>, <code>SAFE_DEPOSIT_BOX</code>, <code>TANGIBLE_PERSONAL_PROPERTY</code>, <code>TRUST</code></p>\n<h3 id=\"assetslifetimeholding-enum\"><code>Assets[].lifetimeHolding</code> enum</h3>\n<p><code>IRREV_TRUST</code>, <code>JTWROS</code>, <code>NA</code>, <code>POD</code>, <code>REV_TRUST</code>, <code>SOLE</code>, <code>SPOUSE</code>, <code>TBE</code>, <code>TIC</code></p>\n<h3 id=\"liabilitiescategory-enum\"><code>Liabilities[].category</code> enum</h3>\n<p><code>ADMINISTRATION_EXPENSE_DISBURSEMENT</code>, <code>DEBTS_OF_DECEDENT_DISBURSEMENT</code>, <code>FEES_AND_COMMISSIONS_DISBURSEMENT</code>, <code>FUNERAL_EXPENSE_DISBURSEMENT</code>, <code>TAXES_DISBURSEMENT</code>, <code>DISTRIBUTION</code></p>\n<h3 id=\"format-rules\">Format rules</h3>\n<ul>\n<li><code>ssn</code>: <code>XXX-XX-XXXX</code></li>\n<li><code>address.state</code>: 2-letter uppercase (<code>CA</code>, <code>NY</code>, <code>TX</code>)</li>\n<li><code>address.zip</code>: 5 digits or <code>12345-6789</code></li>\n<li>All dates: ISO 8601 datetime</li>\n<li><code>notes</code> fields: max 5000 characters</li>\n<li><code>DataFields</code> keys: non-empty and must not contain <code>.</code></li>\n</ul>\n","urlObject":{"protocol":"https","path":["integrations","global-data","import"],"host":["services","trustate","com"],"query":[],"variable":[]}},"response":[{"id":"49a94be0-706f-40d8-b095-24b0cbc6bc35","name":"201 Created — Success","originalRequest":{"method":"POST","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"matterType\": \"ESTATE_ADMINISTRATION\", \"displayFirstName\": \"John\", \"displayLastName\": \"Doe\"}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Created","code":201,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"data\": {\n        \"message\": \"Data imported successfully\",\n        \"importId\": \"074b8ec3-583b-486e-b2f3-75a2f175a1f9\"\n    }\n}"},{"id":"e1d15702-60b5-4d34-aa17-0e8d587dd769","name":"400 Bad Request — Validation Error","originalRequest":{"method":"POST","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"matterType\": \"ESTATE_ADMINISTRATION\"}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Bad Request","code":400,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Invalid input: Matter.displayFirstName: displayFirstName is required; Matter.displayLastName: displayLastName is required\"\n}"},{"id":"e1d15702-60b5-4d34-aa17-0e8d587dd401","name":"401 Unauthorized — Auth Failed","originalRequest":{"method":"POST","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":"a"},{"key":"X-PRIVATE-KEY","type":"text","value":"b"}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"displayFirstName\": \"John\", \"displayLastName\": \"Doe\"}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Authentication failed\"\n}"},{"id":"0372d993-17e7-46ad-81d7-3f4c49b4f086","name":"409 Conflict — Already Imported (COMPLETED)","originalRequest":{"method":"POST","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-1\", \"source\": \"xyz\"},\n  \"Matter\": {\"displayFirstName\": \"John\", \"displayLastName\": \"Doe\"}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Conflict","code":409,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Import with source 'xyz' and externalId 'ext-12345-abc-1' already exists with status COMPLETED\"\n}"}],"_postman_id":"052d9bf8-868c-4cf2-9f6e-f276463afecc"},{"name":"Import Data (PUT) — Update","id":"854e2bd9-3f58-4ddb-ae65-f3ed2f7d3cbf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","value":""},{"key":"X-PRIVATE-KEY","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\n    \"externalId\": \"ext-12345-abc-8\",\n    \"source\": \"xyz\"\n  },\n  \"Matter\": {\n    \"decedent\": {\n      \"middleName\": \"Soe\"\n    },\n    \"client\": {\n      \"phoneNumber\": \"(555) 123-9999\",\n      \"address\": {\n        \"street\": \"789 New Street\",\n        \"city\": \"Los Angeles\",\n        \"state\": \"CA\",\n        \"zip\": \"90001\"\n      }\n    }\n  },\n  \"Contacts\": [\n    {\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Doe\",\n      \"middleName\": \"Marie\",\n      \"email\": \"jane.doe@example.com\",\n      \"phoneNumber\": \"(555) 123-9999\",\n      \"relationship\": \"Client\",\n      \"isSuccessor\": false,\n      \"notes\": \"Updated phone number; include this row on PUT to refresh the displayed Client contact.\"\n    },\n    {\n      \"firstName\": \"Robert\",\n      \"lastName\": \"Smith\",\n      \"middleName\": \"James\",\n      \"relationship\": \"Child\",\n      \"isSuccessor\": true\n    }\n  ],\n  \"DataFields\": {\n    \"caseManagerName\": \"Alice Brown\"\n  }\n}\n","options":{"raw":{"language":"json"}}},"url":"https://services.trustate.com/integrations/global-data/import","description":"<h1 id=\"put-integrationsglobal-dataimport--update-a-matter\">PUT <code>/integrations/global-data/import</code> — Update a matter</h1>\n<p>Partially update an existing matter. The record is identified by <code>IntegrationContext.source</code> + <code>IntegrationContext.externalId</code>. Only fields included in the payload are written; omitted fields are preserved.</p>\n<h2 id=\"status-precondition\">Status precondition</h2>\n<blockquote>\n<p>PUT only matches records whose <code>IntegrationContext.status</code> is <strong><code>COMPLETED</code></strong>. If the matching record is still <code>PENDING</code> or has <code>FAILED</code>, PUT returns <strong>404</strong>.</p>\n</blockquote>\n<h2 id=\"⚠️-array-behavior--wholesale-replace-when-non-empty\">⚠️ Array behavior — wholesale replace when non-empty</h2>\n<p>When the <code>Contacts</code>, <code>Assets</code>, or <code>Liabilities</code> field is present <strong>and non-empty</strong>, that array is <strong>replaced wholesale</strong> — items previously in the array are removed.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Payload contains</th>\n<th>Behavior</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Array omitted entirely</td>\n<td>Existing array preserved unchanged</td>\n</tr>\n<tr>\n<td>Array sent as <code>[]</code></td>\n<td>Existing array preserved unchanged (empty arrays are a no-op)</td>\n</tr>\n<tr>\n<td>Array sent with one or more items</td>\n<td>Existing array <strong>replaced</strong>; previous items are removed</td>\n</tr>\n</tbody>\n</table>\n</div><p>There is no way to clear an array (empty out all contacts/assets/liabilities) via PUT.</p>\n<h3 id=\"other-fields\">Other fields</h3>\n<ul>\n<li><strong><code>Matter</code></strong> — partial merge via dot-notation. Sending <code>Matter.decedent.middleName</code> updates only that field; other decedent fields are preserved.</li>\n<li><strong><code>DataFields</code></strong> — each top-level key is replaced wholesale; other keys are preserved.</li>\n<li><strong><code>IntegrationContext</code></strong> — <code>externalId</code> and <code>source</code> are lookup keys only. Any <code>status</code> field in the body is ignored.</li>\n</ul>\n<h2 id=\"authentication-headers\">Authentication headers</h2>\n<p>Same as POST:</p>\n<ul>\n<li><code>X-PUBLIC-TOKEN</code></li>\n<li><code>X-PRIVATE-KEY</code></li>\n</ul>\n<h2 id=\"required-fields\">Required fields</h2>\n<ul>\n<li><code>IntegrationContext.externalId</code> (non-empty string)</li>\n<li><code>IntegrationContext.source</code> (non-empty string)</li>\n<li>At least one of <code>Matter</code>, <code>Contacts</code>, <code>Assets</code>, <code>Liabilities</code>, or <code>DataFields</code>, and it must be non-empty</li>\n</ul>\n<p>Unlike POST, <code>Matter.displayFirstName</code> and <code>Matter.displayLastName</code> are <strong>not</strong> required on PUT. Inside <code>Matter</code>, every nested field is optional.</p>\n<h2 id=\"matterclient-versus-contacts-client-on-put\"><code>Matter.client</code> versus <code>Contacts[]</code> Client on PUT</h2>\n<p>The two paths behave differently when updating an existing matter:</p>\n<ul>\n<li><code>Matter.client</code> updates the matter-level client information only. It does <strong>not</strong> update the displayed Client contact record.</li>\n<li>To update the displayed Client contact on PUT, include the client in the <code>Contacts[]</code> array with <code>relationship: \"Client\"</code>. (Remember the wholesale-replace rule: if you include <code>Contacts[]</code>, every contact you want to keep must be present.)</li>\n</ul>\n<p>For most update flows, send both: keep <code>Matter.client</code> accurate <strong>and</strong> include a <code>Contacts[]</code> entry with <code>relationship: \"Client\"</code>. The example body for this request demonstrates this pattern.</p>\n<p>Note: the routing of <code>Matter.client</code> vs <code>Contacts[]</code> is implemented by the downstream system that processes updates, not by the import API itself.</p>\n<h2 id=\"middlename-support\"><code>middleName</code> support</h2>\n<p>Accepted on <code>Matter.decedent</code>, <code>Matter.client</code>, <code>Matter.ward</code>, <code>Matter.trustee</code>, <code>Matter.spouse</code>, and <code>Contacts[]</code> entries.</p>\n<h2 id=\"contactsrelationship\"><code>Contacts[].relationship</code></h2>\n<p>Free-form string. No enum validation. Recommended values: <code>Client</code>, <code>Spouse</code>, <code>Child</code>, <code>Parent</code>, <code>Sibling</code>, <code>Heir</code>, <code>Beneficiary</code>, <code>Attorney</code>, <code>Trustee</code>, <code>Executor</code>.</p>\n<h2 id=\"response-codes\">Response codes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>Updated successfully</td>\n</tr>\n<tr>\n<td>400</td>\n<td>Validation error, malformed JSON, or empty update (no updatable fields)</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Unauthorized — missing or invalid credentials</td>\n</tr>\n<tr>\n<td>404</td>\n<td>No <code>COMPLETED</code> record found for the given <code>(source, externalId)</code></td>\n</tr>\n<tr>\n<td>409</td>\n<td>Your update was superseded by a concurrent update and was not applied</td>\n</tr>\n<tr>\n<td>500</td>\n<td>Internal error</td>\n</tr>\n<tr>\n<td>502</td>\n<td>Downstream notification failed after the update was written</td>\n</tr>\n</tbody>\n</table>\n</div><p>The 502 response carries different messages depending on the rollback outcome:</p>\n<ul>\n<li><em>Rollback succeeded:</em> <code>Failed to update integration data — legacy notification failed and update was rolled back</code> (your update is not applied; safe to retry)</li>\n<li><em>Rollback was a no-op:</em> <code>Failed to update integration data — legacy notification failed; rollback was a no-op (concurrent update or deletion — cause unconfirmed; document state unknown)</code> (consider not retrying without inspecting state)</li>\n<li><em>Rollback failed:</em> <code>Failed to update integration data — legacy notification failed and rollback also failed; MongoDB has updated field values inconsistent with legacy service, retry is recommended</code> (retry is recommended)</li>\n</ul>\n<h2 id=\"success-response-shape\">Success response shape</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": true,\n  \"data\": {\n    \"message\": \"Data updated successfully\"\n  }\n}\n</code></pre>\n<p>Note: PUT does <strong>not</strong> return an <code>importId</code> in the response body. The matter is identified by your <code>(source, externalId)</code> pair.</p>\n<h2 id=\"payload-reference\">Payload reference</h2>\n<p>Same field set as POST (<code>IntegrationContext</code>, <code>Matter</code>, <code>Contacts</code>, <code>Assets</code>, <code>Liabilities</code>, <code>DataFields</code>), but every Matter field is optional and at least one updatable section must be present and non-empty. See the POST request for the full per-field reference.</p>\n","urlObject":{"protocol":"https","path":["integrations","global-data","import"],"host":["services","trustate","com"],"query":[],"variable":[]}},"response":[{"id":"2b4c9a8e-d79a-40e0-86b2-1b7e00129442","name":"200 OK — Updated","originalRequest":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"client\": {\"phoneNumber\": \"(555) 123-9999\"}}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"data\": {\n        \"message\": \"Data updated successfully\"\n    }\n}"},{"id":"b2c3d4e5-f6a7-4bcd-aef0-000000000400","name":"400 Bad Request — Empty Update","originalRequest":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Bad Request","code":400,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Invalid input: : At least one data field (Matter, Contacts, Assets, Liabilities, DataFields) must be provided and non-empty\"\n}"},{"id":"075f6568-3471-4212-bc44-ca6d414036cd","name":"401 Unauthorized — Auth Failed","originalRequest":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":"a"},{"key":"X-PRIVATE-KEY","type":"text","value":"b"}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"client\": {\"phoneNumber\": \"(555) 123-9999\"}}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Authentication failed\"\n}"},{"id":"c3d4e5f6-a7b8-4cde-bf01-000000000404","name":"404 Not Found — No COMPLETED record","originalRequest":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"does-not-exist\", \"source\": \"xyz\"},\n  \"Matter\": {\"client\": {\"phoneNumber\": \"(555) 123-9999\"}}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Not Found","code":404,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"No COMPLETED record found with externalId 'does-not-exist'\"\n}"},{"id":"d4e5f6a7-b8c9-4def-c012-000000000409","name":"409 Conflict — Superseded by Concurrent Update","originalRequest":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"client\": {\"phoneNumber\": \"(555) 123-9999\"}}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Conflict","code":409,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Failed to update integration data — your update was superseded by a concurrent update and was not applied; retry if your changes still need to be persisted\"\n}"},{"id":"e5f6a7b8-c9d0-4ef0-d123-000000000502","name":"502 Bad Gateway — Downstream notification failed","originalRequest":{"method":"PUT","header":[{"key":"X-PUBLIC-TOKEN","type":"text","value":""},{"key":"X-PRIVATE-KEY","type":"text","value":""}],"body":{"mode":"raw","raw":"{\n  \"IntegrationContext\": {\"externalId\": \"ext-12345-abc-8\", \"source\": \"xyz\"},\n  \"Matter\": {\"client\": {\"phoneNumber\": \"(555) 123-9999\"}}\n}"},"url":"https://services.trustate.com/integrations/global-data/import"},"status":"Bad Gateway","code":502,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"error\": \"Failed to update integration data — legacy notification failed and update was rolled back\"\n}"}],"_postman_id":"854e2bd9-3f58-4ddb-ae65-f3ed2f7d3cbf"}],"event":[{"listen":"prerequest","script":{"id":"2d0cc50a-fbd3-4ab9-b0b0-6d6d7b9165dc","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"ffb24ae5-e54d-46db-8ee1-522e61ed2281","type":"text/javascript","exec":[""]}}],"variable":[{"key":"GDI_PUBLIC_TOKEN_SANDBOX","value":""},{"key":"GDI_PRIVATE_KEY_SANDBOX","value":""},{"key":"GDI_PUBLIC_TOKEN_PROD","value":""},{"key":"GDI_PRIVATE_KEY_PROD","value":""},{"key":"GDI_PUBLIC_TOKEN","value":""},{"key":"GDI_PRIVATE_KEY","value":""}]}