{"info":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","description":"<html><head></head><body><h1 id=\"helm-v36-public-api\">Helm v3.6 — Public API</h1>\n<p><em>Last updated: 22 October 2026</em></p>\n<p><em>Helm is The Despatch Company's order, inventory and despatch platform.</em></p>\n<p>This collection documents every endpoint exposed by the Helm Public API. Each request includes a description, a list of accepted filters and body fields with their types, sort options, pagination notes, and at least one example response.</p>\n<h2 id=\"getting-started\">Getting started</h2>\n<ol>\n<li><p>Set the collection variable <code>base_url</code> to your tenant URL (e.g. <code>https://your-company.myhelm.app/public-api</code>).</p>\n</li>\n<li><p>Ask an Administrator to tick <strong>Enable API Access</strong> for your user in <strong>Settings → User Setup</strong> (see <em>API access</em> below). Then open the <strong>Auth → Login</strong> request and put your dashboard email and password into the JSON body. Run the request — on success the response token is automatically saved to the <code>auth_token</code> collection variable, and every other request is pre-configured to use it as a Bearer token.</p>\n</li>\n<li><p>From there you can run any other request directly. For requests that need a record ID (an order, an inventory item, etc.) update the corresponding placeholder collection variable (<code>order_id</code>, <code>inventory_id</code>, …) before sending.</p>\n</li>\n</ol>\n<h2 id=\"authentication\">Authentication</h2>\n<p>All endpoints (other than the login endpoint itself) require a valid JWT access token, sent as a Bearer token in the <code>Authorization</code> header:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer eyJhbGciOi...\n\n</code></pre><p>Tokens are issued by <code>POST /auth/login</code> and remain valid until invalidated by the server. To check whether a token is still good, call <code>GET /auth/verify</code>.</p>\n<h2 id=\"api-access\">API access</h2>\n<p>API access is switched on per user. An Administrator enables it in <strong>Settings → User Setup</strong> by ticking <strong>Enable API Access</strong> on the user, and only Administrator, Supervisor and Warehouse Operative users can have it. Users created after this setting was introduced start with API access off; users who were already Administrators, Supervisors or Warehouse Operatives when it was introduced were given API access.</p>\n<p>A Warehouse Operative with API access can log in, but only reaches the endpoints marked <strong>Warehouse Operative level or above</strong> (listing, viewing and confirming assemblies). Every other endpoint needs Supervisor level and returns <code>401</code> <code>Unsufficient Permissions for this user</code> to a Warehouse Operative.</p>\n<p>What an API user can see and change depends on how the user is set up:</p>\n<ul>\n<li>A user linked to a fulfilment client can only reach that fulfilment client's data. This is the user to give a fulfilment client for their own integration.</li>\n<li>A user that is not linked to a fulfilment client can reach every record on the account, including the data of every fulfilment client. Only give API access to such a user for your own staff or systems.</li>\n</ul>\n<p>Logging in as a user without API access returns <code>401</code> with <code>API access is not enabled for this user. Ask an administrator to enable it in User Setup.</code> Withdrawing API access, or lowering the user below Warehouse Operative, also stops tokens that were already issued to that user: their next request returns the same <code>401</code>.</p>\n<h2 id=\"permission-levels\">Permission levels</h2>\n<p>The API enforces user permission levels. Most endpoints require <strong>Supervisor</strong> level or above. A small number of administrative endpoints (user management) require <strong>Admin</strong> level. Some endpoints are blocked for fulfilment-client users — these are flagged in the request description with <code>Not available to fulfilment-client users</code>.</p>\n<h2 id=\"filter-syntax\">Filter syntax</h2>\n<p>List endpoints accept filters via query parameters using bracket notation:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /orders?filters[status][]=2&amp;filters[status][]=3\nGET /inventory?filters[search]=red widget&amp;filters[search_field]=search_product_name\n\n</code></pre><ul>\n<li><p>Single value: <code>filters[]=</code></p>\n</li>\n<li><p>Multiple values: <code>filters[][]=&amp;filters[][]=</code> (combined with OR within the field)</p>\n</li>\n<li><p>Multiple filters on the same request are combined with AND.</p>\n</li>\n<li><p>A handful of filters use literal separators inside a single value — the most common is the inventory <code>multiple_sku</code> filter which uses <code>||</code>, e.g. <code>filters[multiple_sku]=SKU-A||SKU-B||SKU-C</code>. These are called out per-endpoint where they apply.</p>\n</li>\n<li><p>Search filters use <code>|</code> (single pipe) to OR multiple terms inside one search box, e.g. <code>filters[search]=red|blue</code> matches records containing either term.</p>\n</li>\n</ul>\n<h2 id=\"pagination\">Pagination</h2>\n<p>Every list endpoint is paginated. Two parameter names are used across the API depending on the endpoint:</p>\n<ul>\n<li><p><code>page</code> — current page number, 1-based (always supported).</p>\n</li>\n<li><p><code>limit</code> (used by Orders) <strong>or</strong> <code>per_page</code> (used by everything else) — items per page. The exact name is documented on each endpoint.</p>\n</li>\n</ul>\n<p>List responses are wrapped:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"total\": 1280,\n  \"per_page\": 50,\n  \"current_page\": 1,\n  \"last_page\": 26,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/orders?&amp;page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 50,\n  \"data\": [ /* records */ ]\n}\n\n</code></pre>\n<h2 id=\"sorting\">Sorting</h2>\n<p>List endpoints accept a <code>sort</code> query parameter that takes a named sort option, not a column name. Each list endpoint has its own enum of valid sort options — see the per-endpoint description. Common pattern: <code>_az</code> / <code>_za</code> for alphabetical, <code>_hl</code> / <code>_lh</code> for high-to-low / low-to-high, <code>_pr</code> / <code>_rp</code> for past-to-recent / recent-to-past.</p>\n<h2 id=\"date-filters\">Date filters</h2>\n<p>Date-range filters are passed as a single comma-separated string. Two formats are used in the API depending on the endpoint:</p>\n<ul>\n<li><p><strong><code>DD/MM/YYYY,DD/MM/YYYY</code></strong> — used by order date filters (<code>received_date_range</code>, <code>dispatched_date_range</code>, <code>ship_by_date_range</code>, <code>last_updated_date_range</code>).</p>\n</li>\n<li><p><strong><code>,</code></strong> — used by log and shipment date filters (<code>date_range</code>, <code>last_updated_date_range</code>).</p>\n</li>\n</ul>\n<p>The per-endpoint description always states which format applies.</p>\n<h2 id=\"standard-error-responses\">Standard error responses</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP</th>\n<th>When</th>\n<th>Body shape</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Missing / invalid / expired token, or insufficient permissions</td>\n<td><code>{\"error\": \"...\"}</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Resource not found</td>\n<td><code>{\"error\": \"...\"}</code></td>\n</tr>\n<tr>\n<td><code>407</code></td>\n<td>Login requires 2FA code</td>\n<td><code>{\"error\": \"2FA code required\"}</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n<td><code>{\"validation_error\": {\"\": \"\"}}</code> (object) or <code>{\"validation_error\": \"\"}</code> (string)</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Rate limit exceeded</td>\n<td><code>{\"error\": \"Too many requests have been sent. Please wait X seconds before trying again.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"rate-limiting\">Rate limiting</h2>\n<p>Every endpoint is rate-limited per IP address. Each response includes:</p>\n<ul>\n<li><p><code>X-RateLimit-Capacity</code> — total requests allowed in the current window.</p>\n</li>\n<li><p><code>X-RateLimit-RefillTimeLeft</code> — seconds remaining before the window resets.</p>\n</li>\n</ul>\n<p>When the limit is hit you receive HTTP <code>429</code> with the message above. Back off and retry after the indicated number of seconds.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Helm v3.6 — Public API","slug":"helm-v36-public-api"}],"owner":"11966424","collectionId":"473f3ed8-7306-464c-98bb-48b8b39c0469","publishedId":"2sB2x9iq9V","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"0056FB"},"publishDate":"2025-06-18T10:12:44.000Z"},"item":[{"name":"Auth","item":[{"name":"Login","event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Auto-capture token on success so all other requests authenticate.","if (pm.response.code === 200) {","    try {","        var body = pm.response.json();","        if (body && body.token) {","            pm.collectionVariables.set('auth_token', body.token);","            console.log('auth_token saved to collection variables.');","        }","    } catch (e) {","        console.warn('Login response was not JSON or had no token field.');","    }","}"],"id":"63a20e4a-8245-4ccb-afb8-1196f613aecb"}}],"id":"994ccb76-d2ee-41cb-a568-29e8cea0fea2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"your.user@your-company.com\",\n    \"password\": \"your-password\",\n    \"2fa_code\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/auth/login","description":"<p>Authenticates a Helm user with their dashboard credentials and returns a JWT access token to be used as the Bearer token for all subsequent API calls.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>One-time setup at the start of an integration session.</li>\n<li>Refreshing a token after the previous one has expired or been invalidated.</li>\n<li>Validating credentials for users in your own UI before they reach the rest of the API.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>No prior authentication needed. The user must exist in Helm, have <strong>Supervisor</strong> level or above, and have <strong>Enable API Access</strong> ticked in <strong>Settings → User Setup</strong>. A user without API access is rejected with <code>401</code> and <code>API access is not enabled for this user. Ask an administrator to enable it in User Setup.</code>; the same response comes back on any later request made with a token issued before access was withdrawn.</p>\n<p>A user linked to a fulfilment client only reaches that client's data. A user that is not linked to a fulfilment client reaches every record on the account.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user's dashboard login email. Case-insensitive.</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user's dashboard password.</td>\n</tr>\n<tr>\n<td><code>2fa_code</code></td>\n<td>string</td>\n<td>conditional</td>\n<td>Required only if the user has two-factor authentication enabled on their account. Send the 6-digit code from their authenticator app. Otherwise leave blank or omit.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>On success, this collection's test script automatically writes the returned token into <code></code> so other requests authenticate without further setup.</li>\n<li>A user with 2FA enabled who logs in <strong>without</strong> a <code>2fa_code</code> receives a <code>407 Proof Authentication Required</code> response with <code>{\"error\": \"2FA code required\"}</code> — at which point you should prompt for the code and resubmit.</li>\n<li>Wrong password or unknown email both return <code>401</code> (the API does not distinguish between them, to avoid leaking which usernames exist).</li>\n</ul>\n","urlObject":{"path":["auth","login"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"c0909070-58a9-4c3c-bc0f-5794313e01d6","name":"200 — Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"your.user@your-company.com\",\n    \"password\": \"your-password\"\n}"},"url":"https://your-company.myhelm.app/public-api/auth/login"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0fQ.pb94eE1wX90YfjscsVhKFkwsPX731DTr1WvXXBWLlaM\"\n}"},{"id":"33b56242-8d36-411e-985b-e6d80c71bb60","name":"401 - API access not enabled","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"unknown@example.com\",\n    \"password\": \"wrong\"\n}"},"url":"https://your-company.myhelm.app/public-api/auth/login"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"API access is not enabled for this user. Ask an administrator to enable it in User Setup.\"\n}"},{"id":"54f1c196-0fda-42f4-a1d1-184155cfb158","name":"407 — 2FA required","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"user.with.2fa@your-company.com\",\n    \"password\": \"correct-password\"\n}"},"url":"https://your-company.myhelm.app/public-api/auth/login"},"status":"Proxy Authentication Required","code":407,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"2FA code required\"\n}"},{"id":"39abe39c-f220-45a3-ae72-c9c76a9d89ef","name":"422 — Missing fields","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"\"\n}"},"url":"https://your-company.myhelm.app/public-api/auth/login"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": {\n        \"email\": \"email field is required\",\n        \"password\": \"password field is required\"\n    }\n}"}],"_postman_id":"994ccb76-d2ee-41cb-a568-29e8cea0fea2"},{"name":"Verify Token","id":"e5d2a6a1-2363-4d87-8de2-47f3598b493e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/auth/verify","description":"<p>Verifies that the current Bearer token is still valid and returns the user it belongs to.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Health-check at the start of an integration session before issuing real API calls.</li>\n<li>Detecting expired/invalidated tokens so you can re-run <strong>Login</strong> transparently.</li>\n<li>Identifying which user a stored token represents (for multi-tenant integrations storing tokens per Helm account).</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user. Returns <code>401</code> if the token is missing, malformed, expired, or belongs to a user whose permission level dropped below Supervisor.</p>\n<h3 id=\"response\">Response</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>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>Internal user ID.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>The user's email address.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["auth","verify"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"e3360db1-fd4e-47e2-b803-093195ea147b","name":"200 — Valid token","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/auth/verify"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 4,\n    \"email\": \"hidayet.arasan@thedespatchcompany.com\"\n}"},{"id":"75619f6a-95b3-4b3c-9645-7f58cfa45ca0","name":"401 — Invalid or expired token","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/auth/verify"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Cannot Authorize\"\n}"}],"_postman_id":"e5d2a6a1-2363-4d87-8de2-47f3598b493e"}],"id":"39c3b6e0-adbe-4e1b-a5e4-424c11b8abf8","description":"<p>Authentication endpoints. Call <code>Login</code> first to obtain a JWT access token; the response handler automatically stores the token into the <code>auth_token</code> collection variable so all subsequent requests use it.</p>\n","_postman_id":"39c3b6e0-adbe-4e1b-a5e4-424c11b8abf8","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"API Info","item":[{"name":"API Version & Current User","id":"b08f5b40-ae36-42ca-a887-8f0acd4e7f2e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/","description":"<p>Returns the running Helm version and the profile of the user that the current Bearer token belongs to. A lightweight all-in-one health check.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Quick smoke test that a tenant is reachable, the token is valid, and which version is deployed (useful when behaviour differs between versions).</li>\n<li>Reading the user's <code>staff_level</code> and <code>fulfilment_client_id</code> to decide which UI features to show in your integration.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"response\">Response</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>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>version</code></td>\n<td>string</td>\n<td>Helm release version (e.g. <code>3.6.0</code>).</td>\n</tr>\n<tr>\n<td><code>user.id</code></td>\n<td>integer</td>\n<td>Internal user ID.</td>\n</tr>\n<tr>\n<td><code>user.fulfilment_client_id</code></td>\n<td>integer or null</td>\n<td>If the user is a fulfilment-client user, this is the client ID; otherwise <code>null</code>.</td>\n</tr>\n<tr>\n<td><code>user.email</code></td>\n<td>string</td>\n<td>User's email address.</td>\n</tr>\n<tr>\n<td><code>user.name</code></td>\n<td>string</td>\n<td>User's full display name.</td>\n</tr>\n<tr>\n<td><code>user.last_login</code></td>\n<td>integer</td>\n<td>Last successful login as a unix timestamp.</td>\n</tr>\n<tr>\n<td><code>user.staff_level</code></td>\n<td>integer</td>\n<td>Permission level. Higher = more privileges. Supervisor is required for the API.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":[""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"de5c0429-2ec7-4ad0-89ad-a64ead1cdf90","name":"200 — Authenticated","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"version\": \"3.6.0\",\n    \"user\": {\n        \"id\": 4,\n        \"fulfilment_client_id\": null,\n        \"email\": \"hidayet.arasan@thedespatchcompany.com\",\n        \"name\": \"Hidayet Arasan\",\n        \"last_login\": 1777541448,\n        \"staff_level\": 5\n    }\n}"}],"_postman_id":"b08f5b40-ae36-42ca-a887-8f0acd4e7f2e"}],"id":"c1f04200-b33a-4bd8-8395-f6f50819475b","description":"<p>Server-side meta endpoints — version reporting and the active user's profile under the current token.</p>\n","_postman_id":"c1f04200-b33a-4bd8-8395-f6f50819475b","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Settings","item":[{"name":"Get Setting Parameters","id":"c4f684c5-2113-4f5f-9e6d-b5577c186284","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/settings/parameters/sales_channels","description":"<p>Fetches a tenant-level configuration list by key. The same endpoint serves several different lists; the <strong>last path segment is the key</strong> that selects which list you get back.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Discover sales-channel IDs to pass into manual order creation.</li>\n<li>Discover accounting-channel and accounting-option IDs to assign to inventory or sales channels.</li>\n<li>Inspect which inventory locations are configured for which warehouses.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"path-parameter--settingkey\">Path parameter — <code>settingKey</code></h3>\n<p>Must be exactly one of the values below — anything else returns <code>422</code>.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Returns</th>\n<th>Typical use</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>accounting_channels</code></td>\n<td>All accounting integrations configured (Xero, Sage, etc.). <code>config</code> is decoded into an object.</td>\n<td>Mapping order revenue to an accounting backend.</td>\n</tr>\n<tr>\n<td><code>accounting_options</code></td>\n<td>Account codes and tax types configured for accounting integrations. <code>data</code> is decoded into an object; <code>type_text</code> is added (<code>Account Code</code> or <code>Tax Type</code>).</td>\n<td>Picking codes/taxes when creating orders or PO items.</td>\n</tr>\n<tr>\n<td><code>sales_channels</code></td>\n<td>All registered sales channels (real and manual). <code>config</code> is decoded into an object.</td>\n<td>Resolving channel IDs / names when creating orders or filtering lists.</td>\n</tr>\n<tr>\n<td><code>inventory_location_indexes</code></td>\n<td>All inventory ↔ location stock-level rows.</td>\n<td>Looking up the available stock of a SKU at every location it lives in.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"data\": [ /* array of records — shape depends on the key */ ] }\n</code></pre>\n<h3 id=\"notes\">Notes</h3>\n<ul>\n<li>For <code>sales_channels</code> and <code>accounting_channels</code>, when the request is made by a fulfilment-client user, results are automatically scoped to that client.</li>\n<li>The legacy <code>filters</code> and <code>sort</code> query parameters are accepted but currently have no effect on the returned data — do not rely on them. Use the chosen key to determine which list you get.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["settings","parameters","sales_channels"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[{"description":{"content":"<p>One of: <code>accounting_channels</code>, <code>accounting_options</code>, <code>sales_channels</code>, <code>inventory_location_indexes</code>.</p>\n","type":"text/plain"},"type":"any","value":"sales_channels","key":"settingKey"}]}},"response":[{"id":"fb5ebbc9-4201-4681-af8b-aaab23939415","name":"200 — sales_channels","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/settings/parameters/sales_channels"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": \"2\",\n            \"chapi_id\": \"d912310d-b9cb-41b1-8ba4-72ed7c2569e8\",\n            \"fulfilment_client_id\": null,\n            \"name\": \"asd\",\n            \"type\": \"woocommerce\",\n            \"config\": null,\n            \"data\": \"\",\n            \"accounting_channel_id\": \"0\",\n            \"auto_sync_offset\": null,\n            \"is_local\": \"0\",\n            \"warehouse_id\": null,\n            \"created_at\": \"2026-02-25 12:06:24\",\n            \"updated_at\": \"2026-03-30 12:36:19\"\n        }\n    ]\n}"},{"id":"e7f450aa-c4a3-4398-8a04-084252332e71","name":"200 — accounting_channels","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/settings/parameters/accounting_channels"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": \"1\",\n            \"chapi_id\": \"3a6f7441-5240-433a-8c50-30928e40aabf\",\n            \"fulfilment_client_id\": \"0\",\n            \"name\": \"dev8\",\n            \"type\": \"xero\",\n            \"config\": null,\n            \"data\": \"\",\n            \"is_active\": \"0\",\n            \"created_at\": \"2026-03-24 09:51:45\",\n            \"updated_at\": \"2026-03-24 09:51:45\"\n        }\n    ]\n}"},{"id":"98bf6289-b326-4e05-aecc-447137bfa6a6","name":"200 — inventory_location_indexes","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/settings/parameters/inventory_location_indexes"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": \"1\",\n            \"inventory_id\": \"1\",\n            \"location_id\": \"1\",\n            \"warehouse_id\": \"6\",\n            \"stock_level\": \"9888\",\n            \"stock_level_available\": \"9515\",\n            \"stock_max_level\": \"0\",\n            \"stock_warn_level\": \"0\",\n            \"priority\": \"1000\",\n            \"created_at\": \"2026-02-25 12:17:33\",\n            \"updated_at\": \"2026-04-29 22:01:02\"\n        }\n    ]\n}"},{"id":"5f3e3369-590f-49a8-a4ca-b96e46ef57fe","name":"422 — Unknown setting key","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/settings/parameters/foo_bar"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"Setting key(foo_bar) not found.\"\n}"}],"_postman_id":"c4f684c5-2113-4f5f-9e6d-b5577c186284"}],"id":"955df126-1cc4-4cc5-a7d8-b4e14f8fe36e","description":"<p>Read-only access to a small set of tenant-level configuration lists. Useful when you need IDs (sales channel IDs, accounting channel IDs, etc.) for use in other endpoints.</p>\n","_postman_id":"955df126-1cc4-4cc5-a7d8-b4e14f8fe36e","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Logs","item":[{"name":"Get Time Tracking Logs","id":"4a28d8b0-717a-4cdf-9509-eb8cc011ec77","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/logs/time_tracking?page=1&per_page=50","description":"<p>Returns warehouse staff activity records — scans, pause events, location movements and any other action recorded by the workforce/picking app. Source for productivity reports.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Build a time-on-task report by summing <code>duration</code> per <code>user_id</code> for a given date range.</li>\n<li>Audit a specific pick or order: find every scan/event linked to it via <code>pick_header_id</code> or <code>order_summary_id</code>.</li>\n<li>Find which warehouse a user was operating in at a given moment via <code>warehouse_id</code> + <code>date_range</code>.</li>\n<li>Power a live activity feed for floor managers (paginate from page 1 with <code>sort=date_desc</code>).</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>) and <code>per_page</code> (default <code>50</code>).</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Multi-value?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[action]</code></td>\n<td>string</td>\n<td>Yes — single pipe `</td>\n<td>`</td>\n</tr>\n<tr>\n<td><code>filters[type]</code></td>\n<td>string</td>\n<td>Yes — single pipe `</td>\n<td>`</td>\n</tr>\n<tr>\n<td><code>filters[user_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by user.</td>\n</tr>\n<tr>\n<td><code>filters[warehouse_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by warehouse location ID.</td>\n</tr>\n<tr>\n<td><code>filters[order_summary_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by order.</td>\n</tr>\n<tr>\n<td><code>filters[pick_header_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by pick.</td>\n</tr>\n<tr>\n<td><code>filters[purchase_order_summary_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by purchase order.</td>\n</tr>\n<tr>\n<td><code>filters[location_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by specific bin/location.</td>\n</tr>\n<tr>\n<td><code>filters[inventory_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by inventory item.</td>\n</tr>\n<tr>\n<td><code>filters[pick_inventory_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by specific pick line.</td>\n</tr>\n<tr>\n<td><code>filters[model_id]</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Filter by polymorphic parent ID — internal use.</td>\n</tr>\n<tr>\n<td><code>filters[date_range]</code></td>\n<td>string</td>\n<td>No</td>\n<td>Two unix timestamps joined by a comma (e.g. <code>1746000000,1746999999</code>). Filters on <code>action_date</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort-options\">Sort options</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Value</th>\n<th>Sort by</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>date_desc</code> (default)</td>\n<td><code>action_date</code> newest first</td>\n</tr>\n<tr>\n<td><code>date_asc</code></td>\n<td><code>action_date</code> oldest first</td>\n</tr>\n<tr>\n<td><code>duration_desc</code></td>\n<td>longest activities first</td>\n</tr>\n<tr>\n<td><code>duration_asc</code></td>\n<td>shortest activities first</td>\n</tr>\n<tr>\n<td><code>newest</code></td>\n<td><code>created_at</code> newest first</td>\n</tr>\n<tr>\n<td><code>oldest</code></td>\n<td><code>created_at</code> oldest first</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-field-reference\">Response field reference</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>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>Record ID.</td>\n</tr>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td>High-level activity action (e.g. <code>SCAN</code>, <code>OTHER</code>).</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td>Specific activity type (e.g. <code>ITEM_SCAN</code>, <code>PAUSE_SCAN</code>).</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>integer</td>\n<td>Time spent on the activity in milliseconds.</td>\n</tr>\n<tr>\n<td><code>action_date</code></td>\n<td>datetime</td>\n<td>When the action happened (server-local format <code>YYYY-MM-DD HH:MM:SS</code>).</td>\n</tr>\n<tr>\n<td><code>user_id</code></td>\n<td>integer</td>\n<td>The user that performed the action.</td>\n</tr>\n<tr>\n<td><code>warehouse_id</code></td>\n<td>integer</td>\n<td>Warehouse the activity was scoped to.</td>\n</tr>\n<tr>\n<td><code>location_id</code></td>\n<td>integer or null</td>\n<td>Specific bin/location involved.</td>\n</tr>\n<tr>\n<td><code>inventory_id</code></td>\n<td>integer or null</td>\n<td>SKU involved.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer or null</td>\n<td>Quantity component of the action (if applicable, e.g. for <code>ITEM_SCAN</code>).</td>\n</tr>\n<tr>\n<td><code>order_summary_id</code></td>\n<td>integer or null</td>\n<td>Linked order.</td>\n</tr>\n<tr>\n<td><code>pick_header_id</code></td>\n<td>integer or null</td>\n<td>Linked pick.</td>\n</tr>\n<tr>\n<td><code>pick_inventory_id</code></td>\n<td>integer or null</td>\n<td>Linked pick line.</td>\n</tr>\n<tr>\n<td><code>purchase_order_summary_id</code></td>\n<td>integer or null</td>\n<td>Linked purchase order.</td>\n</tr>\n<tr>\n<td><code>model_id</code></td>\n<td>integer or null</td>\n<td>Polymorphic parent ID — used internally for non-standard parents.</td>\n</tr>\n<tr>\n<td><code>data</code> / <code>extra</code></td>\n<td>string or null</td>\n<td>Free-form payload columns; populated by some activity types with extra context.</td>\n</tr>\n<tr>\n<td><code>created_at</code> / <code>updated_at</code></td>\n<td>datetime</td>\n<td>Record creation / last update timestamps.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["logs","time_tracking"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Records per page. Default 50.</p>\n","type":"text/plain"},"key":"per_page","value":"50"},{"disabled":true,"description":{"content":"<p>One of: date_asc | date_desc | duration_asc | duration_desc | newest | oldest. Default date_desc (most recent action_date first).</p>\n","type":"text/plain"},"key":"sort","value":"date_desc"},{"disabled":true,"description":{"content":"<p>Match by activity action. Use a single pipe <code>|</code> between values to OR multiple. Values seen in production include <code>SCAN</code> and <code>OTHER</code>. Additional values may exist for future activity types — match exactly what the workforce app records.</p>\n","type":"text/plain"},"key":"filters[action]","value":"SCAN|OTHER"},{"disabled":true,"description":{"content":"<p>Match by activity type. Use a single pipe <code>|</code> between values to OR multiple. Values seen in production include <code>ITEM_SCAN</code>, <code>LOCATION_SCAN</code>, <code>TOTE_SCAN</code>, <code>PAUSE_SCAN</code>, <code>CUSTOM_SCAN</code>. Additional values may exist.</p>\n","type":"text/plain"},"key":"filters[type]","value":"ITEM_SCAN|LOCATION_SCAN|TOTE_SCAN|PAUSE_SCAN|CUSTOM_SCAN"},{"disabled":true,"description":{"content":"<p>Internal user ID — show only activity by this user.</p>\n","type":"text/plain"},"key":"filters[user_id]","value":"4"},{"disabled":true,"description":{"content":"<p>Warehouse location ID — show only activity at this warehouse.</p>\n","type":"text/plain"},"key":"filters[warehouse_id]","value":"6"},{"disabled":true,"description":{"content":"<p>Order ID — show only activity recorded against this order.</p>\n","type":"text/plain"},"key":"filters[order_summary_id]","value":"6308"},{"disabled":true,"description":{"content":"<p>Pick ID — show only activity recorded against this pick.</p>\n","type":"text/plain"},"key":"filters[pick_header_id]","value":"15"},{"disabled":true,"description":{"content":"<p>Purchase order ID — show only activity recorded against this PO.</p>\n","type":"text/plain"},"key":"filters[purchase_order_summary_id]","value":""},{"disabled":true,"description":{"content":"<p>Specific bin/location ID — show only activity scoped to this location.</p>\n","type":"text/plain"},"key":"filters[location_id]","value":"1"},{"disabled":true,"description":{"content":"<p>Inventory item ID — show only activity involving this SKU.</p>\n","type":"text/plain"},"key":"filters[inventory_id]","value":"1"},{"disabled":true,"description":{"content":"<p>Pick-line inventory ID — narrow activity to a specific line on a pick.</p>\n","type":"text/plain"},"key":"filters[pick_inventory_id]","value":""},{"disabled":true,"description":{"content":"<p>Polymorphic model ID — used internally to link an activity to a non-standard parent record. Most integrations will not use this.</p>\n","type":"text/plain"},"key":"filters[model_id]","value":""},{"disabled":true,"description":{"content":"<p>Filter by <code>action_date</code>. Format: <code>&lt;start_unix&gt;,&lt;end_unix&gt;</code> (two unix timestamps in seconds, comma-separated, no spaces). Inclusive on both ends.</p>\n","type":"text/plain"},"key":"filters[date_range]","value":"1746000000,1746999999"}],"variable":[]}},"response":[{"id":"c887223f-ee9c-4eb2-8951-3c5440296590","name":"200 — page of records","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/logs/time_tracking?per_page=3","host":["https://your-company.myhelm.app/public-api"],"path":["logs","time_tracking"],"query":[{"key":"per_page","value":"3"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 7,\n    \"per_page\": \"3\",\n    \"current_page\": 1,\n    \"last_page\": 3,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/logs/time_tracking?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 3,\n    \"data\": [\n        {\n            \"id\": \"19\",\n            \"action\": \"OTHER\",\n            \"type\": \"CUSTOM_SCAN\",\n            \"duration\": \"38000\",\n            \"action_date\": \"2026-04-29 09:00:57\",\n            \"model_id\": null,\n            \"user_id\": \"4\",\n            \"order_summary_id\": null,\n            \"pick_header_id\": \"15\",\n            \"purchase_order_summary_id\": null,\n            \"pick_inventory_id\": null,\n            \"warehouse_id\": \"6\",\n            \"location_id\": null,\n            \"inventory_id\": null,\n            \"quantity\": null,\n            \"data\": null,\n            \"extra\": null,\n            \"created_at\": \"2026-04-29 14:06:31\",\n            \"updated_at\": \"2026-04-29 14:06:31\"\n        },\n        {\n            \"id\": \"18\",\n            \"action\": \"SCAN\",\n            \"type\": \"ITEM_SCAN\",\n            \"duration\": \"2100\",\n            \"action_date\": \"2026-04-29 09:00:19\",\n            \"model_id\": null,\n            \"user_id\": \"4\",\n            \"order_summary_id\": \"6308\",\n            \"pick_header_id\": \"15\",\n            \"purchase_order_summary_id\": null,\n            \"pick_inventory_id\": \"139\",\n            \"warehouse_id\": \"6\",\n            \"location_id\": \"1\",\n            \"inventory_id\": \"1\",\n            \"quantity\": \"1\",\n            \"data\": null,\n            \"extra\": null,\n            \"created_at\": \"2026-04-29 14:06:30\",\n            \"updated_at\": \"2026-04-29 14:06:30\"\n        }\n    ]\n}"}],"_postman_id":"4a28d8b0-717a-4cdf-9509-eb8cc011ec77"},{"name":"Get Stock Transaction Logs","id":"3a4e69f0-4e86-4e6d-8356-90883c00c901","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/logs/stock_transaction?page=1","description":"<p>Returns the audit trail of every change to <em>physical</em> stock at a location. Each record captures the inventory, location, action, prior quantity, new quantity, and the human-readable note explaining why it changed.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Reconcile a stock discrepancy: filter by <code>sku</code> and <code>date_range</code> and read the <code>note</code> column to see what triggered each change.</li>\n<li>Identify which despatched orders are responsible for a sudden drop at a location (the <code>note</code> typically contains <code>Order ID: ...</code>).</li>\n<li>Power a movements panel on an inventory detail page (filter <code>sku</code> = the SKU you're showing).</li>\n<li>Build a goods-in / receiving log per supplier by combining with the <code>note</code> text.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users automatically only see logs for their own inventory and only entries explicitly flagged as visible to them.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). The page size is fixed by the tenant's <em>Items per page</em> setting and is <strong>not</strong> controllable from the request.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Multi-value?</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Yes — single pipe `</td>\n<td>`</td>\n</tr>\n<tr>\n<td><code>filters[date_range]</code></td>\n<td>string</td>\n<td>No</td>\n<td>Two unix timestamps joined by <code>,</code>. Filters on log <code>created_at</code>.</td>\n</tr>\n<tr>\n<td><code>filters[action]</code></td>\n<td>string</td>\n<td>Yes — single pipe `</td>\n<td>`</td>\n</tr>\n<tr>\n<td><code>filters[sku]</code></td>\n<td>string</td>\n<td>Yes — single pipe `</td>\n<td>`</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_clients]</code></td>\n<td>mixed</td>\n<td>Yes — single pipe `</td>\n<td>`</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort-options\">Sort options</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Value</th>\n<th>Sort by</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>(default)</td>\n<td><code>created_at</code> newest first</td>\n</tr>\n<tr>\n<td><code>createdat_pr</code></td>\n<td><code>created_at</code> oldest first</td>\n</tr>\n<tr>\n<td><code>inventoruy_name_az</code></td>\n<td>inventory name A→Z (note the typo <code>inventoruy</code> — send as-is)</td>\n</tr>\n<tr>\n<td><code>inventoruy_name_za</code></td>\n<td>inventory name Z→A</td>\n</tr>\n<tr>\n<td><code>sku_az</code></td>\n<td>SKU A→Z</td>\n</tr>\n<tr>\n<td><code>sku_za</code></td>\n<td>SKU Z→A</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-field-reference\">Response field reference</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>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>Log entry ID.</td>\n</tr>\n<tr>\n<td><code>log_type</code></td>\n<td>integer</td>\n<td>Always <code>1</code> for this endpoint.</td>\n</tr>\n<tr>\n<td><code>inventory_id</code></td>\n<td>integer</td>\n<td>The SKU whose stock was changed.</td>\n</tr>\n<tr>\n<td><code>inventory_name</code></td>\n<td>string</td>\n<td>Display name of the SKU.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td>string</td>\n<td>The SKU code.</td>\n</tr>\n<tr>\n<td><code>location_id</code></td>\n<td>integer</td>\n<td>The location whose stock was changed.</td>\n</tr>\n<tr>\n<td><code>location_name</code></td>\n<td>string</td>\n<td>Display name of the location.</td>\n</tr>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td><code>increase</code> or <code>decrease</code>.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer</td>\n<td>The delta applied.</td>\n</tr>\n<tr>\n<td><code>prev_quantity</code></td>\n<td>integer</td>\n<td>Stock level before the change.</td>\n</tr>\n<tr>\n<td><code>new_quantity</code></td>\n<td>integer</td>\n<td>Stock level after the change.</td>\n</tr>\n<tr>\n<td><code>entry_type</code></td>\n<td>integer</td>\n<td>Internal source-of-change code.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Display name of the user who made the change.</td>\n</tr>\n<tr>\n<td><code>batch_number</code> / <code>serial_number</code> / <code>expire_date</code></td>\n<td>string</td>\n<td>Batch/serial/expiry context if the SKU is batch- or serial-tracked.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>Optional reference for the change (rarely populated).</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>string</td>\n<td>Human-readable explanation — often the most useful field.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>integer or null</td>\n<td>Owning fulfilment client (if any).</td>\n</tr>\n<tr>\n<td><code>can_fulfilment_client_see</code></td>\n<td>integer</td>\n<td><code>1</code> if visible to the owning fulfilment client, <code>0</code> otherwise.</td>\n</tr>\n<tr>\n<td><code>is_app_log</code></td>\n<td>integer</td>\n<td><code>1</code> if originated from the workforce/picking app.</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>When the entry was recorded.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["logs","stock_transaction"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>inventoruy_name_az</code> | <code>inventoruy_name_za</code> | <code>sku_az</code> | <code>sku_za</code> | <code>createdat_pr</code>. Default: created_at descending. NOTE: the inventory-name sort keys are spelt <code>inventoruy_*</code> in the API — this is intentional, send them exactly as written.</p>\n","type":"text/plain"},"key":"sort","value":"createdat_pr"},{"disabled":true,"description":{"content":"<p>Free-text search. A single pipe <code>|</code> between terms ORs them together; each term LIKE-matches against inventory SKU, inventory name, and location name.</p>\n","type":"text/plain"},"key":"filters[search]","value":"widget|red"},{"disabled":true,"description":{"content":"<p>Two unix timestamps joined by a comma. Filters on the log entry <code>created_at</code>. The end timestamp is inclusive plus 24 hours (so <code>..,1746000000</code> covers up to the end of that day).</p>\n","type":"text/plain"},"key":"filters[date_range]","value":"1746000000,1746999999"},{"disabled":true,"description":{"content":"<p>Single pipe <code>|</code> between values to OR multiple. Production values: <code>increase</code>, <code>decrease</code>.</p>\n","type":"text/plain"},"key":"filters[action]","value":"increase|decrease"},{"disabled":true,"description":{"content":"<p>Match by exact SKU. Single pipe <code>|</code> between values to OR multiple.</p>\n","type":"text/plain"},"key":"filters[sku]","value":"SKU-A|SKU-B"},{"disabled":true,"description":{"content":"<p>Match by fulfilment client. Send numeric IDs separated by <code>|</code>. Use the literal string <code>null</code> (or <code>0</code>) to match items not assigned to any fulfilment client.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients]","value":"1|null"}],"variable":[]}},"response":[{"id":"acac1f25-464b-4e88-8782-b0da02aa4468","name":"200 — page of records","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/logs/stock_transaction?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["logs","stock_transaction"],"query":[{"key":"page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 3004,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 31,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/logs/stock_transaction?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": [\n        {\n            \"id\": 9453,\n            \"log_type\": 1,\n            \"inventory_location_index_id\": 20,\n            \"batch_stock_link_id\": null,\n            \"inventory_id\": 1,\n            \"pick_header_id\": null,\n            \"location_id\": 3,\n            \"location_name\": \"Picked\",\n            \"action\": \"increase\",\n            \"quantity\": 1,\n            \"prev_quantity\": 71,\n            \"new_quantity\": 72,\n            \"entry_type\": 3,\n            \"name\": \"Hidayet Arasan\",\n            \"batch_number\": \"\",\n            \"serial_number\": \"\",\n            \"expire_date\": \"\",\n            \"reference\": \"\",\n            \"note\": \"Reset Order. (Order ID: 6295 - Order Channel ID: 1776941619-51)\",\n            \"can_fulfilment_client_see\": 1,\n            \"is_app_log\": 0,\n            \"created_at\": \"2026-04-23 11:53:56\",\n            \"inventory_name\": \"HA Product Test - 1\",\n            \"sku\": \"ha_product_test_1\",\n            \"fulfilment_client_id\": null\n        }\n    ]\n}"}],"_postman_id":"3a4e69f0-4e86-4e6d-8356-90883c00c901"},{"name":"Get Stock Allocation Logs","id":"dd61c8e2-66e1-4c9f-a55d-54a6c4b39a89","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/logs/stock_allocation?page=1","description":"<p>Returns the audit trail of every change to <em>allocated</em> (reserved) stock against orders or picks. Each record captures the inventory, location, action, prior allocated quantity, new allocated quantity, and the note explaining why the allocation changed.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Trace why an order's allocation changed: filter by <code>sku</code> and <code>date_range</code> and read the <code>note</code> column.</li>\n<li>Build a per-pick allocation timeline.</li>\n<li>Detect over-allocation incidents by spotting <code>decrease</code> rows on a particular SKU/date.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users see only their own inventory's logs that are explicitly flagged as visible to them.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). The page size is fixed by the tenant's <em>Items per page</em> setting and is <strong>not</strong> controllable from the request.</p>\n<h3 id=\"filters--sort\">Filters &amp; sort</h3>\n<p>Identical to <strong>Get Stock Transaction Logs</strong> — see that endpoint's description for the full reference.</p>\n<h3 id=\"response-field-reference\">Response field reference</h3>\n<p>Identical schema to <strong>Get Stock Transaction Logs</strong>, with the single difference that <code>log_type</code> is <code>2</code> (allocation) instead of <code>1</code> (transaction).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["logs","stock_allocation"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>inventoruy_name_az</code> | <code>inventoruy_name_za</code> | <code>sku_az</code> | <code>sku_za</code> | <code>createdat_pr</code>. Default: created_at descending. NOTE: the inventory-name sort keys are spelt <code>inventoruy_*</code> in the API — send them exactly as written.</p>\n","type":"text/plain"},"key":"sort","value":"createdat_pr"},{"disabled":true,"description":{"content":"<p>Free-text search. Single pipe <code>|</code> between terms ORs them together; each term LIKE-matches against inventory SKU, inventory name, and location name.</p>\n","type":"text/plain"},"key":"filters[search]","value":"widget|red"},{"disabled":true,"description":{"content":"<p>Two unix timestamps joined by a comma. Filters on the log entry <code>created_at</code>. The end timestamp is inclusive plus 24 hours.</p>\n","type":"text/plain"},"key":"filters[date_range]","value":"1746000000,1746999999"},{"disabled":true,"description":{"content":"<p>Single pipe <code>|</code> between values to OR multiple. Production values: <code>increase</code>, <code>decrease</code>.</p>\n","type":"text/plain"},"key":"filters[action]","value":"increase|decrease"},{"disabled":true,"description":{"content":"<p>Match by exact SKU. Single pipe <code>|</code> between values to OR multiple.</p>\n","type":"text/plain"},"key":"filters[sku]","value":"SKU-A|SKU-B"},{"disabled":true,"description":{"content":"<p>Match by fulfilment client. Send numeric IDs separated by <code>|</code>. Use the literal string <code>null</code> (or <code>0</code>) to match items not assigned to any fulfilment client.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients]","value":"1|null"}],"variable":[]}},"response":[{"id":"19555445-fe05-4786-afd4-233091ab93ce","name":"200 — page of records","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/logs/stock_allocation?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["logs","stock_allocation"],"query":[{"key":"page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 6229,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 63,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/logs/stock_allocation?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": [\n        {\n            \"id\": 9481,\n            \"log_type\": 2,\n            \"inventory_location_index_id\": 1,\n            \"batch_stock_link_id\": null,\n            \"inventory_id\": 1,\n            \"pick_header_id\": null,\n            \"location_id\": 1,\n            \"location_name\": \"Default\",\n            \"action\": \"increase\",\n            \"quantity\": 1,\n            \"prev_quantity\": 9515,\n            \"new_quantity\": 9516,\n            \"entry_type\": 3,\n            \"name\": \"Hidayet Arasan\",\n            \"batch_number\": \"\",\n            \"serial_number\": \"\",\n            \"expire_date\": \"\",\n            \"reference\": \"\",\n            \"note\": \"Remove order stock allocation. (Order ID: 6308)\",\n            \"can_fulfilment_client_see\": 0,\n            \"is_app_log\": 0,\n            \"created_at\": \"2026-04-29 11:59:30\",\n            \"inventory_name\": \"HA Product Test - 1\",\n            \"sku\": \"ha_product_test_1\",\n            \"fulfilment_client_id\": null\n        }\n    ]\n}"}],"_postman_id":"dd61c8e2-66e1-4c9f-a55d-54a6c4b39a89"}],"id":"d916c53e-7a20-451d-93a4-e301b907fed6","description":"<p>Read-only audit-log endpoints. Three different log streams are exposed:</p>\n<ul>\n<li><strong>Time Tracking</strong> — warehouse staff activity (scans, location moves, pause events, custom scans). Source for productivity/time-on-task reports.</li>\n<li><strong>Stock Transaction</strong> — every change to <em>physical</em> stock at a location (receive, transfer, scrap, deductions for despatched orders, etc.). Source-of-truth for stock movement audit.</li>\n<li><strong>Stock Allocation</strong> — every change to <em>allocated</em> (reserved) stock against orders or picks. Use this to trace where reserved stock is going at a per-order level.</li>\n</ul>\n<p>Both stock log endpoints share a common filter set; the time-tracking endpoint has its own richer filter set keyed off the activity model.</p>\n","_postman_id":"d916c53e-7a20-451d-93a4-e301b907fed6","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Orders","item":[{"name":"List Orders","id":"048a1f98-e708-4ca9-b149-134ee44139b7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/orders?page=1&limit=20","description":"<p>Returns a paginated list of orders with their inventory and shipment info embedded.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Dashboards: show orders pending despatch with <code>filters[status][]=3</code> (Despatch Ready).</li>\n<li>Sync windows: poll new orders since last run with <code>filters[last_updated_date_range]=...</code>.</li>\n<li>Customer-service search: find an order by tracking, postcode, or SKU using <code>filters[search]</code> + <code>filters[search_field]</code>.</li>\n<li>Reconciliation reports: pull a date range and filter by <code>sales_channel</code>.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users automatically only see orders that belong to their client.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>) and <code>limit</code> (default tenant setting, typically 20). NOTE: orders use <code>limit</code>, not <code>per_page</code>.</p>\n<h3 id=\"sort-options\">Sort options</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Value</th>\n<th>Sort by</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>(default)</td>\n<td><code>created_at</code> newest first</td>\n</tr>\n<tr>\n<td><code>name_az</code> / <code>name_za</code></td>\n<td><code>invoice_name</code> A→Z / Z→A</td>\n</tr>\n<tr>\n<td><code>totalpaid_hl</code> / <code>totalpaid_lh</code></td>\n<td><code>total_paid</code> high→low / low→high</td>\n</tr>\n<tr>\n<td><code>datereceived_pr</code> / <code>datereceived_rp</code></td>\n<td><code>date_received</code> past→recent / recent→past</td>\n</tr>\n<tr>\n<td><code>datedispatched_pr</code> / <code>datedispatched_rp</code></td>\n<td><code>date_dispatched</code> past→recent / recent→past</td>\n</tr>\n<tr>\n<td><code>zone_az</code> / <code>zone_za</code></td>\n<td><code>zone</code> A→Z / Z→A</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"filter-quick-reference\">Filter quick reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[status][]</code></td>\n<td>int</td>\n<td>Order status ID. See folder description.</td>\n</tr>\n<tr>\n<td><code>filters[order_id][]</code></td>\n<td>int</td>\n<td>Order summary ID.</td>\n</tr>\n<tr>\n<td><code>filters[search]</code> + <code>filters[search_field]</code></td>\n<td>string</td>\n<td>Pipe-separated terms. Field controls scope.</td>\n</tr>\n<tr>\n<td><code>filters[date_range]</code></td>\n<td>string</td>\n<td>DD/MM/YYYY,DD/MM/YYYY — <code>date_received</code>.</td>\n</tr>\n<tr>\n<td><code>filters[dispatched_date_range]</code></td>\n<td>string</td>\n<td>DD/MM/YYYY,DD/MM/YYYY — <code>date_dispatched</code>.</td>\n</tr>\n<tr>\n<td><code>filters[ship_by_date_range]</code></td>\n<td>string</td>\n<td>DD/MM/YYYY,DD/MM/YYYY — <code>ship_by_date</code>.</td>\n</tr>\n<tr>\n<td><code>filters[last_updated_date_range]</code></td>\n<td>string</td>\n<td>DD/MM/YYYY,DD/MM/YYYY — <code>updated_at</code>.</td>\n</tr>\n<tr>\n<td><code>filters[sales_channel][]</code></td>\n<td>int</td>\n<td>Channel ID.</td>\n</tr>\n<tr>\n<td><code>filters[sales_channel_name]</code></td>\n<td>string</td>\n<td>LIKE-match on channel name.</td>\n</tr>\n<tr>\n<td><code>filters[channel_username][]</code></td>\n<td>string</td>\n<td>Exact match.</td>\n</tr>\n<tr>\n<td><code>filters[order_tags][]</code></td>\n<td>string</td>\n<td>Tag name.</td>\n</tr>\n<tr>\n<td><code>filters[location][]</code></td>\n<td>int</td>\n<td>Allocation location.</td>\n</tr>\n<tr>\n<td><code>filters[shipping_service][]</code></td>\n<td>string</td>\n<td><code>shipping_method_requested</code>.</td>\n</tr>\n<tr>\n<td><code>filters[type][]</code></td>\n<td>string</td>\n<td><code>SIG</code> / <code>SIM</code> / <code>MIM</code> / <code>ZIO</code>.</td>\n</tr>\n<tr>\n<td><code>filters[item_qty]</code></td>\n<td>string</td>\n<td><code>N</code>, <code>&gt;N</code>, <code>&lt;N</code>.</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_clients][]</code></td>\n<td>int</td>\n<td>Fulfilment client ID.</td>\n</tr>\n<tr>\n<td><code>filters[show_archived]</code></td>\n<td>bool</td>\n<td><code>1</code> / <code>true</code> / <code>yes</code> returns live and archived orders together.</td>\n</tr>\n<tr>\n<td><code>filters[archived_only]</code></td>\n<td>bool</td>\n<td><code>1</code> / <code>true</code> / <code>yes</code> returns archived orders only.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"archived-orders\">Archived orders</h3>\n<p>Despatched orders are archived automatically 90 days after their despatch date. Archived orders are left out of this list unless you send <code>filters[show_archived]=1</code> (live and archived together) or <code>filters[archived_only]=1</code> (archived only, for historical reporting). Both accept <code>1</code>, <code>true</code>, <code>yes</code>, <code>y</code> or <code>on</code>; <code>0</code>, <code>false</code> or an empty value has no effect. The array form (<code>filters[show_archived][]=1</code>) is also accepted. Every order carries <code>is_archived</code> (<code>0</code> or <code>1</code>) so the two can be told apart. <strong>Get Order Detail</strong> returns an archived order without any extra filter.</p>\n<h3 id=\"filterssearch_field-values\"><code>filters[search_field]</code> values</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Value</th>\n<th>Searches</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>auto</code> (default)</td>\n<td>Channel order ID, alternate channel ID, invoice/shipping name, email and tracking code. A single term starting with <code>DC</code> is treated as a despatch reference.</td>\n</tr>\n<tr>\n<td><code>search_order_id</code></td>\n<td>Channel order ID</td>\n</tr>\n<tr>\n<td><code>search_channel_alt_id</code></td>\n<td>Alternate channel order ID</td>\n</tr>\n<tr>\n<td><code>search_name</code></td>\n<td>Invoice or shipping name</td>\n</tr>\n<tr>\n<td><code>search_email</code></td>\n<td>Customer email</td>\n</tr>\n<tr>\n<td><code>search_postcode</code></td>\n<td>Invoice or shipping postcode</td>\n</tr>\n<tr>\n<td><code>search_dc_code</code></td>\n<td>Despatch reference (exact match)</td>\n</tr>\n<tr>\n<td><code>search_product_name</code></td>\n<td>Line item name</td>\n</tr>\n<tr>\n<td><code>search_sku</code></td>\n<td>Line item SKU</td>\n</tr>\n<tr>\n<td><code>search_country</code></td>\n<td>Invoice or shipping country name</td>\n</tr>\n<tr>\n<td><code>search_iso</code></td>\n<td>Invoice or shipping country ISO code</td>\n</tr>\n<tr>\n<td><code>search_shipping</code></td>\n<td>Requested shipping method</td>\n</tr>\n<tr>\n<td><code>search_shipping_tracking_code</code></td>\n<td>Tracking code on the shipment</td>\n</tr>\n</tbody>\n</table>\n</div><p>Each search is a partial (contains) match. <code>filters[status]</code>, <code>filters[order_id]</code>, <code>filters[sales_channel]</code> and <code>filters[order_tags]</code> also accept a single value without the <code>[]</code> suffix.</p>\n<h3 id=\"response\">Response</h3>\n<p>Paginated envelope with the standard <code>total</code>/<code>per_page</code>/<code>current_page</code>/etc. wrapping a <code>data[]</code> array. Each order in <code>data[]</code> includes:</p>\n<ul>\n<li>All <code>order_summary</code> fields.</li>\n<li><code>status</code> — the human-readable status name.</li>\n<li><code>inventory[]</code> — every order line, with the line's per-unit price/tax/discount and any product attributes.</li>\n<li><code>shipment</code> — the shipment record if the order has been despatched, otherwise <code>[]</code>.</li>\n<li><code>total_weight</code> — recalculated from inventory.</li>\n<li><code>customer_*</code> fields (<code>customer_vat_number</code>, <code>customer_eori_number</code>, <code>customer_tax_id</code>, <code>customer_ioss_number</code>, <code>customer_ukims_number</code>) — pulled from the linked contact for convenience.</li>\n<li><code>custom_fields</code> — object with any tenant-defined custom fields.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["orders"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Records per page. Default is the tenant's <em>Items per page</em> setting (typically 20). NOTE: orders use <code>limit</code>, not <code>per_page</code>.</p>\n","type":"text/plain"},"key":"limit","value":"20"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code> | <code>totalpaid_hl</code> | <code>totalpaid_lh</code> | <code>datereceived_pr</code> | <code>datereceived_rp</code> | <code>datedispatched_pr</code> | <code>datedispatched_rp</code> | <code>zone_az</code> | <code>zone_za</code>. Default: <code>created_at</code> descending. <code>_pr</code> = past→recent (ASC), <code>_rp</code> = recent→past (DESC), <code>_hl</code> = high→low, <code>_lh</code> = low→high.</p>\n","type":"text/plain"},"key":"sort","value":"datereceived_rp"},{"disabled":true,"description":{"content":"<p>Order status ID. Send multiple times for OR. See the folder description for the full status enum.</p>\n","type":"text/plain"},"key":"filters[status][]","value":"3"},{"disabled":true,"description":{"content":"<p>Order summary ID. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[order_id][]","value":"6310"},{"disabled":true,"description":{"content":"<p>Free-text search. Use a single pipe <code>|</code> between terms to OR them. Pair with <code>filters[search_field]</code> to narrow scope; otherwise the API uses <code>auto</code> which searches order ID, channel-alt ID, customer name, email, and tracking code.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>One of: <code>auto</code> | <code>search_order_id</code> | <code>search_channel_alt_id</code> | <code>search_name</code> | <code>search_email</code> | <code>search_postcode</code> | <code>search_country</code> | <code>search_iso</code> | <code>search_shipping</code> | <code>search_shipping_tracking_code</code> | <code>search_sku</code> | <code>search_product_name</code> | <code>search_dc_code</code>. Defines what <code>filters[search]</code> looks at.</p>\n","type":"text/plain"},"key":"filters[search_field]","value":"auto"},{"disabled":true,"description":{"content":"<p>Filter by <code>date_received</code>. Format: <code>DD/MM/YYYY,DD/MM/YYYY</code> (UK format, comma-separated, no spaces).</p>\n","type":"text/plain"},"key":"filters[date_range]","value":"01/04/2026,30/04/2026"},{"disabled":true,"description":{"content":"<p>Filter by <code>date_dispatched</code>. Format: <code>DD/MM/YYYY,DD/MM/YYYY</code>.</p>\n","type":"text/plain"},"key":"filters[dispatched_date_range]","value":"01/04/2026,30/04/2026"},{"disabled":true,"description":{"content":"<p>Filter by <code>ship_by_date</code>. Format: <code>DD/MM/YYYY,DD/MM/YYYY</code>.</p>\n","type":"text/plain"},"key":"filters[ship_by_date_range]","value":"01/04/2026,30/04/2026"},{"disabled":true,"description":{"content":"<p>Filter by <code>updated_at</code>. Format: <code>DD/MM/YYYY,DD/MM/YYYY</code>.</p>\n","type":"text/plain"},"key":"filters[last_updated_date_range]","value":"01/04/2026,30/04/2026"},{"disabled":true,"description":{"content":"<p>Sales channel ID. Send multiple times for OR. Use <code>Settings → Get Setting Parameters</code> with key <code>sales_channels</code> to list valid IDs.</p>\n","type":"text/plain"},"key":"filters[sales_channel][]","value":"2"},{"disabled":true,"description":{"content":"<p>LIKE-match on the sales channel name.</p>\n","type":"text/plain"},"key":"filters[sales_channel_name]","value":""},{"disabled":true,"description":{"content":"<p>Exact match on <code>channel_username</code> (the per-marketplace seller name on a channel record). Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[channel_username][]","value":""},{"disabled":true,"description":{"content":"<p>(Use via <code>filters[search]=...&amp;filters[search_field]=search_channel_alt_id</code> instead — there is no dedicated <code>channel_alt_id</code> filter.)</p>\n","type":"text/plain"},"key":"filters[channel_alt_id]","value":""},{"disabled":true,"description":{"content":"<p>Tag name (exact match). Send multiple times for OR. The API auto-tags every manually-created order with <code>API</code>.</p>\n","type":"text/plain"},"key":"filters[order_tags][]","value":"API"},{"disabled":true,"description":{"content":"<p>Location ID — return orders that have inventory allocated at this warehouse location. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[location][]","value":"1"},{"disabled":true,"description":{"content":"<p>Match by <code>shipping_method_requested</code>. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[shipping_service][]","value":""},{"disabled":true,"description":{"content":"<p>Order shape: <code>SIG</code> (Single Item Single Qty), <code>SIM</code> (Single Item Multi Qty), <code>MIM</code> (Multi Item Multi Qty), <code>ZIO</code> (Zero Item Order). Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[type][]","value":"SIG"},{"disabled":true,"description":{"content":"<p>Filter by total inventory quantity. Plain integer for exact match (<code>5</code>); <code>&gt;5</code> for &gt;= 5; <code>&lt;5</code> for &lt;= 5.</p>\n","type":"text/plain"},"key":"filters[item_qty]","value":""},{"disabled":true,"description":{"content":"<p>Fulfilment client ID. Send multiple times for OR. Visible to back-office users only.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients][]","value":""},{"disabled":true,"description":{"content":"<p><code>1</code> to include archived orders alongside live ones. By default archived orders are excluded.</p>\n","type":"text/plain"},"key":"filters[show_archived]","value":"1"},{"disabled":true,"description":{"content":"<p><code>1</code> to return archived orders only.</p>\n","type":"text/plain"},"key":"filters[archived_only]","value":"1"}],"variable":[]}},"response":[{"id":"f6f0ee0a-bec8-49b5-a060-a90fd5fc7bd7","name":"200 — page of orders","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/orders?limit=1","host":["https://your-company.myhelm.app/public-api"],"path":["orders"],"query":[{"key":"limit","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 1805,\n    \"per_page\": \"1\",\n    \"current_page\": 1,\n    \"last_page\": 1805,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/orders?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 1,\n    \"data\": [\n        {\n            \"id\": 6310,\n            \"status_id\": 2710,\n            \"sale_type\": \"B2B\",\n            \"allocation_status_id\": 2,\n            \"channel_order_id\": \"1777460098-32\",\n            \"channel_id\": 34,\n            \"contact_id\": 5778,\n            \"shipping_name\": \"Hidayet Arasan\",\n            \"shipping_address_postcode\": \"WF14 0DE\",\n            \"shipping_address_iso\": \"GB\",\n            \"invoice_name\": \"Hidayet Arasan\",\n            \"email\": \"customer@example.com\",\n            \"total_paid\": \"5.00\",\n            \"total_tax\": \"0.00\",\n            \"shipping_paid\": \"0.00\",\n            \"date_received\": \"2026-04-29 11:54:58\",\n            \"date_dispatched\": \"0000-00-00 00:00:00\",\n            \"total_weight\": 1,\n            \"total_inventory_count\": 2,\n            \"total_inventory_quantity\": 3,\n            \"custom_fields\": {},\n            \"created_at\": \"2026-04-29 11:54:58\",\n            \"updated_at\": \"2026-04-29 11:56:23\",\n            \"status\": \"Sorting\",\n            \"inventory\": [\n                {\n                    \"id\": 21148,\n                    \"inventory_id\": 1,\n                    \"order_summary_id\": 6310,\n                    \"sku\": \"ha_product_test_1\",\n                    \"quantity\": 1,\n                    \"name\": \"HA Product Test - 1\",\n                    \"unit_price\": \"1.0000\",\n                    \"unit_tax\": \"0.0000\",\n                    \"line_total_discount\": \"0.0000\",\n                    \"price\": \"1.0000\",\n                    \"hs_code\": \"HSTest1\",\n                    \"country_of_origin\": \"GB\"\n                }\n            ],\n            \"shipment\": []\n        }\n    ]\n}"}],"_postman_id":"048a1f98-e708-4ca9-b149-134ee44139b7"},{"name":"Get Order Detail","id":"630323b8-248b-42b4-91ef-df22c192c571","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/order/","description":"<p>Returns the full record for a single order, including its inventory lines, tags, total weight, and the linked contact's compliance numbers (VAT/EORI/IOSS/UKIMS).</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Display an order page in your back-office UI.</li>\n<li>Refresh state after editing — receive the canonical record.</li>\n<li>Trace a customer reference back to a specific order's contents.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only retrieve orders that belong to their client; otherwise <code>401 Unauthorised</code>.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — internal order ID (the integer <code>id</code> field on the order).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The full <code>order_summary</code> record plus:</p>\n<ul>\n<li><code>status</code> — the human-readable status name.</li>\n<li><code>tags[]</code> — array of <code>{ id, tag }</code>.</li>\n<li><code>inventory[]</code> — every order line.</li>\n<li><code>total_weight</code> — recalculated from inventory.</li>\n<li><code>custom_fields</code> — object.</li>\n<li><code>customer_*</code> fallbacks from the linked contact.</li>\n<li><code>requested_packaging[]</code> - packaging items requested for the order, each <code>{ id, inventory_id, quantity, packaging_type, inventory_name, inventory_sku }</code> (see <strong>Add Requested Packaging to Order</strong>).</li>\n<li><code>order_allocations[]</code> - current stock allocations per line, each with a nested <code>batch_allocations[]</code> for batch-tracked items.</li>\n<li><code>shipment</code> - the shipment record when the order has been despatched, with its <code>return_shipments[]</code>. Fulfilment-client users do not receive the raw courier request and response payloads.</li>\n<li><code>flag</code> / <code>flag_message</code> - <code>flag</code> is <code>1</code> when the order needs attention and <code>flag_message</code> says why, otherwise <code>0</code> and <code>null</code>. Helm currently sets it when a cancellation from the sales channel could not be applied because of the order's status or state; the order itself is left unchanged. The flag is cleared when a user resolves it in Helm.</li>\n<li><code>returns[]</code> - only for orders in Returned (<code>9</code>) or Partially Returned (<code>17</code>) status.</li>\n</ul>\n<p>Returns <code>404 Not Found</code> if the order doesn't exist or has been soft-deleted.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"a425aee5-e4ae-4f78-8b7d-1129e003da39","name":"200 — order with inventory","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order/6310"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 6310,\n    \"status_id\": 2710,\n    \"sale_type\": \"B2B\",\n    \"allocation_status_id\": 2,\n    \"channel_order_id\": \"1777460098-32\",\n    \"channel_id\": 34,\n    \"contact_id\": 5778,\n    \"shipping_name\": \"Hidayet Arasan\",\n    \"shipping_address_line_one\": \"Bostanli Mahallesi 11/22\",\n    \"shipping_address_postcode\": \"WF14 0DE\",\n    \"shipping_address_iso\": \"GB\",\n    \"email\": \"customer@example.com\",\n    \"total_paid\": \"5.00\",\n    \"total_tax\": \"0.00\",\n    \"shipping_paid\": \"0.00\",\n    \"date_received\": \"2026-04-29 11:54:58\",\n    \"total_weight\": 1,\n    \"total_inventory_count\": 2,\n    \"total_inventory_quantity\": 3,\n    \"custom_fields\": {},\n    \"status\": \"Sorting\",\n    \"tags\": [],\n    \"inventory\": [\n        {\n            \"id\": 21148,\n            \"inventory_id\": 1,\n            \"sku\": \"ha_product_test_1\",\n            \"quantity\": 1,\n            \"name\": \"HA Product Test - 1\",\n            \"unit_price\": \"1.0000\",\n            \"hs_code\": \"HSTest1\",\n            \"country_of_origin\": \"GB\"\n        },\n        {\n            \"id\": 21149,\n            \"inventory_id\": 2,\n            \"sku\": \"ha_product_test_2\",\n            \"quantity\": 2,\n            \"name\": \"HA Product Test - 2\",\n            \"unit_price\": \"2.0000\"\n        }\n    ]\n}"},{"id":"6a89b0f9-4375-434d-8f0c-c92157bc4702","name":"404 — Order not found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order/999999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Order Not Found\"\n}"}],"_postman_id":"630323b8-248b-42b4-91ef-df22c192c571"},{"name":"Get Order Batch Values","id":"4f4fcebb-39bf-4226-a0ef-2476204907f8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/order//batch-values","description":"<p>Returns the batch numbers / serial numbers picked for each line of an order. Only relevant for SKUs with batch- or serial-tracking enabled.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Print compliance documents that need to list batch IDs (food, pharma, regulated goods).</li>\n<li>Audit which batches went to which customer for a given order.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"response\">Response</h3>\n<p>Array of objects; each object lists the batch values selected for one order line. Returns <code>[]</code> if the order has no batch-tracked items or has not been picked yet.</p>\n<h3 id=\"query-parameters\">Query parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>include=allocations</code></td>\n<td>no</td>\n<td>Also returns the live pre-despatch batch allocations (created by batch selection on <code>add_inventory</code> / <code>create_with_inventory</code> / assign-batches, or by any allocation flow). Every element then carries <code>\"source\": \"allocated\"</code> or <code>\"source\": \"despatched\"</code>. Allocated rows disappear at despatch and reappear as despatched rows. Without the parameter the response is unchanged (despatched history only, no <code>source</code> field) - fully backwards compatible.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"ownership\">Ownership</h3>\n<p>Fulfilment client tokens can only read their own orders (<code>401</code> otherwise).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","batch-values"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"c3ca443f-70b8-43fd-837b-81d46f1b7081","name":"200 — empty (no batch-tracked items)","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order/6310/batch-values"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"[]"},{"id":"a10da7d1-f2aa-47a8-8ecf-389f7d4c2427","name":"200 — with include=allocations","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/order/178934/batch-values?include=allocations","host":["https://your-company.myhelm.app/public-api"],"path":["order","178934","batch-values"],"query":[{"key":"include","value":"allocations"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"order_inventory_id\": 193982,\n        \"inventory_id\": 802,\n        \"batch_value\": \"BATCH-A\",\n        \"quantity\": 4,\n        \"source\": \"allocated\"\n    },\n    {\n        \"order_inventory_id\": 193982,\n        \"inventory_id\": 802,\n        \"batch_value\": \"BATCH-B\",\n        \"quantity\": 6,\n        \"source\": \"allocated\"\n    },\n    {\n        \"order_inventory_id\": 190001,\n        \"inventory_id\": 60,\n        \"batch_value\": \"OLD-1\",\n        \"quantity\": 2,\n        \"source\": \"despatched\"\n    }\n]"}],"_postman_id":"4f4fcebb-39bf-4226-a0ef-2476204907f8"},{"name":"List Order Logs","id":"85cc98ca-ca4d-484c-99b4-cefa34c59ffa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order//logs?page=1&per_page=20","description":"<p>Returns the activity log of one order: the same entries as the order's log in Helm (status changes, allocation, picking, labels, notes added through the API and so on).</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only read the logs of their own orders (<code>401</code> <code>Unauthorised</code> otherwise).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID. A missing or deleted order returns <code>404</code>.</li>\n</ul>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting).</p>\n<h3 id=\"sort\">Sort</h3>\n<p><code>sort=created_at_desc</code> (default, newest first) or <code>sort=created_at_asc</code>.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on the log text (<code>event</code>).</td>\n</tr>\n<tr>\n<td><code>filters[source]</code></td>\n<td>string</td>\n<td>Where the entry came from, see <code>source</code> below.</td>\n</tr>\n<tr>\n<td><code>filters[app]</code></td>\n<td>string</td>\n<td>Slug of an installed App Store app: only entries that app added.</td>\n</tr>\n<tr>\n<td><code>filters[date_from]</code></td>\n<td>date</td>\n<td><code>Y-m-d</code> or <code>Y-m-d H:i:s</code>. Entries created at or after this time.</td>\n</tr>\n<tr>\n<td><code>filters[date_to]</code></td>\n<td>date</td>\n<td><code>Y-m-d</code> or <code>Y-m-d H:i:s</code>. A date without a time includes the whole of that day.</td>\n</tr>\n</tbody>\n</table>\n</div><p>An unknown <code>sort</code> or <code>filters[source]</code> value, or a date that cannot be read, returns <code>422</code> listing every problem found.</p>\n<h3 id=\"response-fields\">Response fields</h3>\n<ul>\n<li><code>event</code> - the log text.</li>\n<li><code>source</code> - <code>user</code> (a user, including API users, with no app), <code>app</code> (an installed App Store app, named in <code>app.slug</code>), <code>warehouse_app</code> (the Helm mobile / PDA app) or <code>system</code> (Helm itself, no user recorded).</li>\n<li><code>name</code> - who the entry is shown under in Helm; <code>System</code> when nobody is recorded.</li>\n<li><code>user</code> - <code>{ id, name }</code> of the user, or <code>null</code>.</li>\n<li><code>app</code> - <code>{ slug }</code> of the app, or <code>null</code>.</li>\n<li><code>data</code> - the structured data stored with the entry (the <code>data</code> object sent to <strong>Add Order Log</strong>, or detail Helm recorded), or <code>null</code>. Not returned to fulfilment-client users.</li>\n<li><code>created_at</code> - <code>Y-m-d H:i:s</code>, account time zone.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","logs"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Records per page. Default is the tenant's <em>Items per page</em> setting.</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p><code>created_at_desc</code> (default, newest first) or <code>created_at_asc</code>.</p>\n","type":"text/plain"},"key":"sort","value":"created_at_desc"},{"disabled":true,"description":{"content":"<p>Partial match on the log text.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>One of <code>user</code>, <code>app</code>, <code>warehouse_app</code>, <code>system</code>.</p>\n","type":"text/plain"},"key":"filters[source]","value":"app"},{"disabled":true,"description":{"content":"<p>Slug of an installed App Store app. Only logs added by that app.</p>\n","type":"text/plain"},"key":"filters[app]","value":""},{"disabled":true,"description":{"content":"<p><code>Y-m-d</code> or <code>Y-m-d H:i:s</code>. Logs created at or after this time.</p>\n","type":"text/plain"},"key":"filters[date_from]","value":"2026-10-01"},{"disabled":true,"description":{"content":"<p><code>Y-m-d</code> or <code>Y-m-d H:i:s</code>. A date without a time covers the whole day.</p>\n","type":"text/plain"},"key":"filters[date_to]","value":"2026-10-08"}],"variable":[]}},"response":[{"id":"e382824f-1da8-4234-9a73-ff86127e4d99","name":"200 - order logs","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/order//logs?page=1&per_page=20","host":["https://your-company.myhelm.app/public-api"],"path":["order","","logs"],"query":[{"key":"page","value":"1","description":"1-based page number. Default 1."},{"key":"per_page","value":"20","description":"Records per page. Default is the tenant's *Items per page* setting."},{"key":"sort","value":"created_at_desc","description":"`created_at_desc` (default, newest first) or `created_at_asc`.","disabled":true},{"key":"filters[search]","value":"","description":"Partial match on the log text.","disabled":true},{"key":"filters[source]","value":"app","description":"One of `user`, `app`, `warehouse_app`, `system`.","disabled":true},{"key":"filters[app]","value":"","description":"Slug of an installed App Store app. Only logs added by that app.","disabled":true},{"key":"filters[date_from]","value":"2026-10-01","description":"`Y-m-d` or `Y-m-d H:i:s`. Logs created at or after this time.","disabled":true},{"key":"filters[date_to]","value":"2026-10-08","description":"`Y-m-d` or `Y-m-d H:i:s`. A date without a time covers the whole day.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 7,\n  \"per_page\": 2,\n  \"current_page\": 1,\n  \"last_page\": 4,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/order/178144/logs?&per_page=2&page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 2,\n  \"data\": [\n    {\n      \"id\": 709859,\n      \"order_id\": 178144,\n      \"event\": \"Customer asked for the parcel to be left with a neighbour.\",\n      \"source\": \"user\",\n      \"name\": \"API User\",\n      \"user\": {\n        \"id\": 12,\n        \"name\": \"API User\"\n      },\n      \"app\": null,\n      \"created_at\": \"2026-10-08 09:11:30\",\n      \"data\": {\n        \"ticket\": \"CS-1042\",\n        \"channel\": \"email\"\n      }\n    },\n    {\n      \"id\": 709594,\n      \"order_id\": 178144,\n      \"event\": \"Order Status has been updated from On Hold to: Cancelled\",\n      \"source\": \"system\",\n      \"name\": \"API User\",\n      \"user\": null,\n      \"app\": null,\n      \"created_at\": \"2026-09-25 09:57:19\",\n      \"data\": null\n    }\n  ]\n}"},{"id":"6dbc02c4-d02e-4e87-b3c7-8e8c305cb499","name":"422 - invalid filter","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/order//logs?filters[source]=robot","host":["https://your-company.myhelm.app/public-api"],"path":["order","","logs"],"query":[{"key":"filters[source]","value":"robot"}]}},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field filters.source must be one of: user, app, warehouse_app, system.\"\n  ]\n}"},{"id":"b57a1951-a7d1-4b35-aad7-bb5bb3128027","name":"404 - order not found","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/order//logs?page=1&per_page=20","host":["https://your-company.myhelm.app/public-api"],"path":["order","","logs"],"query":[{"key":"page","value":"1","description":"1-based page number. Default 1."},{"key":"per_page","value":"20","description":"Records per page. Default is the tenant's *Items per page* setting."},{"key":"sort","value":"created_at_desc","description":"`created_at_desc` (default, newest first) or `created_at_asc`.","disabled":true},{"key":"filters[search]","value":"","description":"Partial match on the log text.","disabled":true},{"key":"filters[source]","value":"app","description":"One of `user`, `app`, `warehouse_app`, `system`.","disabled":true},{"key":"filters[app]","value":"","description":"Slug of an installed App Store app. Only logs added by that app.","disabled":true},{"key":"filters[date_from]","value":"2026-10-01","description":"`Y-m-d` or `Y-m-d H:i:s`. Logs created at or after this time.","disabled":true},{"key":"filters[date_to]","value":"2026-10-08","description":"`Y-m-d` or `Y-m-d H:i:s`. A date without a time covers the whole day.","disabled":true}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Order Not Found\"\n}"}],"_postman_id":"85cc98ca-ca4d-484c-99b4-cefa34c59ffa"},{"name":"Add Order Log","id":"7b909e73-f05f-4e8c-8216-6e4def3e66ef","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"event\": \"Customer asked for the parcel to be left with a neighbour.\",   // REQUIRED, up to 5000 characters\n    \"data\":  { \"ticket\": \"CS-1042\", \"channel\": \"email\" }                    // optional JSON object\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_log","description":"<p>Adds an entry to an order's activity log. It shows in the order's log in Helm alongside Helm's own entries and is returned by <strong>List Order Logs</strong>. Adding a log does not change anything else on the order.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only add logs to their own orders (<code>401</code> <code>Unauthorised</code> otherwise).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID. A missing or deleted order returns <code>404</code>.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The log text, up to 5000 characters. Leading and trailing spaces are removed.</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>no</td>\n<td>Any JSON object to store with the entry, up to 60000 bytes once encoded. Returned by <strong>List Order Logs</strong> to non-fulfilment-client users.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"who-the-entry-is-recorded-against\">Who the entry is recorded against</h3>\n<p>The entry is always recorded against the user the bearer token belongs to (<code>source: \"user\"</code>).</p>\n<p>An app installed from the Helm App Store can also send its own access token in the <code>X-App-Token</code> header. The entry is then recorded as coming from that app (<code>source: \"app\"</code> with the app's slug), still under the token's user. A token that does not belong to an installed, active app returns <code>401</code> <code>Invalid or inactive app token</code> and nothing is logged. Leave the header out for an ordinary integration.</p>\n<h3 id=\"response\">Response</h3>\n<p><code>201</code> with the new entry, in the same shape as an entry of <strong>List Order Logs</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","add_log"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b67d8067-8845-4c7a-87f6-68a4a446f9fb","name":"201 - log added","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-App-Token","value":"","description":"Optional. Only for App Store apps, see the description.","disabled":true}],"body":{"mode":"raw","raw":"{\n    \"event\": \"Customer asked for the parcel to be left with a neighbour.\",   // REQUIRED, up to 5000 characters\n    \"data\":  { \"ticket\": \"CS-1042\", \"channel\": \"email\" }                    // optional JSON object\n}"},"url":"https://your-company.myhelm.app/public-api/order//add_log"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 709859,\n  \"order_id\": 178144,\n  \"event\": \"Customer asked for the parcel to be left with a neighbour.\",\n  \"source\": \"user\",\n  \"name\": \"API User\",\n  \"user\": {\n    \"id\": 12,\n    \"name\": \"API User\"\n  },\n  \"app\": null,\n  \"created_at\": \"2026-10-08 09:11:30\",\n  \"data\": {\n    \"ticket\": \"CS-1042\",\n    \"channel\": \"email\"\n  }\n}"},{"id":"b5a0d214-6a13-4a3d-bdbc-15953890f67f","name":"422 - event missing","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-App-Token","value":"","description":"Optional. Only for App Store apps, see the description.","disabled":true}],"body":{"mode":"raw","raw":"{\"event\": \"\"}"},"url":"https://your-company.myhelm.app/public-api/order//add_log"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field event is required.\"\n  ]\n}"},{"id":"f5f20aa1-2755-48fe-902c-30908f728e52","name":"401 - invalid app token","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-App-Token","value":"","description":"Optional. Only for App Store apps, see the description.","disabled":true}],"body":{"mode":"raw","raw":"{\"event\": \"Parcel re-routed\"}"},"url":"https://your-company.myhelm.app/public-api/order//add_log"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Invalid or inactive app token\"\n}"}],"_postman_id":"7b909e73-f05f-4e8c-8216-6e4def3e66ef"},{"name":"Assign Batches to Order Lines","id":"fc8c9a5f-e6d6-4281-afce-e89accee8568","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": [\n        {\n            \"order_inventory_id\": 193982,                     // line on this order\n            \"batches\": [\n                { \"batch_value\": \"BATCH-A\", \"quantity\": 4 },\n                { \"batch_value\": \"BATCH-B\", \"quantity\": 6 }   // quantities must sum to the line quantity\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//assign-batches","description":"<p>Assigns or amends batch selections on an existing order's lines - the write counterpart of <code>GET /order/{id}/batch-values</code>. Only for inventory items with <code>batching_type = 2</code> (batch numbered).</p>\n<p>When a line passes validation its existing allocations are freed first (availability restored), then the requested selection is allocated with exact per-batch quantities - so this endpoint both assigns and re-assigns. A line that fails validation keeps its existing allocation untouched (freeing only happens after validation passes).</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Assign batches to lines that were created without a batch selection.</li>\n<li>Fix a selection rejected at creation time (e.g. after creating the missing batch via <code>add_inventory_batch</code>) - this is the endpoint the creation-time warning message points to.</li>\n<li>Change an existing split (e.g. 4/6 across two batches to 1/9).</li>\n<li>Assign batches to the child lines of an expanded group/kit SKU.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment client tokens can only act on their own orders.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — internal order ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>lines[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least one line required.</td>\n</tr>\n<tr>\n<td><code>lines[].order_inventory_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Order line to assign batches to (must belong to this order).</td>\n</tr>\n<tr>\n<td><code>lines[].batches[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>Batch selection for the line.</td>\n</tr>\n<tr>\n<td><code>lines[].batches[].batch_value</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Existing batch number for the line's inventory item.</td>\n</tr>\n<tr>\n<td><code>lines[].batches[].quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Units to take from that batch (&gt;= 1). Quantities must sum to the line quantity.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Notes:</p>\n<ul>\n<li>Multi-batch per line supported; duplicate <code>batch_value</code> entries are merged.</li>\n<li>A batch value held at several locations is drawn FEFO across locations (all warehouses; pickable, on-hand, non-tote).</li>\n<li>The selection is also saved as the line's batch preference list, so wave/zone re-allocation keeps preferring these batches. Direct allocation flows (e.g. <code>partially_allocate</code>) ignore the preference and re-allocate by pure FEFO, replacing the exact split - call this endpoint again to restore it.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p><code>status</code> is <code>success</code> when every line was fully assigned, <code>partial_success</code> otherwise (HTTP 200 either way). Each line reports <code>fully_assigned</code> and its <code>assigned</code> allocations (<code>batch_value</code>, <code>quantity</code>, <code>location_id</code>, <code>expire_date</code>); problems are reported per line in <code>result.warnings</code>. An invalid selection never fails the request.</p>\n<h4 id=\"warning-codes\">Warning codes</h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Trigger</th>\n<th>Behaviour</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_not_found</code></td>\n<td>Batch value does not exist for that inventory item (a batch of a different inventory item is indistinguishable - lookup is inventory-scoped)</td>\n<td>Whole line falls back to default FEFO selection</td>\n</tr>\n<tr>\n<td><code>quantity_mismatch</code></td>\n<td>Sum of batch quantities != line quantity</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>invalid_batch_payload</code></td>\n<td>Malformed entry (empty <code>batch_value</code>, non-integer or &lt; 1 <code>quantity</code>)</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>line_not_batch_numbered</code></td>\n<td>Inventory item is not batch numbered (<code>batching_type != 2</code>, incl. serial-numbered)</td>\n<td>Selection ignored</td>\n</tr>\n<tr>\n<td><code>unsupported_line_type</code></td>\n<td>Group/kit SKU or dynamic assembly item</td>\n<td>Selection ignored; assign batches to the expanded child lines instead</td>\n</tr>\n<tr>\n<td><code>line_not_found</code></td>\n<td>assign-batches only: <code>order_inventory_id</code> not on this order</td>\n<td>Line skipped</td>\n</tr>\n<tr>\n<td><code>insufficient_batch_stock</code></td>\n<td>Requested quantity exceeds the batch's available stock</td>\n<td>Available quantity assigned, remainder left to default selection</td>\n</tr>\n<tr>\n<td><code>batch_expired</code></td>\n<td>Assigned batch's <code>expire_date</code> is in the past</td>\n<td>Honoured, warning returned</td>\n</tr>\n<tr>\n<td><code>batch_assignment_failed</code></td>\n<td>Unexpected internal error while applying a validated selection</td>\n<td>Selection not applied for the line</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Order not found or deleted</td>\n<td><code>404</code> <code>{\"error\": \"Order Not Found\"}</code></td>\n</tr>\n<tr>\n<td>Not the caller's order (fulfilment client token)</td>\n<td><code>401</code> <code>{\"error\": \"Unauthorised\"}</code></td>\n</tr>\n<tr>\n<td>Order status blocks batch changes (Picking, Picked, Cancelled, Despatched, Merged, Returned, Partially Returned, Despatch Pending)</td>\n<td><code>200</code> <code>{\"error\": \"Batch selections cannot be changed because of order status\"}</code></td>\n</tr>\n<tr>\n<td><code>lines</code> missing or empty</td>\n<td><code>422</code> <code>{\"validation_error\": [\"Lines field is not valid\"]}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","assign-batches"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"368e5818-17b8-4c3c-b5f7-949de1d88897","name":"200 — fully assigned","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": [\n        {\n            \"order_inventory_id\": 193982,\n            \"batches\": [\n                {\n                    \"batch_value\": \"BATCH-A\",\n                    \"quantity\": 1\n                },\n                {\n                    \"batch_value\": \"BATCH-B\",\n                    \"quantity\": 9\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178934/assign-batches"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"result\": {\n        \"lines\": [\n            {\n                \"order_inventory_id\": 193982,\n                \"inventory_id\": 802,\n                \"sku\": \"CLB-API-1\",\n                \"fully_assigned\": true,\n                \"assigned\": [\n                    {\n                        \"batch_value\": \"BATCH-A\",\n                        \"quantity\": 1,\n                        \"location_id\": 12,\n                        \"expire_date\": \"2027-03-01\"\n                    },\n                    {\n                        \"batch_value\": \"BATCH-B\",\n                        \"quantity\": 9,\n                        \"location_id\": 12,\n                        \"expire_date\": null\n                    }\n                ]\n            }\n        ],\n        \"warnings\": []\n    }\n}"},{"id":"91f05245-60d1-45a4-ac14-6fb2e8e4aafd","name":"200 — partial_success with warnings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": [\n        {\n            \"order_inventory_id\": 999999,\n            \"batches\": [\n                {\n                    \"batch_value\": \"BATCH-A\",\n                    \"quantity\": 1\n                }\n            ]\n        },\n        {\n            \"order_inventory_id\": 193986,\n            \"batches\": [\n                {\n                    \"batch_value\": \"BATCH-C\",\n                    \"quantity\": 5\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178935/assign-batches"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"partial_success\",\n    \"result\": {\n        \"lines\": [\n            {\n                \"order_inventory_id\": 193986,\n                \"inventory_id\": 802,\n                \"sku\": \"CLB-API-1\",\n                \"fully_assigned\": false,\n                \"assigned\": [\n                    {\n                        \"batch_value\": \"BATCH-C\",\n                        \"quantity\": 2,\n                        \"location_id\": 12,\n                        \"expire_date\": \"2027-06-01\"\n                    }\n                ]\n            }\n        ],\n        \"warnings\": [\n            {\n                \"code\": \"line_not_found\",\n                \"order_inventory_id\": 999999,\n                \"inventory_id\": null,\n                \"sku\": null,\n                \"batch_values\": [],\n                \"message\": \"Order Inventory Not Found\"\n            },\n            {\n                \"code\": \"insufficient_batch_stock\",\n                \"order_inventory_id\": 193986,\n                \"inventory_id\": 802,\n                \"sku\": \"CLB-API-1\",\n                \"batch_values\": [\n                    \"BATCH-C\"\n                ],\n                \"message\": \"There is not enough available stock in the selected batch numbers (BATCH-C (short by 3)) for the item (CLB-API-1). The available quantities were assigned and the remainder was left to the default selection.\"\n            }\n        ]\n    }\n}"},{"id":"3454ac32-2c30-445e-9ca0-ca6d3f0d7aeb","name":"200 — blocked by order status","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": [\n        {\n            \"order_inventory_id\": 193982,\n            \"batches\": [\n                {\n                    \"batch_value\": \"BATCH-B\",\n                    \"quantity\": 10\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178934/assign-batches"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Batch selections cannot be changed because of order status\"\n}"},{"id":"d9b9fb0c-0f23-4b34-8b5d-7c5b8545b230","name":"401 — not your order (fulfilment client)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": [\n        {\n            \"order_inventory_id\": 193982,\n            \"batches\": [\n                {\n                    \"batch_value\": \"BATCH-B\",\n                    \"quantity\": 10\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178934/assign-batches"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Unauthorised\"\n}"},{"id":"ec41c5b0-c903-41c8-9a0a-d7e81674c614","name":"404 — order not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": [\n        {\n            \"order_inventory_id\": 1,\n            \"batches\": [\n                {\n                    \"batch_value\": \"X\",\n                    \"quantity\": 1\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/99999999/assign-batches"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Order Not Found\"\n}"},{"id":"8c409711-067f-4b3f-b76f-e4f5fcc0703c","name":"422 — empty lines","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"lines\": []\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178935/assign-batches"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": [\n        \"Lines field is not valid\"\n    ]\n}"}],"_postman_id":"fc8c9a5f-e6d6-4281-afce-e89accee8568"},{"name":"Create Order","id":"9e4c2bb2-4100-4408-83c2-177d26c17776","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    // ----- Channel & status -----\n    \"channel_order_id\":   \"WEB-100001\",       // optional; auto-generated if omitted\n    \"manual_channel_id\":  null,               // required only if you have >1 manual sales channel\n    \"status_id\":          1,                  // 1=Draft, 3=Despatch Ready, 2700=Despatch Pending; CANNOT be 5(Despatched) or 2800(New Order)\n    \"date_received\":      \"2026-04-30 09:00:00\",  // optional; defaults to now. Accepts any strtotime format.\n    \"ship_by_date\":       \"2026-05-02 17:00:00\",  // optional\n\n    // ----- Customer contact -----\n    \"email\":              \"customer@example.com\",  // REQUIRED. Auto-matches an existing contact by email and pulls phone/address from there if found.\n    \"phone_one\":          \"+44 1234 567890\",\n\n    // ----- Money -----\n    \"total_paid\":         24.99,              // optional; default 0\n    \"total_discount\":     0.00,               // optional; default 0. Cannot exceed total_paid (422 otherwise)\n    \"total_tax\":          4.16,               // optional; default 0\n    \"shipping_paid\":      3.99,               // optional; default 0\n    \"payment_method\":     \"\",                 // optional; stored empty if omitted or null\n    \"payment_ref\":        \"ch_abc123\",\n    \"payment_currency\":   \"GBP\",              // optional; 3-letter code, defaults to your Default Currency setting\n\n    // ----- Shipping address -----\n    \"shipping_name\":              \"Customer Name\",      // REQUIRED\n    \"shipping_name_company\":      \"\",\n    \"shipping_address_line_one\":  \"1 Example Street\",   // REQUIRED\n    \"shipping_address_line_two\":  \"\",\n    \"shipping_address_city\":      \"London\",             // REQUIRED\n    \"shipping_address_county\":    \"\",\n    \"shipping_address_country\":   \"United Kingdom\",     // REQUIRED\n    \"shipping_address_postcode\":  \"SW1A 1AA\",           // REQUIRED\n    \"shipping_address_iso\":       \"GB\",                 // REQUIRED — ISO 3166-1 alpha-2\n\n    // ----- Invoice address (same shape) -----\n    \"invoice_name\":              \"Customer Name\",\n    \"invoice_address_line_one\":  \"1 Example Street\",\n    \"invoice_address_city\":      \"London\",\n    \"invoice_address_country\":   \"United Kingdom\",\n    \"invoice_address_postcode\":  \"SW1A 1AA\",\n    \"invoice_address_iso\":       \"GB\",\n\n    // ----- Other -----\n    \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n    \"customer_comments\":          \"\",\n    \"gift_note\":                  \"\",\n    \"delivery_instructions\":      \"Leave with neighbour\",\n\n    \"custom_fields\":              {}          // tenant-defined custom fields; validated against schema\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/create","description":"<p>Creates a new order without inventory lines. Use this when you want to create the order header now and add line items later via <strong>Add Inventory to Order</strong>.</p>\n<p>If you already know the line items at creation time, prefer <strong>Create Order with Inventory</strong> (a single round-trip) or <strong>Create Order with Shipment</strong> (creates the order <em>and</em> attaches a pre-generated label in one call).</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Importing orders from a custom channel that doesn't have a built-in connector.</li>\n<li>Creating draft orders that will be edited and confirmed by a back-office user.</li>\n<li>Generating B2B orders programmatically.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>channel_order_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>External order ID. Auto-generated if omitted.</td>\n</tr>\n<tr>\n<td><code>manual_channel_id</code></td>\n<td>int</td>\n<td>conditional</td>\n<td>Required if your tenant has more than one manual sales channel; otherwise the only one is used.</td>\n</tr>\n<tr>\n<td><code>status_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code> (Draft). Cannot be <code>2800</code> (New Order) or <code>5</code> (Despatched).</td>\n</tr>\n<tr>\n<td><code>date_received</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>YYYY-MM-DD HH:MM:SS</code> or any format <code>strtotime</code> accepts. Defaults to now.</td>\n</tr>\n<tr>\n<td><code>ship_by_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>Same format as <code>date_received</code>.</td>\n</tr>\n<tr>\n<td><code>allowed_despatch_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>Only honoured if the <em>Allowed Despatch Date</em> feature is enabled in your tenant.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Customer email. Used as the order email and (by default) as <code>email_shipping</code>.</td>\n</tr>\n<tr>\n<td><code>email_shipping</code></td>\n<td>string</td>\n<td>no</td>\n<td>Shipping notification email. Defaults to <code>email</code>.</td>\n</tr>\n<tr>\n<td><code>phone_one</code> / <code>phone_two</code></td>\n<td>string</td>\n<td>no</td>\n<td>Customer phone numbers.</td>\n</tr>\n<tr>\n<td><code>contact_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Existing contact to link this order to. If supplied, <code>vat_number</code> / <code>eori_number</code> / <code>tax_id</code> / <code>ioss_number</code> / <code>ukims_number</code> updates are applied to that contact.</td>\n</tr>\n<tr>\n<td><code>total_paid</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>. Order total.</td>\n</tr>\n<tr>\n<td><code>total_discount</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>. Must not exceed <code>total_paid</code> — <code>422</code> otherwise.</td>\n</tr>\n<tr>\n<td><code>total_tax</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>total_weight</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code> (re-calculated automatically when inventory is added).</td>\n</tr>\n<tr>\n<td><code>shipping_paid</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>shipping_method_requested</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text description of the requested shipping service.</td>\n</tr>\n<tr>\n<td><code>lock_shipping_method</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. Auto-set to <code>0</code> if <code>shipping_method_requested</code> is empty.</td>\n</tr>\n<tr>\n<td><code>one_off_shipment</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>payment_method</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free text, for example <code>Card</code>. Stored as empty when omitted or <code>null</code>.</td>\n</tr>\n<tr>\n<td><code>payment_ref</code></td>\n<td>string</td>\n<td>no</td>\n<td>Payment reference from your payment provider.</td>\n</tr>\n<tr>\n<td><code>payment_currency</code></td>\n<td>string</td>\n<td>no</td>\n<td>Three-letter currency code, for example <code>GBP</code>, <code>EUR</code> or <code>USD</code>. Lower case is accepted and stored in upper case. When omitted, <code>null</code> or empty, the Default Currency from your Helm settings is used (<code>GBP</code> if that setting is blank). Any other value is rejected with <code>422</code>.</td>\n</tr>\n<tr>\n<td><code>pudo_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>PUDO/pickup point ID.</td>\n</tr>\n<tr>\n<td><code>vat_number</code> / <code>eori_number</code> / <code>tax_id</code> / <code>ioss_number</code> / <code>ukims_number</code></td>\n<td>string</td>\n<td>no</td>\n<td>Customer compliance numbers. Also synced to the linked contact if <code>contact_id</code> is given.</td>\n</tr>\n<tr>\n<td><code>auto_calculate_tax</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Whether the system should recompute tax on edits.</td>\n</tr>\n<tr>\n<td><code>customer_comments</code> / <code>gift_note</code> / <code>delivery_instructions</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text notes.</td>\n</tr>\n<tr>\n<td><code>shipping_name</code> / <code>shipping_name_company</code> / <code>shipping_address_*</code> (line_one, line_two, city, county, country, postcode, iso)</td>\n<td>string</td>\n<td>yes (most)</td>\n<td>Shipping address. The <code>_iso</code> field must be the 2-letter ISO country code.</td>\n</tr>\n<tr>\n<td><code>invoice_name</code> / <code>invoice_name_company</code> / <code>invoice_address_*</code></td>\n<td>string</td>\n<td>yes (most)</td>\n<td>Invoice address. Same shape as shipping.</td>\n</tr>\n<tr>\n<td><code>notes</code></td>\n<td>array of strings</td>\n<td>no</td>\n<td>Each entry is stored as a note on the order.</td>\n</tr>\n<tr>\n<td><code>custom_fields</code></td>\n<td>object</td>\n<td>no</td>\n<td>Tenant-defined custom fields. Validated against the tenant's custom-field definitions.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>For multi-tenant fulfilment. Auto-set to the API user's client if the user is a fulfilment-client user.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"auto-matching-by-email\">Auto-matching by email</h3>\n<p>If the supplied <code>email</code> matches an existing contact (customer), the order is auto-linked to that contact's <code>id</code> and any missing fields (<code>phone_one</code>, etc.) are pulled from the contact. To force a fresh contact pass a unique email.</p>\n<h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Manually-created orders are auto-tagged with <code>API</code>.</li>\n<li>If your tenant has zero manual sales channels configured the API will create one for you on the fly.</li>\n<li>The order is queued for rule processing about a minute after creation.</li>\n</ul>\n<h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>422</code> — <code>discount</code> higher than <code>total_paid</code>, invalid <code>date_received</code>, multiple manual channels with no <code>manual_channel_id</code>, blocked <code>status_id</code>, a <code>payment_currency</code> that is not a three-letter currency code, or invalid <code>custom_fields</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["orders","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b776e1d2-d148-4b75-9c71-d14cbb76e7a9","name":"200 — created","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"email\":\"customer@example.com\",\"shipping_name\":\"Customer Name\",\"invoice_name\":\"Customer Name\",\"shipping_address_iso\":\"GB\",\"invoice_address_iso\":\"GB\"}"},"url":"https://your-company.myhelm.app/public-api/orders/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 6311,\n    \"status_id\": 1,\n    \"sale_type\": \"b2c\",\n    \"allocation_status_id\": 0,\n    \"channel_order_id\": \"API-TEST-ORDER-002\",\n    \"channel_id\": 34,\n    \"contact_id\": 5790,                                  // auto-matched from existing contact by email\n    \"shipping_name\": \"Customer Name\",\n    \"shipping_address_line_one\": \"1 Example Street\",\n    \"shipping_address_postcode\": \"SW1A 1AA\",\n    \"shipping_address_iso\": \"GB\",\n    \"invoice_name\": \"Customer Name\",\n    \"invoice_address_postcode\": \"SW1A 1AA\",\n    \"invoice_address_iso\": \"GB\",\n    \"email\": \"customer@example.com\",\n    \"email_shipping\": \"customer@example.com\",\n    \"phone_one\": \"05555555555\",                          // pulled from matched contact\n    \"total_paid\": \"24.9900\",\n    \"total_discount\": \"0.0000\",\n    \"order_discount\": \"0.0000\",\n    \"total_tax\": \"0.0000\",\n    \"shipping_paid\": \"3.9900\",\n    \"shipping_method_requested\": \"\",\n    \"payment_method\": \"\",\n    \"payment_currency\": \"GBP\",\n    \"sales_channel\": \"Manual\",\n    \"date_received\": \"2026-04-30 11:50:38\",\n    \"date_dispatched\": \"0000-00-00 00:00:00\",\n    \"total_weight\": \"0.000\",\n    \"total_inventory_count\": 0,\n    \"total_inventory_quantity\": 0,\n    \"custom_fields\": {},\n    \"is_archived\": 0,\n    \"created_at\": \"2026-04-30 11:50:38\"\n}"},{"id":"23da44fb-8ffe-4091-b0b4-fee19b9eab79","name":"422 — discount > total_paid","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"total_paid\":10,\"total_discount\":15,\"email\":\"x@y.com\"}"},"url":"https://your-company.myhelm.app/public-api/orders/create"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": {\n        \"discount\": \"The discount amount cannot be higher than the price.\"\n    }\n}"},{"id":"e3439204-72f9-4860-a6ef-919a6a735bf3","name":"422 - invalid payment_currency","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"customer@example.com\",\n    \"payment_currency\": \"EURO\",\n    \"shipping_name\": \"Customer Name\"\n}"},"url":"https://your-company.myhelm.app/public-api/orders/create"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"The payment_currency must be a three-letter currency code, for example GBP.\"\n}"}],"_postman_id":"9e4c2bb2-4100-4408-83c2-177d26c17776"},{"name":"Create Order with Inventory","id":"5cead7a2-f531-4909-84dd-c0cf3196ab9c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order\": {\n        \"channel_order_id\": \"WEB-100002\",\n        \"status_id\": 1,\n        \"email\": \"customer@example.com\",\n        \"total_paid\": 24.99,\n        \"shipping_paid\": 3.99,\n\n        \"payment_method\":     \"\",       // optional; stored empty if omitted or null\n        \"payment_currency\":   \"GBP\",              // optional; 3-letter code, defaults to your Default Currency setting\n\n        \"shipping_name\": \"Customer Name\",\n        \"shipping_address_line_one\": \"1 Example Street\",\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 1AA\",\n        \"shipping_address_iso\": \"GB\",\n\n        \"invoice_name\": \"Customer Name\",\n        \"invoice_address_line_one\": \"1 Example Street\",\n        \"invoice_address_city\": \"London\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"SW1A 1AA\",\n        \"invoice_address_iso\": \"GB\",\n\n        \"custom_fields\": {}\n    },\n    \"order_inventory\": [\n        {\n            \"inventory_id\": 1,\n            \"sku\": \"ha_product_test_1\",\n            \"name\": \"HA Product Test - 1\",\n            \"quantity\": 1,\n            \"unit_price\": 1.00,\n            \"unit_tax\": 0.00,\n            \"line_total_discount\": 0.00\n            // Optional batch selection (batch-numbered items only, quantities must sum to the line quantity):\n            // \"batches\": [ { \"batch_value\": \"BATCH-A\", \"quantity\": 1 } ]\n        },\n        {\n            \"inventory_id\": 2,\n            \"sku\": \"ha_product_test_2\",\n            \"name\": \"HA Product Test - 2\",\n            \"quantity\": 2,\n            \"unit_price\": 2.00\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/create_with_inventory","description":"<p>Creates an order <strong>and</strong> its inventory lines in a single request. Use this when you already know the line items at order-creation time — it's one round-trip instead of an order-create followed by an add-inventory call.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Importing complete orders from a custom channel.</li>\n<li>Creating B2B orders with multiple lines programmatically.</li>\n<li>Recording orders that have already been despatched outside Helm (use <code>status_id: 5</code>).</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"body-shape\">Body shape</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"order\":         { ... order header fields ... },\n  \"order_inventory\": [ { ... line item ... }, ... ]\n}\n</code></pre><h3 id=\"order-fields\"><code>order</code> fields</h3>\n<p>Identical to the body of <strong>Create Order</strong> with one important difference: <code>status_id</code> is restricted to one of <code>1</code> (Draft), <code>3</code> (Despatch Ready), or <code>5</code> (Despatched). Sending <code>2800</code> (New Order) is rejected.</p>\n<p>If you set <code>status_id: 5</code>, the order is recorded as already-despatched: allocations are deducted, despatch emails are queued, and rule-processing is skipped.</p>\n<h3 id=\"order_inventory-fields\"><code>order_inventory[]</code> fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>inventory_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Existing inventory record to link the line to. Match by <code>inventory_id</code> is preferred; if omitted, name/sku are stored as free-text.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Display name on the line. Falls back to the inventory's name if <code>inventory_id</code> is given.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>SKU code on the line.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>unit_price</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>. Stored as the absolute value.</td>\n</tr>\n<tr>\n<td><code>unit_tax</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>line_total_discount</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>options</code></td>\n<td>object</td>\n<td>no</td>\n<td>Free-form key/value attributes. Stored as <code>&lt;br /&gt;</code>-separated strings on the line.</td>\n</tr>\n<tr>\n<td><code>notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-line note.</td>\n</tr>\n<tr>\n<td><code>image_url</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-line image URL.</td>\n</tr>\n<tr>\n<td><code>hs_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>Customs HS/tariff code.</td>\n</tr>\n<tr>\n<td><code>country_of_origin</code></td>\n<td>string</td>\n<td>no</td>\n<td>ISO country code.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>For fulfilment mode; auto-set if the API user is a fulfilment-client user.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Order discount is summed automatically from each line's <code>line_total_discount</code>.</li>\n<li>Manually-created orders are auto-tagged <code>API</code>.</li>\n<li>For <code>status_id == 5</code> (Despatched), the system skips rule-processing.</li>\n</ul>\n<h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>422</code> — empty <code>order</code>, invalid <code>status_id</code> (not 1/3/5), missing required address fields, a <code>payment_currency</code> that is not a three-letter currency code, or any of the <code>Create Order</code> validation conditions.</li>\n</ul>\n<h3 id=\"batch-selection-batch-numbered-items-only\">Batch selection (batch-numbered items only)</h3>\n<p>Each item accepts an optional <code>batches</code> array to pin specific batches instead of Helm's default expiry-based (FEFO) auto-selection. Only for inventory items with <code>batching_type = 2</code>; the selection is applied as an immediate stock allocation with exact per-batch quantities.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_inventory[].batches[]</code></td>\n<td>array</td>\n<td>no</td>\n<td>Optional batch selection for the line.</td>\n</tr>\n<tr>\n<td><code>order_inventory[].batches[].batch_value</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Existing batch number for this inventory item (created via <code>add_inventory_batch</code>).</td>\n</tr>\n<tr>\n<td><code>order_inventory[].batches[].quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Units to take from that batch (&gt;= 1). Quantities must sum to the line quantity.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Notes:</p>\n<ul>\n<li>Multi-batch per line is supported (split a line across batches).</li>\n<li>Duplicate <code>batch_value</code> entries are merged (quantities summed).</li>\n<li>A batch value held at several locations is drawn FEFO across locations (all warehouses; pickable, on-hand, non-tote locations - same scope as the UI batch selector).</li>\n<li>The selection is also saved as the line's batch preference list (same mechanism as the order-edit UI), so wave/zone re-allocation keeps preferring these batches.</li>\n<li>An invalid selection NEVER fails the request: the line is still created, falls back to default selection, and the problem is reported in a <code>warnings</code> array on the returned order object (present only when batch selections produced warnings). HTTP status stays 200.</li>\n<li>Each successfully processed item gains a <code>batch_assignments</code> array in the response showing what was actually allocated (<code>batch_value</code>, <code>quantity</code>, <code>location_id</code>, <code>expire_date</code>).</li>\n<li>Verify assignments any time via <code>GET /order/{id}/batch-values?include=allocations</code>.</li>\n</ul>\n<h4 id=\"warning-codes\">Warning codes</h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Trigger</th>\n<th>Behaviour</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_not_found</code></td>\n<td>Batch value does not exist for that inventory item (a batch of a different inventory item is indistinguishable - lookup is inventory-scoped)</td>\n<td>Whole line falls back to default FEFO selection</td>\n</tr>\n<tr>\n<td><code>quantity_mismatch</code></td>\n<td>Sum of batch quantities != line quantity</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>invalid_batch_payload</code></td>\n<td>Malformed entry (empty <code>batch_value</code>, non-integer or &lt; 1 <code>quantity</code>)</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>line_not_batch_numbered</code></td>\n<td>Inventory item is not batch numbered (<code>batching_type != 2</code>, incl. serial-numbered)</td>\n<td>Selection ignored</td>\n</tr>\n<tr>\n<td><code>unsupported_line_type</code></td>\n<td>Group/kit SKU or dynamic assembly item</td>\n<td>Selection ignored; assign batches to the expanded child lines instead</td>\n</tr>\n<tr>\n<td><code>line_not_found</code></td>\n<td>assign-batches only: <code>order_inventory_id</code> not on this order</td>\n<td>Line skipped</td>\n</tr>\n<tr>\n<td><code>insufficient_batch_stock</code></td>\n<td>Requested quantity exceeds the batch's available stock</td>\n<td>Available quantity assigned, remainder left to default selection</td>\n</tr>\n<tr>\n<td><code>batch_expired</code></td>\n<td>Assigned batch's <code>expire_date</code> is in the past</td>\n<td>Honoured, warning returned</td>\n</tr>\n<tr>\n<td><code>batch_assignment_failed</code></td>\n<td>Unexpected internal error while applying a validated selection</td>\n<td>Selection not applied for the line</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["orders","create_with_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"00a81ba3-e72c-4e37-962a-2a4414424c53","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order\": {\n        \"channel_order_id\": \"WEB-100002\",\n        \"status_id\": 1,\n        \"email\": \"customer@example.com\",\n        \"total_paid\": 24.99,\n        \"shipping_paid\": 3.99,\n\n        \"shipping_name\": \"Customer Name\",\n        \"shipping_address_line_one\": \"1 Example Street\",\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 1AA\",\n        \"shipping_address_iso\": \"GB\",\n\n        \"invoice_name\": \"Customer Name\",\n        \"invoice_address_line_one\": \"1 Example Street\",\n        \"invoice_address_city\": \"London\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"SW1A 1AA\",\n        \"invoice_address_iso\": \"GB\",\n\n        \"custom_fields\": {}\n    },\n    \"order_inventory\": [\n        {\n            \"inventory_id\": 1,\n            \"sku\": \"ha_product_test_1\",\n            \"name\": \"HA Product Test - 1\",\n            \"quantity\": 1,\n            \"unit_price\": 1.00,\n            \"unit_tax\": 0.00,\n            \"line_total_discount\": 0.00\n        },\n        {\n            \"inventory_id\": 2,\n            \"sku\": \"ha_product_test_2\",\n            \"name\": \"HA Product Test - 2\",\n            \"quantity\": 2,\n            \"unit_price\": 2.00\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/create_with_inventory","description":"Creates an order **and** its inventory lines in a single request. Use this when you already know the line items at order-creation time — it's one round-trip instead of an order-create followed by an add-inventory call.\n\n### Use cases\n- Importing complete orders from a custom channel.\n- Creating B2B orders with multiple lines programmatically.\n- Recording orders that have already been despatched outside Helm (use `status_id: 5`).\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Body shape\n\n```\n{\n  \"order\":         { ... order header fields ... },\n  \"order_inventory\": [ { ... line item ... }, ... ]\n}\n```\n\n### `order` fields\nIdentical to the body of **Create Order** with one important difference: `status_id` is restricted to one of `1` (Draft), `3` (Despatch Ready), or `5` (Despatched). Sending `2800` (New Order) is rejected.\n\nIf you set `status_id: 5`, the order is recorded as already-despatched: allocations are deducted, despatch emails are queued, and rule-processing is skipped.\n\n### `order_inventory[]` fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `inventory_id` | int | no | Existing inventory record to link the line to. Match by `inventory_id` is preferred; if omitted, name/sku are stored as free-text. |\n| `name` | string | no | Display name on the line. Falls back to the inventory's name if `inventory_id` is given. |\n| `sku` | string | no | SKU code on the line. |\n| `quantity` | int | no | Default `1`. |\n| `unit_price` | number | no | Default `0`. Stored as the absolute value. |\n| `unit_tax` | number | no | Default `0`. |\n| `line_total_discount` | number | no | Default `0`. |\n| `options` | object | no | Free-form key/value attributes. Stored as `<br />`-separated strings on the line. |\n| `notes` | string | no | Per-line note. |\n| `image_url` | string | no | Per-line image URL. |\n| `hs_code` | string | no | Customs HS/tariff code. |\n| `country_of_origin` | string | no | ISO country code. |\n| `fulfilment_client_id` | int | no | For fulfilment mode; auto-set if the API user is a fulfilment-client user. |\n\n### Notes\n- Order discount is summed automatically from each line's `line_total_discount`.\n- Manually-created orders are auto-tagged `API`.\n- For `status_id == 5` (Despatched), the system skips rule-processing.\n\n### Errors\n- `422` — empty `order`, invalid `status_id` (not 1/3/5), missing required address fields, or any of the `Create Order` validation conditions.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6314,\n  \"status_id\": 1,\n  \"previous_status_id\": null,\n  \"sale_type\": \"b2c\",\n  \"allocation_status_id\": 0,\n  \"bulk_despatched_without_allocation\": 0,\n  \"channel_order_id\": \"POSTMAN-TEST-G1-WI\",\n  \"chapi_id\": null,\n  \"channel_id\": 34,\n  \"channel_username\": null,\n  \"channel_alt_id\": null,\n  \"is_merge\": 0,\n  \"is_merged_with_new_logic\": 0,\n  \"is_revertable\": 1,\n  \"merge_order_summary_id\": null,\n  \"is_split\": 0,\n  \"split_order_summary_id\": null,\n  \"is_sorted\": 0,\n  \"contact_id\": 5794,\n  \"shipping_name_company\": null,\n  \"shipping_name\": \"Customer Name\",\n  \"shipping_address_line_one\": \"1 Example Street\",\n  \"shipping_address_line_two\": null,\n  \"shipping_address_city\": \"London\",\n  \"shipping_address_county\": null,\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"SW1A 1AA\",\n  \"shipping_address_packing_postcode\": null,\n  \"shipping_address_iso\": \"GB\",\n  \"invoice_name_company\": null,\n  \"invoice_name\": \"Customer Name\",\n  \"invoice_address_line_one\": \"1 Example Street\",\n  \"invoice_address_line_two\": null,\n  \"invoice_address_city\": \"London\",\n  \"invoice_address_county\": null,\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"SW1A 1AA\",\n  \"invoice_address_iso\": \"GB\",\n  \"email\": \"g1wi@example.com\",\n  \"email_shipping\": \"g1wi@example.com\",\n  \"phone_one\": \"05555555555\",\n  \"phone_two\": null,\n  \"total_paid\": \"24.9900\",\n  \"total_discount\": \"0.0000\",\n  \"order_discount\": \"0.0000\",\n  \"total_tax\": \"0.0000\",\n  \"auto_calculate_tax\": 1,\n  \"shipping_paid\": \"3.9900\",\n  \"shipping_method_requested\": \"\",\n  \"lock_shipping_method\": 0,\n  \"shipping_tracking_code\": null,\n  \"payment_method\": \"\",\n  \"payment_ref\": null,\n  \"payment_currency\": \"GBP\",\n  \"sales_channel\": \"Manual\",\n  \"date_received\": \"2026-04-30 12:09:39\",\n  \"date_dispatched\": \"0000-00-00 00:00:00\",\n  \"collection_date\": null,\n  \"allowed_despatch_date\": null,\n  \"ship_by_date\": null,\n  \"customer_comments\": null,\n  \"gift_note\": null,\n  \"delivery_instructions\": null,\n  \"deleted\": 0,\n  \"deleted_at\": null,\n  \"channel_updated\": 0,\n  \"channel_updated_time\": 0,\n  \"total_weight\": \"0.000\",\n  \"one_off_shipment\": 0,\n  \"shipment_id\": null,\n  \"fulfilment_client_id\": null,\n  \"sync_informed\": 0,\n  \"total_inventory_count\": 0,\n  \"total_inventory_quantity\": 0,\n  \"stock_levels_adjusted\": 0,\n  \"custom_fields\": {},\n  \"pudo_id\": null,\n  \"ioss_number\": null,\n  \"ukims_number\": null,\n  \"vat_number\": null,\n  \"eori_number\": null,\n  \"tax_id\": null,\n  \"access_url\": null,\n  \"packer_id\": null,\n  \"packed_at\": 0,\n  \"calculated_shipping_service\": null,\n  \"calculated_shipping_service_run_count\": 0,\n  \"is_sent_accounting_invoice\": 0,\n  \"pregenerated_label\": 0,\n  \"has_ecommerce_return\": 0,\n  \"is_locked\": 0,\n  \"is_bopis\": 0,\n  \"is_easyship\": 0,\n  \"is_force_despatched\": 0,\n  \"is_force_locked\": 0,\n  \"is_dropship\": 0,\n  \"fulfilment_job_status\": 0,\n  \"is_new_order\": 0,\n  \"is_archived\": 0,\n  \"created_at\": \"2026-04-30 13:09:39\",\n  \"updated_at\": \"2026-04-30 13:09:39\",\n  \"webhook_run_id\": null,\n  \"batch_label\": 0,\n  \"is_mcf\": 0,\n  \"mcf_plugin_id\": null,\n  \"created_date\": \"2026-04-30\",\n  \"is_pos\": 0,\n  \"tracking_status_id\": null,\n  \"dtpp_run\": null,\n  \"dtpp_queue_status\": null,\n  \"dtpp_started_at\": null,\n  \"dtpp_queue_error\": null,\n  \"pick_completed_at\": null,\n  \"status\": {\n    \"id\": 1,\n    \"status_type_id\": 1,\n    \"status\": \"Draft\",\n    \"icon\": \"fa-paperclip\",\n    \"dashboard\": 0,\n    \"fulfilment_client_status\": 1,\n    \"fulfilment_status\": null,\n    \"fulfilment_icon\": \"\",\n    \"fulfilment_dashboard\": 0,\n    \"allow_fulfilment_editable\": 1,\n    \"fulfilment_color\": \"\",\n    \"fulfilment_text_color\": \"white\",\n    \"hidden\": 0,\n    \"deleted\": 0,\n    \"sort\": 1,\n    \"side_menu\": 0,\n    \"label\": \"label-draft\",\n    \"enable_split\": 1,\n    \"allow_despatch\": 1,\n    \"is_readonly\": 1,\n    \"enable_pick_creation\": 1,\n    \"enable_print_creation\": 1,\n    \"date_created\": 0,\n    \"last_updated\": 1590404287,\n    \"status_colour\": \"\",\n    \"status_text_colour\": \"white\"\n  },\n  \"status_description\": \"Draft\",\n  \"inventory\": [\n    {\n      \"id\": 21154,\n      \"inventory_id\": 1,\n      \"order_summary_id\": 6314,\n      \"merge_order_summary_id\": null,\n      \"sales_channel_item_id\": null,\n      \"channel_product_sku\": null,\n      \"sku\": \"ha_product_test_1\",\n      \"kit_sku\": null,\n      \"quantity\": 1,\n      \"kit_quantity\": null,\n      \"name\": \"HA Product Test - 1\",\n      \"unit_price\": \"1.0000\",\n      \"unit_tax\": \"0.0000\",\n      \"line_total_discount\": \"0.0000\",\n      \"price\": \"1.0000\",\n      \"options\": \"\",\n      \"selected_batches\": null,\n      \"notes\": \"\",\n      \"hs_code\": null,\n      \"country_of_origin\": null,\n      \"customs_description\": null,\n      \"allocated_location_list\": null,\n      \"temp_identifier\": null,\n      \"created_at\": \"2026-04-30 13:09:39\",\n      \"updated_at\": \"2026-04-30 13:09:39\"\n    },\n    {\n      \"id\": 21155,\n      \"inventory_id\": 2,\n      \"order_summary_id\": 6314,\n      \"merge_order_summary_id\": null,\n      \"sales_channel_item_id\": null,\n      \"channel_product_sku\": null,\n      \"sku\": \"ha_product_test_2\",\n      \"kit_sku\": null,\n      \"quantity\": 2,\n      \"kit_quantity\": null,\n      \"name\": \"HA Product Test - 2\",\n      \"unit_price\": \"2.0000\",\n      \"unit_tax\": \"0.0000\",\n      \"line_total_discount\": \"0.0000\",\n      \"price\": \"4.0000\",\n      \"options\": \"\",\n      \"selected_batches\": null,\n      \"notes\": \"\",\n      \"hs_code\": null,\n      \"country_of_origin\": null,\n      \"customs_description\": null,\n      \"allocated_location_list\": null,\n      \"temp_identifier\": null,\n      \"created_at\": \"2026-04-30 13:09:39\",\n      \"updated_at\": \"2026-04-30 13:09:39\"\n    }\n  ]\n}"}],"_postman_id":"5cead7a2-f531-4909-84dd-c0cf3196ab9c"},{"name":"Create Order with Shipment","id":"c5981387-39db-4112-b190-1879d0aaecc5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order\": {\n        \"channel_order_id\": \"WEB-100003\",\n        \"status_id\": 5,\n        \"email\": \"customer@example.com\",\n        \"total_paid\": 24.99,\n        \"shipping_paid\": 3.99,\n\n        \"payment_method\":     \"\",       // optional; stored empty if omitted or null\n        \"payment_currency\":   \"GBP\",              // optional; 3-letter code, defaults to your Default Currency setting\n\n        \"shipping_name\": \"Customer Name\",\n        \"shipping_address_line_one\": \"1 Example Street\",\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 1AA\",\n        \"shipping_address_iso\": \"GB\",\n\n        \"invoice_name\": \"Customer Name\",\n        \"invoice_address_line_one\": \"1 Example Street\",\n        \"invoice_address_city\": \"London\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"SW1A 1AA\",\n        \"invoice_address_iso\": \"GB\"\n    },\n    \"order_inventory\": [\n        { \"inventory_id\": 1, \"sku\": \"ha_product_test_1\", \"quantity\": 1, \"unit_price\": 1.00 }\n        // Optional per line: \"batches\": [ { \"batch_value\": \"BATCH-A\", \"quantity\": 1 } ]  (batch-numbered items only)\n    ],\n    \"shipment\": {\n        \"courier_service_name\": \"Royal Mail Tracked 24\",\n        \"tracking_codes\": [\"AB123456789GB\"],\n        \"shipping_tracking_urls\": [\"https://track.example.com/AB123456789GB\"],\n        \"shipping_label\": \"https://example.com/labels/abc.pdf\",\n        \"shipping_label_type\": \"pdf_url\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/create_with_shipment","description":"<p>Creates an order, its inventory lines, <strong>and</strong> a pre-generated shipping label in a single call. Use this for the despatch-elsewhere flow: when the label was generated outside Helm and you want to record the result.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Recording orders that were already shipped via a third-party WMS or marketplace courier.</li>\n<li>Importing historical orders together with their tracking history.</li>\n<li>Migrating orders from another platform.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"body-shape\">Body shape</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"order\":           { ... order header fields ... },\n  \"order_inventory\": [ { ... line item ... }, ... ],\n  \"shipment\":        { ... pre-generated label ... }\n}\n</code></pre><h3 id=\"order-and-order_inventory\"><code>order</code> and <code>order_inventory[]</code></h3>\n<p>Same as <strong>Create Order with Inventory</strong> above. <code>status_id</code> must be <code>1</code> (Draft), <code>3</code> (Despatch Ready), or <code>5</code> (Despatched).</p>\n<h3 id=\"shipment-fields\"><code>shipment</code> fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>courier_service_name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Exact name of an existing courier service in your tenant. Look these up via <strong>Couriers → List Courier Services</strong>.</td>\n</tr>\n<tr>\n<td><code>tracking_codes</code></td>\n<td>string or array of strings</td>\n<td>yes</td>\n<td>Tracking number(s) returned by the courier.</td>\n</tr>\n<tr>\n<td><code>shipping_tracking_urls</code></td>\n<td>string or array of strings</td>\n<td>yes</td>\n<td>Tracking URL(s) for the customer.</td>\n</tr>\n<tr>\n<td><code>shipping_label</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Either a URL pointing to a label artefact (PDF or HTML) <strong>or</strong> a base64-encoded PDF document.</td>\n</tr>\n<tr>\n<td><code>shipping_label_type</code></td>\n<td>string</td>\n<td>yes</td>\n<td>One of <code>pdf_url</code>, <code>pdf_base64</code>, <code>html_url</code> — describes what was sent in <code>shipping_label</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>The label is downloaded/decoded and persisted under tenant storage.</li>\n<li>Manually-created orders are auto-tagged <code>API - PREGEN</code>.</li>\n<li>For <code>status_id == 5</code> (Despatched), the system stamps <code>shipment_id</code>, <code>date_dispatched</code>, deducts allocations, and skips rule-processing.</li>\n</ul>\n<h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>422</code> — empty <code>order</code>, missing required <code>shipment</code> fields, invalid <code>shipping_label_type</code>, courier service not found, a <code>payment_currency</code> that is not a three-letter currency code, or any <code>Create Order</code> validation issue.</li>\n</ul>\n<h3 id=\"batch-selection-batch-numbered-items-only\">Batch selection (batch-numbered items only)</h3>\n<p>Each item accepts an optional <code>batches</code> array to pin specific batches instead of Helm's default expiry-based (FEFO) auto-selection. Only for inventory items with <code>batching_type = 2</code>; the selection is applied as an immediate stock allocation with exact per-batch quantities.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_inventory[].batches[]</code></td>\n<td>array</td>\n<td>no</td>\n<td>Optional batch selection for the line.</td>\n</tr>\n<tr>\n<td><code>order_inventory[].batches[].batch_value</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Existing batch number for this inventory item (created via <code>add_inventory_batch</code>).</td>\n</tr>\n<tr>\n<td><code>order_inventory[].batches[].quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Units to take from that batch (&gt;= 1). Quantities must sum to the line quantity.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Notes:</p>\n<ul>\n<li>Multi-batch per line is supported (split a line across batches).</li>\n<li>Duplicate <code>batch_value</code> entries are merged (quantities summed).</li>\n<li>A batch value held at several locations is drawn FEFO across locations (all warehouses; pickable, on-hand, non-tote locations - same scope as the UI batch selector).</li>\n<li>The selection is also saved as the line's batch preference list (same mechanism as the order-edit UI), so wave/zone re-allocation keeps preferring these batches.</li>\n<li>An invalid selection NEVER fails the request: the line is still created, falls back to default selection, and the problem is reported in a <code>warnings</code> array on the returned order object (present only when batch selections produced warnings). HTTP status stays 200.</li>\n<li>Each successfully processed item gains a <code>batch_assignments</code> array in the response showing what was actually allocated (<code>batch_value</code>, <code>quantity</code>, <code>location_id</code>, <code>expire_date</code>).</li>\n<li>Verify assignments any time via <code>GET /order/{id}/batch-values?include=allocations</code>.</li>\n</ul>\n<h4 id=\"warning-codes\">Warning codes</h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Trigger</th>\n<th>Behaviour</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_not_found</code></td>\n<td>Batch value does not exist for that inventory item (a batch of a different inventory item is indistinguishable - lookup is inventory-scoped)</td>\n<td>Whole line falls back to default FEFO selection</td>\n</tr>\n<tr>\n<td><code>quantity_mismatch</code></td>\n<td>Sum of batch quantities != line quantity</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>invalid_batch_payload</code></td>\n<td>Malformed entry (empty <code>batch_value</code>, non-integer or &lt; 1 <code>quantity</code>)</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>line_not_batch_numbered</code></td>\n<td>Inventory item is not batch numbered (<code>batching_type != 2</code>, incl. serial-numbered)</td>\n<td>Selection ignored</td>\n</tr>\n<tr>\n<td><code>unsupported_line_type</code></td>\n<td>Group/kit SKU or dynamic assembly item</td>\n<td>Selection ignored; assign batches to the expanded child lines instead</td>\n</tr>\n<tr>\n<td><code>line_not_found</code></td>\n<td>assign-batches only: <code>order_inventory_id</code> not on this order</td>\n<td>Line skipped</td>\n</tr>\n<tr>\n<td><code>insufficient_batch_stock</code></td>\n<td>Requested quantity exceeds the batch's available stock</td>\n<td>Available quantity assigned, remainder left to default selection</td>\n</tr>\n<tr>\n<td><code>batch_expired</code></td>\n<td>Assigned batch's <code>expire_date</code> is in the past</td>\n<td>Honoured, warning returned</td>\n</tr>\n<tr>\n<td><code>batch_assignment_failed</code></td>\n<td>Unexpected internal error while applying a validated selection</td>\n<td>Selection not applied for the line</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["orders","create_with_shipment"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"e6ff7b93-76bc-415b-9c03-9778edc53f91","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order\": {\n        \"channel_order_id\": \"WEB-100003\",\n        \"status_id\": 5,\n        \"email\": \"customer@example.com\",\n        \"total_paid\": 24.99,\n        \"shipping_paid\": 3.99,\n\n        \"shipping_name\": \"Customer Name\",\n        \"shipping_address_line_one\": \"1 Example Street\",\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 1AA\",\n        \"shipping_address_iso\": \"GB\",\n\n        \"invoice_name\": \"Customer Name\",\n        \"invoice_address_line_one\": \"1 Example Street\",\n        \"invoice_address_city\": \"London\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"SW1A 1AA\",\n        \"invoice_address_iso\": \"GB\"\n    },\n    \"order_inventory\": [\n        { \"inventory_id\": 1, \"sku\": \"ha_product_test_1\", \"quantity\": 1, \"unit_price\": 1.00 }\n    ],\n    \"shipment\": {\n        \"courier_service_name\": \"Royal Mail Tracked 24\",\n        \"tracking_codes\": [\"AB123456789GB\"],\n        \"shipping_tracking_urls\": [\"https://track.example.com/AB123456789GB\"],\n        \"shipping_label\": \"https://example.com/labels/abc.pdf\",\n        \"shipping_label_type\": \"pdf_url\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/create_with_shipment","description":"Creates an order, its inventory lines, **and** a pre-generated shipping label in a single call. Use this for the despatch-elsewhere flow: when the label was generated outside Helm and you want to record the result.\n\n### Use cases\n- Recording orders that were already shipped via a third-party WMS or marketplace courier.\n- Importing historical orders together with their tracking history.\n- Migrating orders from another platform.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Body shape\n\n```\n{\n  \"order\":           { ... order header fields ... },\n  \"order_inventory\": [ { ... line item ... }, ... ],\n  \"shipment\":        { ... pre-generated label ... }\n}\n```\n\n### `order` and `order_inventory[]`\nSame as **Create Order with Inventory** above. `status_id` must be `1` (Draft), `3` (Despatch Ready), or `5` (Despatched).\n\n### `shipment` fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `courier_service_name` | string | yes | Exact name of an existing courier service in your tenant. Look these up via **Couriers → List Courier Services**. |\n| `tracking_codes` | string or array of strings | yes | Tracking number(s) returned by the courier. |\n| `shipping_tracking_urls` | string or array of strings | yes | Tracking URL(s) for the customer. |\n| `shipping_label` | string | yes | Either a URL pointing to a label artefact (PDF or HTML) **or** a base64-encoded PDF document. |\n| `shipping_label_type` | string | yes | One of `pdf_url`, `pdf_base64`, `html_url` — describes what was sent in `shipping_label`. |\n\n### Notes\n- The label is downloaded/decoded and persisted under tenant storage.\n- Manually-created orders are auto-tagged `API - PREGEN`.\n- For `status_id == 5` (Despatched), the system stamps `shipment_id`, `date_dispatched`, deducts allocations, and skips rule-processing.\n\n### Errors\n- `422` — empty `order`, missing required `shipment` fields, invalid `shipping_label_type`, courier service not found, or any `Create Order` validation issue.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6315,\n  \"status_id\": 5,\n  \"previous_status_id\": null,\n  \"sale_type\": \"b2c\",\n  \"allocation_status_id\": 0,\n  \"bulk_despatched_without_allocation\": 0,\n  \"channel_order_id\": \"POSTMAN-TEST-G1-WS\",\n  \"chapi_id\": null,\n  \"channel_id\": 34,\n  \"channel_username\": null,\n  \"channel_alt_id\": null,\n  \"is_merge\": 0,\n  \"is_merged_with_new_logic\": 0,\n  \"is_revertable\": 1,\n  \"merge_order_summary_id\": null,\n  \"is_split\": 0,\n  \"split_order_summary_id\": null,\n  \"is_sorted\": 0,\n  \"contact_id\": 5794,\n  \"shipping_name_company\": null,\n  \"shipping_name\": \"Customer Name\",\n  \"shipping_address_line_one\": \"1 Example Street\",\n  \"shipping_address_line_two\": null,\n  \"shipping_address_city\": \"London\",\n  \"shipping_address_county\": null,\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"SW1A 1AA\",\n  \"shipping_address_packing_postcode\": null,\n  \"shipping_address_iso\": \"GB\",\n  \"invoice_name_company\": null,\n  \"invoice_name\": \"Customer Name\",\n  \"invoice_address_line_one\": \"1 Example Street\",\n  \"invoice_address_line_two\": null,\n  \"invoice_address_city\": \"London\",\n  \"invoice_address_county\": null,\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"SW1A 1AA\",\n  \"invoice_address_iso\": \"GB\",\n  \"email\": \"g1ws@example.com\",\n  \"email_shipping\": \"g1ws@example.com\",\n  \"phone_one\": \"05555555555\",\n  \"phone_two\": null,\n  \"total_paid\": \"24.9900\",\n  \"total_discount\": \"0.0000\",\n  \"order_discount\": \"0.0000\",\n  \"total_tax\": \"0.0000\",\n  \"auto_calculate_tax\": 1,\n  \"shipping_paid\": \"3.9900\",\n  \"shipping_method_requested\": \"\",\n  \"lock_shipping_method\": 0,\n  \"shipping_tracking_code\": null,\n  \"payment_method\": \"\",\n  \"payment_ref\": null,\n  \"payment_currency\": \"GBP\",\n  \"sales_channel\": \"Manual\",\n  \"date_received\": \"2026-04-30 12:09:49\",\n  \"date_dispatched\": \"0000-00-00 00:00:00\",\n  \"collection_date\": null,\n  \"allowed_despatch_date\": null,\n  \"ship_by_date\": null,\n  \"customer_comments\": null,\n  \"gift_note\": null,\n  \"delivery_instructions\": null,\n  \"deleted\": 0,\n  \"deleted_at\": null,\n  \"channel_updated\": 0,\n  \"channel_updated_time\": 0,\n  \"total_weight\": \"0.000\",\n  \"one_off_shipment\": 0,\n  \"shipment_id\": null,\n  \"fulfilment_client_id\": null,\n  \"sync_informed\": 0,\n  \"total_inventory_count\": 0,\n  \"total_inventory_quantity\": 0,\n  \"stock_levels_adjusted\": 0,\n  \"custom_fields\": {},\n  \"pudo_id\": null,\n  \"ioss_number\": null,\n  \"ukims_number\": null,\n  \"vat_number\": null,\n  \"eori_number\": null,\n  \"tax_id\": null,\n  \"access_url\": null,\n  \"packer_id\": null,\n  \"packed_at\": 0,\n  \"calculated_shipping_service\": null,\n  \"calculated_shipping_service_run_count\": 0,\n  \"is_sent_accounting_invoice\": 0,\n  \"pregenerated_label\": 0,\n  \"has_ecommerce_return\": 0,\n  \"is_locked\": 0,\n  \"is_bopis\": 0,\n  \"is_easyship\": 0,\n  \"is_force_despatched\": 0,\n  \"is_force_locked\": 0,\n  \"is_dropship\": 0,\n  \"fulfilment_job_status\": 0,\n  \"is_new_order\": 0,\n  \"is_archived\": 0,\n  \"created_at\": \"2026-04-30 13:09:49\",\n  \"updated_at\": \"2026-04-30 13:09:49\",\n  \"webhook_run_id\": null,\n  \"batch_label\": 0,\n  \"is_mcf\": 0,\n  \"mcf_plugin_id\": null,\n  \"created_date\": \"2026-04-30\",\n  \"is_pos\": 0,\n  \"tracking_status_id\": null,\n  \"dtpp_run\": null,\n  \"dtpp_queue_status\": null,\n  \"dtpp_started_at\": null,\n  \"dtpp_queue_error\": null,\n  \"pick_completed_at\": null,\n  \"status\": {\n    \"id\": 5,\n    \"status_type_id\": 1,\n    \"status\": \"Despatched\",\n    \"icon\": \"fa-check\",\n    \"dashboard\": 1,\n    \"fulfilment_client_status\": 0,\n    \"fulfilment_status\": null,\n    \"fulfilment_icon\": \"\",\n    \"fulfilment_dashboard\": 0,\n    \"allow_fulfilment_editable\": 0,\n    \"fulfilment_color\": \"\",\n    \"fulfilment_text_color\": \"white\",\n    \"hidden\": 0,\n    \"deleted\": 0,\n    \"sort\": 7,\n    \"side_menu\": 0,\n    \"label\": \"label-despatched\",\n    \"enable_split\": 0,\n    \"allow_despatch\": 0,\n    \"is_readonly\": 1,\n    \"enable_pick_creation\": 0,\n    \"enable_print_creation\": 1,\n    \"date_created\": 0,\n    \"last_updated\": 0,\n    \"status_colour\": \"\",\n    \"status_text_colour\": \"white\"\n  },\n  \"status_description\": \"Despatched\",\n  \"inventory\": [\n    {\n      \"id\": 21156,\n      \"inventory_id\": 1,\n      \"order_summary_id\": 6315,\n      \"merge_order_summary_id\": null,\n      \"sales_channel_item_id\": null,\n      \"channel_product_sku\": null,\n      \"sku\": \"ha_product_test_1\",\n      \"kit_sku\": null,\n      \"quantity\": 1,\n      \"kit_quantity\": null,\n      \"name\": \"HA Product Test - 1\",\n      \"unit_price\": \"1.0000\",\n      \"unit_tax\": \"0.0000\",\n      \"line_total_discount\": \"0.0000\",\n      \"price\": \"1.0000\",\n      \"options\": \"\",\n      \"selected_batches\": null,\n      \"notes\": \"\",\n      \"hs_code\": null,\n      \"country_of_origin\": null,\n      \"customs_description\": null,\n      \"allocated_location_list\": null,\n      \"temp_identifier\": null,\n      \"created_at\": \"2026-04-30 13:09:49\",\n      \"updated_at\": \"2026-04-30 13:09:49\"\n    }\n  ],\n  \"inventory_names_usage\": \"internal\",\n  \"print_process\": {\n    \"id\": 3613,\n    \"order_summary_id\": 6315,\n    \"process_ref\": \"DC1777550989240\",\n    \"print_time\": 1777550989,\n    \"created_at\": \"2026-04-30 13:09:49\",\n    \"updated_at\": \"2026-04-30 13:09:49\"\n  },\n  \"shipment\": {\n    \"id\": 4011,\n    \"order_print_process_id\": 3613,\n    \"alt_reference\": null,\n    \"request_id\": \"177755098963156295607\",\n    \"label_reference\": null,\n    \"second_label_reference\": null,\n    \"dc_request_id\": null,\n    \"invoiced\": 0,\n    \"cancelled\": 0,\n    \"label_fetched\": 0,\n    \"manifested\": 0,\n    \"is_international\": 0,\n    \"sale_type\": \"b2c\",\n    \"courier_service_id\": 1,\n    \"courier_service_name\": \"CustomIntegrationTestAccountService\",\n    \"capi_courier\": null,\n    \"shipping_tracking_code\": \"AB123456789GB\",\n    \"shipping_tracking_urls\": \"https://track.example.com/AB123456789GB\",\n    \"shipping_weight\": \"1.000\",\n    \"shipping_cost\": \"0.0000\",\n    \"picking_cost\": \"0.0000\",\n    \"shipment_total_cost\": \"0.0000\",\n    \"parcel_rule_total_cost\": \"0.0000\",\n    \"total_value\": \"24.9900\",\n    \"shipping_label\": \"storage/pregeneratedlabels/6315_label.pdf\",\n    \"shipping_label_type\": \"pdf\",\n    \"commercial_label\": null,\n    \"commercial_label_type\": null,\n    \"shipping_name_company\": \"\",\n    \"shipping_name\": \"Customer Name\",\n    \"shipping_address_line_one\": \"1 Example Street\",\n    \"shipping_address_line_two\": \"\",\n    \"shipping_address_city\": \"London\",\n    \"shipping_address_county\": \"\",\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"SW1A 1AA\",\n    \"shipping_address_iso\": \"GB\",\n    \"customer_comments\": null,\n    \"customs_description\": null,\n    \"email\": \"g1ws@example.com\",\n    \"phone\": \"05555555555\",\n    \"payment_currency\": \"GBP\",\n    \"request_data\": \"eyJvcmRlciI6eyJjaGFubmVsX29yZGVyX2lkIjoiUE9TVE1BTi1URVNULUcxLVdTIiwic3RhdHVzX2lkIjo1LCJlbWFpbCI6Imcxd3NAZXhhbXBsZS5jb20iLCJ0b3RhbF9wYWlkIjoyNC45OSwic2hpcHBpbmdfcGFpZCI6My45OSwicGF5bWVudF9tZXRob2QiOiIiLCJwYXltZW50X2N1cnJlbmN5IjoiR0JQIiwic2hpcHBpbmdfbmFtZSI6IkN1c3RvbWVyIE5hbWUiLCJzaGlwcGluZ19hZGRyZXNzX2xpbmVfb25lIjoiMSBFeGFtcGxlIFN0cmVldCIsInNoaXBwaW5nX2FkZHJlc3NfY2l0eSI6IkxvbmRvbiIsInNoaXBwaW5nX2FkZHJlc3NfY291bnRyeSI6IlVuaXRlZCBLaW5nZG9tIiwic2hpcHBpbmdfYWRkcmVzc19wb3N0Y29kZSI6IlNXMUEgMUFBIiwic2hpcHBpbmdfYWRkcmVzc19pc28iOiJHQiIsImludm9pY2VfbmFtZSI6IkN1c3RvbWVyIE5hbWUiLCJpbnZvaWNlX2FkZHJlc3NfbGluZV9vbmUiOiIxIEV4YW1wbGUgU3RyZWV0IiwiaW52b2ljZV9hZGRyZXNzX2NpdHkiOiJMb25kb24iLCJpbnZvaWNlX2FkZHJlc3NfY291bnRyeSI6IlVuaXRlZCBLaW5nZG9tIiwiaW52b2ljZV9hZGRyZXNzX3Bvc3Rjb2RlIjoiU1cxQSAxQUEiLCJpbnZvaWNlX2FkZHJlc3NfaXNvIjoiR0IifSwib3JkZXJfaW52ZW50b3J5IjpbeyJpbnZlbnRvcnlfaWQiOjEsInNrdSI6ImhhX3Byb2R1Y3RfdGVzdF8xIiwibmFtZSI6IkhBIFByb2R1Y3QgVGVzdCAtIDEiLCJxdWFudGl0eSI6MSwidW5pdF9wcmljZSI6MX1dLCJzaGlwbWVudCI6eyJjb3VyaWVyX3NlcnZpY2VfbmFtZSI6IkN1c3RvbUludGVncmF0aW9uVGVzdEFjY291bnRTZXJ2aWNlIiwidHJhY2tpbmdfY29kZXMiOlsiQUIxMjM0NTY3ODlHQiJdLCJzaGlwcGluZ190cmFja2luZ191cmxzIjpbImh0dHBzOlwvXC90cmFjay5leGFtcGxlLmNvbVwvQUIxMjM0NTY3ODlHQiJdLCJzaGlwcGluZ19sYWJlbCI6Imh0dHBzOlwvXC93d3cudzMub3JnXC9XQUlcL0VSXC90ZXN0c1wveGh0bWxcL3Rlc3RmaWxlc1wvcmVzb3VyY2VzXC9wZGZcL2R1bW15LnBkZiIsInNoaXBwaW5nX2xhYmVsX3R5cGUiOiJwZGZfdXJsIn19\",\n    \"response_data\": \"eyJpZCI6NjMxNSwic3RhdHVzX2lkIjo1LCJwcmV2aW91c19zdGF0dXNfaWQiOm51bGwsInNhbGVfdHlwZSI6ImIyYyIsImFsbG9jYXRpb25fc3RhdHVzX2lkIjowLCJidWxrX2Rlc3BhdGNoZWRfd2l0aG91dF9hbGxvY2F0aW9uIjowLCJjaGFubmVsX29yZGVyX2lkIjoiUE9TVE1BTi1URVNULUcxLVdTIiwiY2hhcGlfaWQiOm51bGwsImNoYW5uZWxfaWQiOjM0LCJjaGFubmVsX3VzZXJuYW1lIjpudWxsLCJjaGFubmVsX2FsdF9pZCI6bnVsbCwiaXNfbWVyZ2UiOjAsImlzX21lcmdlZF93aXRoX25ld19sb2dpYyI6MCwiaXNfcmV2ZXJ0YWJsZSI6MSwibWVyZ2Vfb3JkZXJfc3VtbWFyeV9pZCI6bnVsbCwiaXNfc3BsaXQiOjAsInNwbGl0X29yZGVyX3N1bW1hcnlfaWQiOm51bGwsImlzX3NvcnRlZCI6MCwiY29udGFjdF9pZCI6NTc5NCwic2hpcHBpbmdfbmFtZV9jb21wYW55IjpudWxsLCJzaGlwcGluZ19uYW1lIjoiQ3VzdG9tZXIgTmFtZSIsInNoaXBwaW5nX2FkZHJlc3NfbGluZV9vbmUiOiIxIEV4YW1wbGUgU3RyZWV0Iiwic2hpcHBpbmdfYWRkcmVzc19saW5lX3R3byI6bnVsbCwic2hpcHBpbmdfYWRkcmVzc19jaXR5IjoiTG9uZG9uIiwic2hpcHBpbmdfYWRkcmVzc19jb3VudHkiOm51bGwsInNoaXBwaW5nX2FkZHJlc3NfY291bnRyeSI6IlVuaXRlZCBLaW5nZG9tIiwic2hpcHBpbmdfYWRkcmVzc19wb3N0Y29kZSI6IlNXMUEgMUFBIiwic2hpcHBpbmdfYWRkcmVzc19wYWNraW5nX3Bvc3Rjb2RlIjpudWxsLCJzaGlwcGluZ19hZGRyZXNzX2lzbyI6IkdCIiwiaW52b2ljZV9uYW1lX2NvbXBhbnkiOm51bGwsImludm9pY2VfbmFtZSI6IkN1c3RvbWVyIE5hbWUiLCJpbnZvaWNlX2FkZHJlc3NfbGluZV9vbmUiOiIxIEV4YW1wbGUgU3RyZWV0IiwiaW52b2ljZV9hZGRyZXNzX2xpbmVfdHdvIjpudWxsLCJpbnZvaWNlX2FkZHJlc3NfY2l0eSI6IkxvbmRvbiIsImludm9pY2VfYWRkcmVzc19jb3VudHkiOm51bGwsImludm9pY2VfYWRkcmVzc19jb3VudHJ5IjoiVW5pdGVkIEtpbmdkb20iLCJpbnZvaWNlX2FkZHJlc3NfcG9zdGNvZGUiOiJTVzFBIDFBQSIsImludm9pY2VfYWRkcmVzc19pc28iOiJHQiIsImVtYWlsIjoiZzF3c0BleGFtcGxlLmNvbSIsImVtYWlsX3NoaXBwaW5nIjoiZzF3c0BleGFtcGxlLmNvbSIsInBob25lX29uZSI6IjA1NTU1NTU1NTU1IiwicGhvbmVfdHdvIjpudWxsLCJ0b3RhbF9wYWlkIjoiMjQuOTkwMCIsInRvdGFsX2Rpc2NvdW50IjoiMC4wMDAwIiwib3JkZXJfZGlzY291bnQiOiIwLjAwMDAiLCJ0b3RhbF90YXgiOiIwLjAwMDAiLCJhdXRvX2NhbGN1bGF0ZV90YXgiOjEsInNoaXBwaW5nX3BhaWQiOiIzLjk5MDAiLCJzaGlwcGluZ19tZXRob2RfcmVxdWVzdGVkIjoiIiwibG9ja19zaGlwcGluZ19tZXRob2QiOjAsInNoaXBwaW5nX3RyYWNraW5nX2NvZGUiOm51bGwsInBheW1lbnRfbWV0aG9kIjoiIiwicGF5bWVudF9yZWYiOm51bGwsInBheW1lbnRfY3VycmVuY3kiOiJHQlAiLCJzYWxlc19jaGFubmVsIjoiTWFudWFsIiwiZGF0ZV9yZWNlaXZlZCI6IjIwMjYtMDQtMzAgMTI6MDk6NDkiLCJkYXRlX2Rpc3BhdGNoZWQiOiIwMDAwLTAwLTAwIDAwOjAwOjAwIiwiY29sbGVjdGlvbl9kYXRlIjpudWxsLCJhbGxvd2VkX2Rlc3BhdGNoX2RhdGUiOm51bGwsInNoaXBfYnlfZGF0ZSI6bnVsbCwiY3VzdG9tZXJfY29tbWVudHMiOm51bGwsImdpZnRfbm90ZSI6bnVsbCwiZGVsaXZlcnlfaW5zdHJ1Y3Rpb25zIjpudWxsLCJkZWxldGVkIjowLCJkZWxldGVkX2F0IjpudWxsLCJjaGFubmVsX3VwZGF0ZWQiOjAsImNoYW5uZWxfdXBkYXRlZF90aW1lIjowLCJ0b3RhbF93ZWlnaHQiOiIwLjAwMCIsIm9uZV9vZmZfc2hpcG1lbnQiOjAsInNoaXBtZW50X2lkIjpudWxsLCJmdWxmaWxtZW50X2NsaWVudF9pZCI6bnVsbCwic3luY19pbmZvcm1lZCI6MCwidG90YWxfaW52ZW50b3J5X2NvdW50IjowLCJ0b3RhbF9pbnZlbnRvcnlfcXVhbnRpdHkiOjAsInN0b2NrX2xldmVsc19hZGp1c3RlZCI6MCwiY3VzdG9tX2ZpZWxkcyI6e30sInB1ZG9faWQiOm51bGwsImlvc3NfbnVtYmVyIjpudWxsLCJ1a2ltc19udW1iZXIiOm51bGwsInZhdF9udW1iZXIiOm51bGwsImVvcmlfbnVtYmVyIjpudWxsLCJ0YXhfaWQiOm51bGwsImFjY2Vzc191cmwiOm51bGwsInBhY2tlcl9pZCI6bnVsbCwicGFja2VkX2F0IjowLCJjYWxjdWxhdGVkX3NoaXBwaW5nX3NlcnZpY2UiOm51bGwsImNhbGN1bGF0ZWRfc2hpcHBpbmdfc2VydmljZV9ydW5fY291bnQiOjAsImlzX3NlbnRfYWNjb3VudGluZ19pbnZvaWNlIjowLCJwcmVnZW5lcmF0ZWRfbGFiZWwiOjAsImhhc19lY29tbWVyY2VfcmV0dXJuIjowLCJpc19sb2NrZWQiOjAsImlzX2JvcGlzIjowLCJpc19lYXN5c2hpcCI6MCwiaXNfZm9yY2VfZGVzcGF0Y2hlZCI6MCwiaXNfZm9yY2VfbG9ja2VkIjowLCJpc19kcm9wc2hpcCI6MCwiZnVsZmlsbWVudF9qb2Jfc3RhdHVzIjowLCJpc19uZXdfb3JkZXIiOjAsImlzX2FyY2hpdmVkIjowLCJjcmVhdGVkX2F0IjoiMjAyNi0wNC0zMCAxMzowOTo0OSIsInVwZGF0ZWRfYXQiOiIyMDI2LTA0LTMwIDEzOjA5OjQ5Iiwid2ViaG9va19ydW5faWQiOm51bGwsImJhdGNoX2xhYmVsIjowLCJpc19tY2YiOjAsIm1jZl9wbHVnaW5faWQiOm51bGwsImNyZWF0ZWRfZGF0ZSI6IjIwMjYtMDQtMzAiLCJpc19wb3MiOjAsInRyYWNraW5nX3N0YXR1c19pZCI6bnVsbCwiZHRwcF9ydW4iOm51bGwsImR0cHBfcXVldWVfc3RhdHVzIjpudWxsLCJkdHBwX3N0YXJ0ZWRfYXQiOm51bGwsImR0cHBfcXVldWVfZXJyb3IiOm51bGwsInBpY2tfY29tcGxldGVkX2F0IjpudWxsLCJzdGF0dXMiOnsiaWQiOjUsInN0YXR1c190eXBlX2lkIjoxLCJzdGF0dXMiOiJEZXNwYXRjaGVkIiwiaWNvbiI6ImZhLWNoZWNrIiwiZGFzaGJvYXJkIjoxLCJmdWxmaWxtZW50X2NsaWVudF9zdGF0dXMiOjAsImZ1bGZpbG1lbnRfc3RhdHVzIjpudWxsLCJmdWxmaWxtZW50X2ljb24iOiIiLCJmdWxmaWxtZW50X2Rhc2hib2FyZCI6MCwiYWxsb3dfZnVsZmlsbWVudF9lZGl0YWJsZSI6MCwiZnVsZmlsbWVudF9jb2xvciI6IiIsImZ1bGZpbG1lbnRfdGV4dF9jb2xvciI6IndoaXRlIiwiaGlkZGVuIjowLCJkZWxldGVkIjowLCJzb3J0Ijo3LCJzaWRlX21lbnUiOjAsImxhYmVsIjoibGFiZWwtZGVzcGF0Y2hlZCIsImVuYWJsZV9zcGxpdCI6MCwiYWxsb3dfZGVzcGF0Y2giOjAsImlzX3JlYWRvbmx5IjoxLCJlbmFibGVfcGlja19jcmVhdGlvbiI6MCwiZW5hYmxlX3ByaW50X2NyZWF0aW9uIjoxLCJkYXRlX2NyZWF0ZWQiOjAsImxhc3RfdXBkYXRlZCI6MCwic3RhdHVzX2NvbG91ciI6IiIsInN0YXR1c190ZXh0X2NvbG91ciI6IndoaXRlIn0sInN0YXR1c19kZXNjcmlwdGlvbiI6IkRlc3BhdGNoZWQiLCJpbnZlbnRvcnkiOlt7ImlkIjoyMTE1NiwiaW52ZW50b3J5X2lkIjoxLCJvcmRlcl9zdW1tYXJ5X2lkIjo2MzE1LCJtZXJnZV9vcmRlcl9zdW1tYXJ5X2lkIjpudWxsLCJzYWxlc19jaGFubmVsX2l0ZW1faWQiOm51bGwsImNoYW5uZWxfcHJvZHVjdF9za3UiOm51bGwsInNrdSI6ImhhX3Byb2R1Y3RfdGVzdF8xIiwia2l0X3NrdSI6bnVsbCwicXVhbnRpdHkiOjEsImtpdF9xdWFudGl0eSI6bnVsbCwibmFtZSI6IkhBIFByb2R1Y3QgVGVzdCAtIDEiLCJ1bml0X3ByaWNlIjoiMS4wMDAwIiwidW5pdF90YXgiOiIwLjAwMDAiLCJsaW5lX3RvdGFsX2Rpc2NvdW50IjoiMC4wMDAwIiwicHJpY2UiOiIxLjAwMDAiLCJvcHRpb25zIjoiIiwic2VsZWN0ZWRfYmF0Y2hlcyI6bnVsbCwibm90ZXMiOiIiLCJoc19jb2RlIjpudWxsLCJjb3VudHJ5X29mX29yaWdpbiI6bnVsbCwiY3VzdG9tc19kZXNjcmlwdGlvbiI6bnVsbCwiYWxsb2NhdGVkX2xvY2F0aW9uX2xpc3QiOm51bGwsInRlbXBfaWRlbnRpZmllciI6bnVsbCwiY3JlYXRlZF9hdCI6IjIwMjYtMDQtMzAgMTM6MDk6NDkiLCJ1cGRhdGVkX2F0IjoiMjAyNi0wNC0zMCAxMzowOTo0OSJ9XSwiaW52ZW50b3J5X25hbWVzX3VzYWdlIjoiaW50ZXJuYWwiLCJwcmludF9wcm9jZXNzIjp7ImlkIjozNjEzLCJvcmRlcl9zdW1tYXJ5X2lkIjo2MzE1LCJwcm9jZXNzX3JlZiI6IkRDMTc3NzU1MDk4OTI0MCIsInByaW50X3RpbWUiOjE3Nzc1NTA5ODksImNyZWF0ZWRfYXQiOiIyMDI2LTA0LTMwIDEzOjA5OjQ5IiwidXBkYXRlZF9hdCI6IjIwMjYtMDQtMzAgMTM6MDk6NDkifSwic2hpcG1lbnQiOnsiaWQiOjQwMTEsIm9yZGVyX3ByaW50X3Byb2Nlc3NfaWQiOjM2MTMsImFsdF9yZWZlcmVuY2UiOm51bGwsInJlcXVlc3RfaWQiOiIxNzc3NTUwOTg5NjMxNTYyOTU2MDciLCJsYWJlbF9yZWZlcmVuY2UiOm51bGwsInNlY29uZF9sYWJlbF9yZWZlcmVuY2UiOm51bGwsImRjX3JlcXVlc3RfaWQiOm51bGwsImludm9pY2VkIjowLCJjYW5jZWxsZWQiOjAsImxhYmVsX2ZldGNoZWQiOjAsIm1hbmlmZXN0ZWQiOjAsImlzX2ludGVybmF0aW9uYWwiOjAsInNhbGVfdHlwZSI6ImIyYyIsImNvdXJpZXJfc2VydmljZV9pZCI6MSwiY291cmllcl9zZXJ2aWNlX25hbWUiOiJDdXN0b21JbnRlZ3JhdGlvblRlc3RBY2NvdW50U2VydmljZSIsImNhcGlfY291cmllciI6bnVsbCwic2hpcHBpbmdfdHJhY2tpbmdfY29kZSI6IkFCMTIzNDU2Nzg5R0IiLCJzaGlwcGluZ190cmFja2luZ191cmxzIjoiaHR0cHM6XC9cL3RyYWNrLmV4YW1wbGUuY29tXC9BQjEyMzQ1Njc4OUdCIiwic2hpcHBpbmdfd2VpZ2h0IjoiMS4wMDAiLCJzaGlwcGluZ19jb3N0IjoiMC4wMDAwIiwicGlja2luZ19jb3N0IjoiMC4wMDAwIiwic2hpcG1lbnRfdG90YWxfY29zdCI6IjAuMDAwMCIsInBhcmNlbF9ydWxlX3RvdGFsX2Nvc3QiOiIwLjAwMDAiLCJ0b3RhbF92YWx1ZSI6IjI0Ljk5MDAiLCJzaGlwcGluZ19sYWJlbCI6InN0b3JhZ2VcL3ByZWdlbmVyYXRlZGxhYmVsc1wvNjMxNV9sYWJlbC5wZGYiLCJzaGlwcGluZ19sYWJlbF90eXBlIjoicGRmIiwiY29tbWVyY2lhbF9sYWJlbCI6bnVsbCwiY29tbWVyY2lhbF9sYWJlbF90eXBlIjpudWxsLCJzaGlwcGluZ19uYW1lX2NvbXBhbnkiOiIiLCJzaGlwcGluZ19uYW1lIjoiQ3VzdG9tZXIgTmFtZSIsInNoaXBwaW5nX2FkZHJlc3NfbGluZV9vbmUiOiIxIEV4YW1wbGUgU3RyZWV0Iiwic2hpcHBpbmdfYWRkcmVzc19saW5lX3R3byI6IiIsInNoaXBwaW5nX2FkZHJlc3NfY2l0eSI6IkxvbmRvbiIsInNoaXBwaW5nX2FkZHJlc3NfY291bnR5IjoiIiwic2hpcHBpbmdfYWRkcmVzc19jb3VudHJ5IjoiVW5pdGVkIEtpbmdkb20iLCJzaGlwcGluZ19hZGRyZXNzX3Bvc3Rjb2RlIjoiU1cxQSAxQUEiLCJzaGlwcGluZ19hZGRyZXNzX2lzbyI6IkdCIiwiY3VzdG9tZXJfY29tbWVudHMiOm51bGwsImN1c3RvbXNfZGVzY3JpcHRpb24iOm51bGwsImVtYWlsIjoiZzF3c0BleGFtcGxlLmNvbSIsInBob25lIjoiMDU1NTU1NTU1NTUiLCJwYXltZW50X2N1cnJlbmN5IjoiR0JQIiwicmVxdWVzdF9kYXRhIjoiZXlKdmNtUmxjaUk2ZXlKamFHRnVibVZzWDI5eVpHVnlYMmxrSWpvaVVFOVRWRTFCVGkxVVJWTlVMVWN4TFZkVElpd2ljM1JoZEhWelgybGtJam8xTENKbGJXRnBiQ0k2SW1jeGQzTkFaWGhoYlhCc1pTNWpiMjBpTENKMGIzUmhiRjl3WVdsa0lqb3lOQzQ1T1N3aWMyaHBjSEJwYm1kZmNHRnBaQ0k2TXk0NU9Td2ljR0Y1YldWdWRGOXRaWFJvYjJRaU9pSWlMQ0p3WVhsdFpXNTBYMk4xY25KbGJtTjVJam9pUjBKUUlpd2ljMmhwY0hCcGJtZGZibUZ0WlNJNklrTjFjM1J2YldWeUlFNWhiV1VpTENKemFHbHdjR2x1WjE5aFpHUnlaWE56WDJ4cGJtVmZiMjVsSWpvaU1TQkZlR0Z0Y0d4bElGTjBjbVZsZENJc0luTm9hWEJ3YVc1blgyRmtaSEpsYzNOZlkybDBlU0k2SWt4dmJtUnZiaUlzSW5Ob2FYQndhVzVuWDJGa1pISmxjM05mWTI5MWJuUnllU0k2SWxWdWFYUmxaQ0JMYVc1blpHOXRJaXdpYzJocGNIQnBibWRmWVdSa2NtVnpjMTl3YjNOMFkyOWtaU0k2SWxOWE1VRWdNVUZCSWl3aWMyaHBjSEJwYm1kZllXUmtjbVZ6YzE5cGMyOGlPaUpIUWlJc0ltbHVkbTlwWTJWZmJtRnRaU0k2SWtOMWMzUnZiV1Z5SUU1aGJXVWlMQ0pwYm5admFXTmxYMkZrWkhKbGMzTmZiR2x1WlY5dmJtVWlPaUl4SUVWNFlXMXdiR1VnVTNSeVpXVjBJaXdpYVc1MmIybGpaVjloWkdSeVpYTnpYMk5wZEhraU9pSk1iMjVrYjI0aUxDSnBiblp2YVdObFgyRmtaSEpsYzNOZlkyOTFiblJ5ZVNJNklsVnVhWFJsWkNCTGFXNW5aRzl0SWl3aWFXNTJiMmxqWlY5aFpHUnlaWE56WDNCdmMzUmpiMlJsSWpvaVUxY3hRU0F4UVVFaUxDSnBiblp2YVdObFgyRmtaSEpsYzNOZmFYTnZJam9pUjBJaWZTd2liM0prWlhKZmFXNTJaVzUwYjNKNUlqcGJleUpwYm5abGJuUnZjbmxmYVdRaU9qRXNJbk5yZFNJNkltaGhYM0J5YjJSMVkzUmZkR1Z6ZEY4eElpd2libUZ0WlNJNklraEJJRkJ5YjJSMVkzUWdWR1Z6ZENBdElERWlMQ0p4ZFdGdWRHbDBlU0k2TVN3aWRXNXBkRjl3Y21salpTSTZNWDFkTENKemFHbHdiV1Z1ZENJNmV5SmpiM1Z5YVdWeVgzTmxjblpwWTJWZmJtRnRaU0k2SWtOMWMzUnZiVWx1ZEdWbmNtRjBhVzl1VkdWemRFRmpZMjkxYm5SVFpYSjJhV05sSWl3aWRISmhZMnRwYm1kZlkyOWtaWE1pT2xzaVFVSXhNak0wTlRZM09EbEhRaUpkTENKemFHbHdjR2x1WjE5MGNtRmphMmx1WjE5MWNteHpJanBiSW1oMGRIQnpPbHd2WEM5MGNtRmpheTVsZUdGdGNHeGxMbU52YlZ3dlFVSXhNak0wTlRZM09EbEhRaUpkTENKemFHbHdjR2x1WjE5c1lXSmxiQ0k2SW1oMGRIQnpPbHd2WEM5M2QzY3Vkek11YjNKblhDOVhRVWxjTDBWU1hDOTBaWE4wYzF3dmVHaDBiV3hjTDNSbGMzUm1hV3hsYzF3dmNtVnpiM1Z5WTJWelhDOXdaR1pjTDJSMWJXMTVMbkJrWmlJc0luTm9hWEJ3YVc1blgyeGhZbVZzWDNSNWNHVWlPaUp3WkdaZmRYSnNJbjE5IiwicmVzcG9uc2VfZGF0YSI6IiIsInRvdGFsX3BpY2tfY291bnQiOjAsInRvdGFsX3BpZWNlcyI6MSwicGRfb3B0aW9ucyI6Ilt7XCJkaW1fbGVuZ3RoXCI6MSxcImRpbV93aWR0aFwiOjEsXCJkaW1faGVpZ2h0XCI6MSxcInR5cGVJRFwiOm51bGwsXCJkaW1fdW5pdFwiOlwiY21cIixcIml0ZW1zXCI6W3tcImRlc2NyaXB0aW9uXCI6XCJIQSBQcm9kdWN0IFRlc3QgLSAxXCIsXCJleHRlbmRlZF9kZXNjcmlwdGlvblwiOlwiSEEgUHJvZHVjdCBUZXN0IC0gMVwiLFwib3JpZ2luX2NvdW50cnlcIjpudWxsLFwicXVhbnRpdHlcIjoxLFwidmFsdWVcIjpcIjEuMDBcIixcInVuZGlzY291bnRlZF92YWx1ZVwiOlwiMS4wMFwiLFwiZGlzY291bnRcIjowLFwidmFsdWVfY3VycmVuY3lcIjpcIkdCUFwiLFwid2VpZ2h0XCI6MSxcIndlaWdodF91bml0XCI6XCJrZ1wiLFwidW5pdF93ZWlnaHRcIjoxLFwic2t1XCI6XCJoYV9wcm9kdWN0X3Rlc3RfMVwiLFwia2l0X3NrdVwiOm51bGwsXCJraXRfcXVhbnRpdHlcIjpudWxsLFwib3JpZ2luYWxfcXVhbnRpdHlcIjowLFwiZHluYW1pY19jb21wb25lbnRfdHlwZVwiOlwiXCIsXCJkeW5hbWljX2NvbXBvbmVudF9tYXN0ZXJfc2t1XCI6XCJoYV9wcm9kdWN0X3Rlc3RfMVwiLFwiZHluYW1pY19jb21wb25lbnRfbWFzdGVyX2lkXCI6MSxcInByb2R1Y3RfaWRcIjoxLFwidW5pdF90YXhcIjowLFwib3JkZXJfcHJvZHVjdF9pZGVudGlmaWVyXCI6XCJcIixcInByaWNlXCI6MSxcImxvY2F0aW9uXCI6XCJcIixcImZhYnJpY19jb250ZW50XCI6XCJcIixcIm9wdGlvbnNcIjpcIlwiLFwic2FsZXNfY2hhbm5lbF9pdGVtX2lkXCI6bnVsbCxcImNoYW5uZWxfcHJvZHVjdF9za3VcIjpudWxsLFwiaXNfdXNlZF9wYXJjZWxfZm9ybWF0dGVyXCI6ZmFsc2UsXCJoc19jb2RlXCI6bnVsbCxcImltYWdlX3VybFwiOlwiaHR0cHM6XFxcL1xcXC9kYzM1ZGV2OC5teWhlbG0uYXBwXFxcL3N0b3JhZ2VcXFwvZGVmYXVsdHNcXFwvbm8taW1hZ2UucG5nXCIsXCJjdXN0b21zX3ZhbHVlX2FwcGxpZWRcIjpmYWxzZSxcIm9yaWdpbmFsX3ZhbHVlXCI6bnVsbH1dfV0iLCJhdXhpbGlhcnlfZGF0YSI6bnVsbCwidGltZV9iYXNlZF9waWNraW5nX3RpbWUiOm51bGwsInBpY2tpbmdfYnlfcGFja2FnaW5nX3F0eXMiOm51bGwsImNvbnRhaW5lcl9waWNraW5nX3F0eXMiOm51bGwsInNlbnRfdG9fYmlsbGluZyI6MCwicGFja2luZ19zdG9ja3NfdXNlZCI6bnVsbCwidXNlcl9pZCI6NCwid2FyZWhvdXNlX2lkIjpudWxsLCJ3YXJlaG91c2VfYWRkcmVzcyI6bnVsbCwidm9pbGFfdHJhY2tpbmdfcmVxdWVzdF9pZCI6bnVsbCwidm9pbGFfdHJhY2tpbmdfcmVxdWVzdF9oYXNoIjpudWxsLCJiYnhfcGFsbGV0X2lkIjpudWxsLCJiYnhfcGFyZW50X2lkIjpudWxsLCJpc19yZXR1cm5fbGFiZWwiOjAsImlzX3NtYXJ0X3NoaXBwaW5nIjowLCJzbWFydF9zaGlwcGluZ19zcGxpdF9yZXNwb25zZSI6bnVsbCwiY3JlYXRlZF9hdCI6IjIwMjYtMDQtMzAgMTM6MDk6NDkiLCJ1cGRhdGVkX2F0IjoiMjAyNi0wNC0zMCAxMzowOTo0OSJ9fQ==\",\n    \"total_pick_count\": 0,\n    \"total_pieces\": 1,\n    \"pd_options\": \"[{\\\"dim_length\\\":1,\\\"dim_width\\\":1,\\\"dim_height\\\":1,\\\"typeID\\\":null,\\\"dim_unit\\\":\\\"cm\\\",\\\"items\\\":[{\\\"description\\\":\\\"HA Product Test - 1\\\",\\\"extended_description\\\":\\\"HA Product Test - 1\\\",\\\"origin_country\\\":null,\\\"quantity\\\":1,\\\"value\\\":\\\"1.00\\\",\\\"undiscounted_value\\\":\\\"1.00\\\",\\\"discount\\\":0,\\\"value_currency\\\":\\\"GBP\\\",\\\"weight\\\":1,\\\"weight_unit\\\":\\\"kg\\\",\\\"unit_weight\\\":1,\\\"sku\\\":\\\"ha_product_test_1\\\",\\\"kit_sku\\\":null,\\\"kit_quantity\\\":null,\\\"original_quantity\\\":0,\\\"dynamic_component_type\\\":\\\"\\\",\\\"dynamic_component_master_sku\\\":\\\"ha_product_test_1\\\",\\\"dynamic_component_master_id\\\":1,\\\"product_id\\\":1,\\\"unit_tax\\\":0,\\\"order_product_identifier\\\":\\\"\\\",\\\"price\\\":1,\\\"location\\\":\\\"\\\",\\\"fabric_content\\\":\\\"\\\",\\\"options\\\":\\\"\\\",\\\"sales_channel_item_id\\\":null,\\\"channel_product_sku\\\":null,\\\"is_used_parcel_formatter\\\":false,\\\"hs_code\\\":null,\\\"image_url\\\":\\\"https:\\\\/\\\\/your-company.myhelm.app\\\\/storage\\\\/defaults\\\\/no-image.png\\\",\\\"customs_value_applied\\\":false,\\\"original_value\\\":null}]}]\",\n    \"auxiliary_data\": null,\n    \"time_based_picking_time\": null,\n    \"picking_by_packaging_qtys\": null,\n    \"container_picking_qtys\": null,\n    \"sent_to_billing\": 0,\n    \"packing_stocks_used\": null,\n    \"user_id\": 4,\n    \"warehouse_id\": null,\n    \"warehouse_address\": null,\n    \"voila_tracking_request_id\": null,\n    \"voila_tracking_request_hash\": null,\n    \"bbx_pallet_id\": null,\n    \"bbx_parent_id\": null,\n    \"is_return_label\": 0,\n    \"is_smart_shipping\": 0,\n    \"smart_shipping_split_response\": null,\n    \"created_at\": \"2026-04-30 13:09:49\",\n    \"updated_at\": \"2026-04-30 13:09:49\"\n  }\n}"}],"_postman_id":"c5981387-39db-4112-b190-1879d0aaecc5"},{"name":"Despatch with Tracking Code","id":"7867e17a-b6ee-419f-beda-68d4fe896b96","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_id\": 6310,                                                     // order must be fully allocated (allocation_status_id=2) before calling this endpoint\n    \"shipment\": {\n        \"courier_service_id\":      12,                                    // existing courier_service.id\n        \"tracking_codes\":          [\"AB123456789GB\"],                     // REQUIRED — array (one per parcel)\n        \"shipping_tracking_urls\":  [\"https://track.example.com/AB123456789GB\"],   // REQUIRED — parallel to tracking_codes\n        \"shipping_label\":          \"https://example.com/labels/abc.pdf\",  // REQUIRED — URL or base64 of the label\n        \"shipping_label_type\":     \"pdf_url\",                              // REQUIRED — \"pdf_url\" | \"html_url\" | \"pdf_base64\"\n        \"parcel_dimensions\": {\n            \"width\":  20,\n            \"height\": 5,\n            \"length\": 30,\n            \"weight\": 0.5\n        }\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/despatch_with_tracking_code","description":"<p>Attaches a pre-generated label to an <strong>existing</strong> order and marks the order as despatched. Use this when the order already exists in Helm (was created earlier) but the label was generated externally and now needs to be recorded.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Recording the tracking number returned by an external courier integration.</li>\n<li>Closing out fulfilment-elsewhere orders.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only despatch their own orders.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The order to attach the label to.</td>\n</tr>\n<tr>\n<td><code>shipment.courier_service_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Courier service ID (numeric). Note: this differs from <strong>Create Order with Shipment</strong>, which uses <code>courier_service_name</code>.</td>\n</tr>\n<tr>\n<td><code>shipment.tracking_codes</code></td>\n<td>string or array</td>\n<td>yes</td>\n<td>Tracking number(s).</td>\n</tr>\n<tr>\n<td><code>shipment.shipping_tracking_urls</code></td>\n<td>string or array</td>\n<td>yes</td>\n<td>Tracking URL(s).</td>\n</tr>\n<tr>\n<td><code>shipment.shipping_label</code></td>\n<td>string</td>\n<td>yes</td>\n<td>URL or base64-encoded label.</td>\n</tr>\n<tr>\n<td><code>shipment.shipping_label_type</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>pdf_url</code>, <code>pdf_base64</code>, or <code>html_url</code>.</td>\n</tr>\n<tr>\n<td><code>shipment.parcel_dimensions</code></td>\n<td>object</td>\n<td>no</td>\n<td>If supplied with all four non-zero values it overrides auto-calculated dimensions. Fields: <code>width</code>, <code>height</code>, <code>length</code>, <code>weight</code>. If <code>weight</code> is non-zero it is distributed across line items.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>If stock-control is enabled the order must be fully allocated first.</li>\n<li>The order's <code>pregenerated_label</code> flag is set to <code>1</code>.</li>\n<li>Returns the updated order <strong>and</strong> the created shipment record.</li>\n</ul>\n<h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>422</code> — order not found, order not fully allocated, missing required shipment fields, invalid <code>shipping_label_type</code>, courier service not found.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["orders","despatch_with_tracking_code"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"df75ee39-fabf-4b51-b293-34f7455ac172","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_id\": 6310,\n    \"shipment\": {\n        \"courier_service_id\": 12,\n        \"tracking_codes\": [\"AB123456789GB\"],\n        \"shipping_tracking_urls\": [\"https://track.example.com/AB123456789GB\"],\n        \"shipping_label\": \"https://example.com/labels/abc.pdf\",\n        \"shipping_label_type\": \"pdf_url\",\n        \"parcel_dimensions\": {\n            \"width\": 20,\n            \"height\": 5,\n            \"length\": 30,\n            \"weight\": 0.5\n        }\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/orders/despatch_with_tracking_code","description":"Attaches a pre-generated label to an **existing** order and marks the order as despatched. Use this when the order already exists in Helm (was created earlier) but the label was generated externally and now needs to be recorded.\n\n### Use cases\n- Recording the tracking number returned by an external courier integration.\n- Closing out fulfilment-elsewhere orders.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users can only despatch their own orders.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `order_id` | int | yes | The order to attach the label to. |\n| `shipment.courier_service_id` | int | yes | Courier service ID (numeric). Note: this differs from **Create Order with Shipment**, which uses `courier_service_name`. |\n| `shipment.tracking_codes` | string or array | yes | Tracking number(s). |\n| `shipment.shipping_tracking_urls` | string or array | yes | Tracking URL(s). |\n| `shipment.shipping_label` | string | yes | URL or base64-encoded label. |\n| `shipment.shipping_label_type` | string | yes | `pdf_url`, `pdf_base64`, or `html_url`. |\n| `shipment.parcel_dimensions` | object | no | If supplied with all four non-zero values it overrides auto-calculated dimensions. Fields: `width`, `height`, `length`, `weight`. If `weight` is non-zero it is distributed across line items. |\n\n### Notes\n- If stock-control is enabled the order must be fully allocated first.\n- The order's `pregenerated_label` flag is set to `1`.\n- Returns the updated order **and** the created shipment record.\n\n### Errors\n- `422` — order not found, order not fully allocated, missing required shipment fields, invalid `shipping_label_type`, courier service not found.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"order\": {\n    \"id\": 6312,\n    \"status_id\": 3,\n    \"previous_status_id\": 1,\n    \"sale_type\": \"b2c\",\n    \"allocation_status_id\": 2,\n    \"bulk_despatched_without_allocation\": 0,\n    \"channel_order_id\": \"POSTMAN-TEST-G1-A\",\n    \"chapi_id\": null,\n    \"channel_id\": 34,\n    \"channel_username\": null,\n    \"channel_alt_id\": null,\n    \"is_merge\": 0,\n    \"is_merged_with_new_logic\": 0,\n    \"is_revertable\": 1,\n    \"merge_order_summary_id\": null,\n    \"is_split\": 0,\n    \"split_order_summary_id\": null,\n    \"is_sorted\": 0,\n    \"contact_id\": 5792,\n    \"shipping_name_company\": null,\n    \"shipping_name\": \"Test Customer\",\n    \"shipping_address_line_one\": \"2 New Street\",\n    \"shipping_address_line_two\": null,\n    \"shipping_address_city\": \"London\",\n    \"shipping_address_county\": null,\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"SW1A 2BB\",\n    \"shipping_address_packing_postcode\": null,\n    \"shipping_address_iso\": \"GB\",\n    \"invoice_name_company\": null,\n    \"invoice_name\": \"Test Customer\",\n    \"invoice_address_line_one\": \"1 Test Street\",\n    \"invoice_address_line_two\": null,\n    \"invoice_address_city\": \"London\",\n    \"invoice_address_county\": null,\n    \"invoice_address_country\": \"United Kingdom\",\n    \"invoice_address_postcode\": \"SW1A 1AA\",\n    \"invoice_address_iso\": \"GB\",\n    \"email\": \"g1a-test@example.com\",\n    \"email_shipping\": \"g1a-test@example.com\",\n    \"phone_one\": \"+44 1234 567890\",\n    \"phone_two\": null,\n    \"total_paid\": \"28.4900\",\n    \"total_discount\": \"1.0000\",\n    \"order_discount\": \"0.0000\",\n    \"total_tax\": \"4.5000\",\n    \"auto_calculate_tax\": 1,\n    \"shipping_paid\": \"4.9900\",\n    \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n    \"lock_shipping_method\": 0,\n    \"shipping_tracking_code\": null,\n    \"payment_method\": \"\",\n    \"payment_ref\": null,\n    \"payment_currency\": \"GBP\",\n    \"sales_channel\": \"Manual\",\n    \"date_received\": \"2026-04-30 13:06:41\",\n    \"date_dispatched\": \"0000-00-00 00:00:00\",\n    \"collection_date\": null,\n    \"allowed_despatch_date\": null,\n    \"ship_by_date\": null,\n    \"customer_comments\": \"Updated via Postman test\",\n    \"gift_note\": null,\n    \"delivery_instructions\": null,\n    \"deleted\": 0,\n    \"deleted_at\": null,\n    \"channel_updated\": 0,\n    \"channel_updated_time\": 0,\n    \"total_weight\": \"7.000\",\n    \"one_off_shipment\": 0,\n    \"shipment_id\": null,\n    \"fulfilment_client_id\": null,\n    \"sync_informed\": 0,\n    \"total_inventory_count\": 2,\n    \"total_inventory_quantity\": 6,\n    \"stock_levels_adjusted\": 0,\n    \"custom_fields\": null,\n    \"pudo_id\": null,\n    \"ioss_number\": null,\n    \"ukims_number\": null,\n    \"vat_number\": null,\n    \"eori_number\": null,\n    \"tax_id\": null,\n    \"access_url\": null,\n    \"packer_id\": null,\n    \"packed_at\": 0,\n    \"calculated_shipping_service\": null,\n    \"calculated_shipping_service_run_count\": 0,\n    \"is_sent_accounting_invoice\": 0,\n    \"pregenerated_label\": 0,\n    \"has_ecommerce_return\": 0,\n    \"is_locked\": 0,\n    \"is_bopis\": 0,\n    \"is_easyship\": 0,\n    \"is_force_despatched\": 0,\n    \"is_force_locked\": 0,\n    \"is_dropship\": 0,\n    \"fulfilment_job_status\": 0,\n    \"is_new_order\": 0,\n    \"is_archived\": 0,\n    \"created_at\": \"2026-04-30 13:06:41\",\n    \"updated_at\": \"2026-04-30 13:08:17\",\n    \"webhook_run_id\": null,\n    \"batch_label\": 0,\n    \"is_mcf\": 0,\n    \"mcf_plugin_id\": null,\n    \"created_date\": \"2026-04-30\",\n    \"is_pos\": 0,\n    \"tracking_status_id\": null,\n    \"dtpp_run\": null,\n    \"dtpp_queue_status\": null,\n    \"dtpp_started_at\": null,\n    \"dtpp_queue_error\": null,\n    \"pick_completed_at\": null,\n    \"inventory_names_usage\": \"internal\",\n    \"print_process\": {\n      \"id\": 3612,\n      \"order_summary_id\": 6312,\n      \"process_ref\": \"DC1777550957305\",\n      \"print_time\": 1777550957,\n      \"created_at\": \"2026-04-30 13:09:17\",\n      \"updated_at\": \"2026-04-30 13:09:17\"\n    }\n  },\n  \"shipment\": {\n    \"id\": 4010,\n    \"order_print_process_id\": 3612,\n    \"alt_reference\": null,\n    \"request_id\": \"177755095763128406771\",\n    \"label_reference\": null,\n    \"second_label_reference\": null,\n    \"dc_request_id\": null,\n    \"invoiced\": 0,\n    \"cancelled\": 0,\n    \"label_fetched\": 0,\n    \"manifested\": 0,\n    \"is_international\": 0,\n    \"sale_type\": \"b2c\",\n    \"courier_service_id\": 1,\n    \"courier_service_name\": \"CustomIntegrationTestAccountService\",\n    \"capi_courier\": null,\n    \"shipping_tracking_code\": \"AB123456789GB\",\n    \"shipping_tracking_urls\": \"https://track.example.com/AB123456789GB\",\n    \"shipping_weight\": \"0.500\",\n    \"shipping_cost\": \"0.0000\",\n    \"picking_cost\": \"0.0000\",\n    \"shipment_total_cost\": \"0.0000\",\n    \"parcel_rule_total_cost\": \"0.0000\",\n    \"total_value\": \"28.4900\",\n    \"shipping_label\": \"storage/pregeneratedlabels/6312_label.pdf\",\n    \"shipping_label_type\": \"pdf\",\n    \"commercial_label\": null,\n    \"commercial_label_type\": null,\n    \"shipping_name_company\": \"\",\n    \"shipping_name\": \"Test Customer\",\n    \"shipping_address_line_one\": \"2 New Street\",\n    \"shipping_address_line_two\": \"\",\n    \"shipping_address_city\": \"London\",\n    \"shipping_address_county\": \"\",\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"SW1A 2BB\",\n    \"shipping_address_iso\": \"GB\",\n    \"customer_comments\": null,\n    \"customs_description\": null,\n    \"email\": \"g1a-test@example.com\",\n    \"phone\": \"+44 1234 567890\",\n    \"payment_currency\": \"GBP\",\n    \"request_data\": \"eyJvcmRlcl9pZCI6NjMxMiwic2hpcG1lbnQiOnsiY291cmllcl9zZXJ2aWNlX2lkIjoxLCJ0cmFja2luZ19jb2RlcyI6WyJBQjEyMzQ1Njc4OUdCIl0sInNoaXBwaW5nX3RyYWNraW5nX3VybHMiOlsiaHR0cHM6XC9cL3RyYWNrLmV4YW1wbGUuY29tXC9BQjEyMzQ1Njc4OUdCIl0sInNoaXBwaW5nX2xhYmVsIjoiaHR0cHM6XC9cL3d3dy53My5vcmdcL1dBSVwvRVJcL3Rlc3RzXC94aHRtbFwvdGVzdGZpbGVzXC9yZXNvdXJjZXNcL3BkZlwvZHVtbXkucGRmIiwic2hpcHBpbmdfbGFiZWxfdHlwZSI6InBkZl91cmwiLCJwYXJjZWxfZGltZW5zaW9ucyI6eyJ3aWR0aCI6MjAsImhlaWdodCI6NSwibGVuZ3RoIjozMCwid2VpZ2h0IjowLjV9fX0=\",\n    \"response_data\": \"\",\n    \"total_pick_count\": 0,\n    \"total_pieces\": 1,\n    \"pd_options\": \"[{\\\"dim_length\\\":30,\\\"dim_width\\\":20,\\\"dim_height\\\":5,\\\"typeID\\\":null,\\\"dim_unit\\\":\\\"cm\\\",\\\"items\\\":[{\\\"description\\\":\\\"HA Product Test - 1\\\",\\\"extended_description\\\":\\\"HA Product Test - 1\\\",\\\"origin_country\\\":\\\"GB\\\",\\\"quantity\\\":5,\\\"value\\\":\\\"21.50\\\",\\\"undiscounted_value\\\":\\\"22.50\\\",\\\"discount\\\":1,\\\"value_currency\\\":\\\"GBP\\\",\\\"weight\\\":0.25,\\\"weight_unit\\\":\\\"kg\\\",\\\"unit_weight\\\":1,\\\"sku\\\":\\\"ha_product_test_1\\\",\\\"kit_sku\\\":null,\\\"kit_quantity\\\":null,\\\"original_quantity\\\":0,\\\"dynamic_component_type\\\":\\\"\\\",\\\"dynamic_component_master_sku\\\":\\\"ha_product_test_1\\\",\\\"dynamic_component_master_id\\\":1,\\\"product_id\\\":1,\\\"unit_tax\\\":0,\\\"order_product_identifier\\\":\\\"\\\",\\\"price\\\":4.5,\\\"location\\\":\\\"\\\",\\\"fabric_content\\\":\\\"\\\",\\\"options\\\":\\\"\\\",\\\"sales_channel_item_id\\\":null,\\\"channel_product_sku\\\":null,\\\"is_used_parcel_formatter\\\":false,\\\"hs_code\\\":\\\"950300\\\",\\\"image_url\\\":\\\"https:\\\\/\\\\/your-company.myhelm.app\\\\/storage\\\\/defaults\\\\/no-image.png\\\",\\\"customs_value_applied\\\":false,\\\"original_value\\\":null},{\\\"description\\\":\\\"po_test\\\",\\\"extended_description\\\":\\\"po_test\\\",\\\"origin_country\\\":null,\\\"quantity\\\":1,\\\"value\\\":\\\"2.00\\\",\\\"undiscounted_value\\\":\\\"2.00\\\",\\\"discount\\\":0,\\\"value_currency\\\":\\\"GBP\\\",\\\"weight\\\":0.25,\\\"weight_unit\\\":\\\"kg\\\",\\\"unit_weight\\\":2,\\\"sku\\\":\\\"po_test\\\",\\\"kit_sku\\\":null,\\\"kit_quantity\\\":null,\\\"original_quantity\\\":0,\\\"dynamic_component_type\\\":\\\"\\\",\\\"dynamic_component_master_sku\\\":\\\"po_test\\\",\\\"dynamic_component_master_id\\\":3,\\\"product_id\\\":3,\\\"unit_tax\\\":0,\\\"order_product_identifier\\\":\\\"\\\",\\\"price\\\":2,\\\"location\\\":\\\"\\\",\\\"fabric_content\\\":\\\"\\\",\\\"options\\\":\\\"\\\",\\\"sales_channel_item_id\\\":null,\\\"channel_product_sku\\\":null,\\\"is_used_parcel_formatter\\\":false,\\\"hs_code\\\":\\\"\\\",\\\"image_url\\\":\\\"https:\\\\/\\\\/your-company.myhelm.app\\\\/storage\\\\/defaults\\\\/no-image.png\\\",\\\"customs_value_applied\\\":false,\\\"original_value\\\":null}]}]\",\n    \"auxiliary_data\": null,\n    \"time_based_picking_time\": null,\n    \"picking_by_packaging_qtys\": null,\n    \"container_picking_qtys\": null,\n    \"sent_to_billing\": 0,\n    \"packing_stocks_used\": null,\n    \"user_id\": 4,\n    \"warehouse_id\": null,\n    \"warehouse_address\": null,\n    \"voila_tracking_request_id\": null,\n    \"voila_tracking_request_hash\": null,\n    \"bbx_pallet_id\": null,\n    \"bbx_parent_id\": null,\n    \"is_return_label\": 0,\n    \"is_smart_shipping\": 0,\n    \"smart_shipping_split_response\": null,\n    \"created_at\": \"2026-04-30 13:09:17\",\n    \"updated_at\": \"2026-04-30 13:09:17\"\n  }\n}"}],"_postman_id":"7867e17a-b6ee-419f-beda-68d4fe896b96"},{"name":"Update Order","id":"869dc578-15de-49af-8420-bd07c03facf9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"status_id\": 3,\n    \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n    \"customer_comments\": \"Updated note\",\n    \"total_paid\": 24.99,\n    \"total_tax\": 4.16,\n    \"shipping_paid\": 3.99,\n    \"phone_one\": \"+44 1234 567890\",\n    \"shipping_address_line_one\": \"1 Example Street\",\n    \"shipping_address_postcode\": \"SW1A 1AA\",\n    \"notes\": [\"First note\", \"Second note\"],\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update","description":"<p>Updates editable fields on an existing order. Send only the fields you want to change - anything omitted stays as-is.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Changing the order status as the workflow progresses, including cancelling an order or moving a cancelled order back into the workflow.</li>\n<li>Correcting an address before despatch.</li>\n<li>Updating payment metadata after a refund/partial-charge.</li>\n<li>Replacing the order's notes list.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only edit orders that belong to them, and only while the order is in a status their account is allowed to edit.</p>\n<p>Two status changes carry their own permission level, configured under Settings in Helm (both default to Supervisor):</p>\n<ul>\n<li>Cancelling (<code>status_id: 6</code>) needs the order cancel permission.</li>\n<li>Moving a cancelled order to another status needs the order uncancel permission.</li>\n</ul>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>All optional. The same fields documented under <strong>Create Order</strong>, plus:</p>\n<ul>\n<li><code>status_id</code> - the status to move the order into. Any order status that exists in your account is accepted, including custom statuses (see the folder description for the built-in IDs).</li>\n<li><code>notes</code> - array of strings; <strong>replaces</strong> all existing notes on the order.</li>\n<li><code>custom_fields</code> - object; replaces existing custom-field values.</li>\n</ul>\n<h3 id=\"status-changes\">Status changes</h3>\n<ul>\n<li>The following statuses can never be set through this endpoint and return <code>422</code>: <code>5</code> (Despatched - book a shipment or use <strong>Despatch with Tracking Code</strong>), <code>2800</code> (New Order), <code>9</code> (Returned), <code>17</code> (Partially Returned) and <code>3000</code> (Merged Order).</li>\n<li>A <code>status_id</code> that does not exist in your account returns <code>422</code>.</li>\n<li><code>status_id: 6</code> cancels the order with exactly the same effect and rules as <strong>Cancel Order</strong>: allocations are released, the order is removed from any pick, a pre-generated label is cancelled with the courier and the tote/box is cleared.</li>\n<li>An order that is currently Cancelled (<code>6</code>) can be moved to any other allowed status. In that case only <code>status_id</code> and <code>notes</code> are applied; every other field in the request is ignored and listed in a <code>warning_message</code> in the response.</li>\n</ul>\n<h3 id=\"other-constraints\">Other constraints</h3>\n<ul>\n<li>Orders in a processing status cannot be updated and return <code>422</code> naming the status: Picking (<code>4</code>), Picked (<code>10</code>), Partially Picked (<code>2990</code>), Sorting (<code>2710</code>), Sorted (<code>2711</code>), Packing (<code>8</code>), Printed (<code>82</code>), Despatch Pending (<code>2700</code>), Despatched (<code>5</code>), Returned (<code>9</code>), Partially Returned (<code>17</code>). A Cancelled (<code>6</code>) order only accepts the status change described above.</li>\n<li>Orders with <code>pregenerated_label = 1</code> only allow updates to <code>status_id</code> and <code>notes</code>. Any other field is ignored and the response includes a <code>warning_message</code>. Use <strong>Cancel Shipping Label</strong> to remove the pre-generated label first if you need to edit the order.</li>\n<li>Merged orders (status <code>3000</code>) and deleted orders cannot be updated at all - <code>422</code>.</li>\n<li>Setting <code>auto_calculate_tax</code> from <code>1</code> to <code>0</code> resets <code>total_tax</code> to <code>0</code>. Setting it to <code>1</code> triggers tax recalculation.</li>\n<li>If the order is linked to a contact, updates to <code>vat_number</code> / <code>eori_number</code> / <code>tax_id</code> / <code>ioss_number</code> / <code>ukims_number</code> are also written to the contact.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated order record. When a restriction limited the update to status and notes (pre-generated label, or a cancelled order being moved to another status) the response is <code>{ \"warning_message\": \"...\", \"order\": { ... } }</code> instead, with the warning explaining what was ignored.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"053aa44a-3c05-4d27-a8f7-95219913b3bb","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"status_id\": 3,\n    \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n    \"customer_comments\": \"Updated note\",\n    \"total_paid\": 24.99,\n    \"total_tax\": 4.16,\n    \"shipping_paid\": 3.99,\n    \"phone_one\": \"+44 1234 567890\",\n    \"shipping_address_line_one\": \"1 Example Street\",\n    \"shipping_address_postcode\": \"SW1A 1AA\",\n    \"notes\": [\"First note\", \"Second note\"],\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update","description":"Updates editable fields on an existing order. Send only the fields you want to change — anything omitted stays as-is.\n\n### Use cases\n- Changing the order status as the workflow progresses.\n- Correcting an address before despatch.\n- Updating payment metadata after a refund/partial-charge.\n- Replacing the order's notes list.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users can only edit orders that belong to them.\n\n### Path parameter\n- `` — internal order ID.\n\n### Body fields\nAll optional. The same fields documented under **Create Order**, plus:\n- `status_id` — see status enum in the folder description.\n- `notes` — array of strings; **replaces** all existing notes on the order.\n- `custom_fields` — object; replaces existing custom-field values.\n\n### Important constraints\n- You **cannot** set `status_id` to `5` (Despatched) via this endpoint — book a shipment or use **Despatch with Tracking Code** instead. Trying to do so returns `422`.\n- You **cannot** set `status_id` to `2800` (New Order).\n- Orders with `pregenerated_label = 1` only allow updates to `status_id` and `notes`. Any other field is silently ignored and the response includes a warning message.\n- `total_discount` cannot exceed `total_paid` — `422` otherwise.\n- Orders that are merged (status `3000`) cannot be updated at all — `422`.\n- Setting `auto_calculate_tax` from `1` → `0` resets `total_tax` to `0`. Setting it `1` triggers tax recalculation.\n- If the order is linked to a contact, updates to `vat_number` / `eori_number` / `tax_id` / `ioss_number` / `ukims_number` are also written to the contact.\n\n### Response\nThe updated order record. If a pregenerated-label restriction was hit, the response includes a top-level `message` field explaining what was ignored.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6312,\n  \"status_id\": 3,\n  \"previous_status_id\": 1,\n  \"sale_type\": \"b2c\",\n  \"allocation_status_id\": 0,\n  \"bulk_despatched_without_allocation\": 0,\n  \"channel_order_id\": \"POSTMAN-TEST-G1-A\",\n  \"chapi_id\": null,\n  \"channel_id\": 34,\n  \"channel_username\": null,\n  \"channel_alt_id\": null,\n  \"is_merge\": 0,\n  \"is_merged_with_new_logic\": 0,\n  \"is_revertable\": 1,\n  \"merge_order_summary_id\": null,\n  \"is_split\": 0,\n  \"split_order_summary_id\": null,\n  \"is_sorted\": 0,\n  \"contact_id\": 5792,\n  \"shipping_name_company\": null,\n  \"shipping_name\": \"Test Customer\",\n  \"shipping_address_line_one\": \"2 New Street\",\n  \"shipping_address_line_two\": null,\n  \"shipping_address_city\": \"London\",\n  \"shipping_address_county\": null,\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"SW1A 2BB\",\n  \"shipping_address_packing_postcode\": null,\n  \"shipping_address_iso\": \"GB\",\n  \"invoice_name_company\": null,\n  \"invoice_name\": \"Test Customer\",\n  \"invoice_address_line_one\": \"1 Test Street\",\n  \"invoice_address_line_two\": null,\n  \"invoice_address_city\": \"London\",\n  \"invoice_address_county\": null,\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"SW1A 1AA\",\n  \"invoice_address_iso\": \"GB\",\n  \"email\": \"g1a-test@example.com\",\n  \"email_shipping\": \"g1a-test@example.com\",\n  \"phone_one\": \"+44 1234 567890\",\n  \"phone_two\": null,\n  \"total_paid\": \"28.9900\",\n  \"total_discount\": \"0.0000\",\n  \"order_discount\": \"0.0000\",\n  \"total_tax\": \"0.0000\",\n  \"auto_calculate_tax\": 1,\n  \"shipping_paid\": \"4.9900\",\n  \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n  \"lock_shipping_method\": 0,\n  \"shipping_tracking_code\": null,\n  \"payment_method\": \"\",\n  \"payment_ref\": null,\n  \"payment_currency\": \"GBP\",\n  \"sales_channel\": \"Manual\",\n  \"date_received\": \"2026-04-30 13:06:41\",\n  \"date_dispatched\": \"0000-00-00 00:00:00\",\n  \"collection_date\": null,\n  \"allowed_despatch_date\": null,\n  \"ship_by_date\": null,\n  \"customer_comments\": \"Updated via Postman test\",\n  \"gift_note\": null,\n  \"delivery_instructions\": null,\n  \"deleted\": 0,\n  \"deleted_at\": null,\n  \"channel_updated\": 0,\n  \"channel_updated_time\": 0,\n  \"total_weight\": \"0.000\",\n  \"one_off_shipment\": 0,\n  \"shipment_id\": null,\n  \"fulfilment_client_id\": null,\n  \"sync_informed\": 0,\n  \"total_inventory_count\": 0,\n  \"total_inventory_quantity\": 0,\n  \"stock_levels_adjusted\": 0,\n  \"custom_fields\": {},\n  \"pudo_id\": null,\n  \"ioss_number\": null,\n  \"ukims_number\": null,\n  \"vat_number\": null,\n  \"eori_number\": null,\n  \"tax_id\": null,\n  \"access_url\": null,\n  \"packer_id\": null,\n  \"packed_at\": 0,\n  \"calculated_shipping_service\": null,\n  \"calculated_shipping_service_run_count\": 0,\n  \"is_sent_accounting_invoice\": 0,\n  \"pregenerated_label\": 0,\n  \"has_ecommerce_return\": 0,\n  \"is_locked\": 0,\n  \"is_bopis\": 0,\n  \"is_easyship\": 0,\n  \"is_force_despatched\": 0,\n  \"is_force_locked\": 0,\n  \"is_dropship\": 0,\n  \"fulfilment_job_status\": 0,\n  \"is_new_order\": 0,\n  \"is_archived\": 0,\n  \"created_at\": \"2026-04-30 13:06:41\",\n  \"updated_at\": \"2026-04-30 13:06:50\",\n  \"webhook_run_id\": null,\n  \"batch_label\": 0,\n  \"is_mcf\": 0,\n  \"mcf_plugin_id\": null,\n  \"created_date\": \"2026-04-30\",\n  \"is_pos\": 0,\n  \"tracking_status_id\": null,\n  \"dtpp_run\": null,\n  \"dtpp_queue_status\": null,\n  \"dtpp_started_at\": null,\n  \"dtpp_queue_error\": null,\n  \"pick_completed_at\": null,\n  \"status\": \"Despatch Ready\"\n}"},{"id":"e051681a-65e9-49dc-8c12-f001ac7a5b22","name":"Success - cancelled order moved back to Despatch Ready","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"status_id\": 3,\n    \"customer_comments\": \"Ignored on a cancelled order\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update","description":"Updates editable fields on an existing order. Send only the fields you want to change — anything omitted stays as-is.\n\n### Use cases\n- Changing the order status as the workflow progresses.\n- Correcting an address before despatch.\n- Updating payment metadata after a refund/partial-charge.\n- Replacing the order's notes list.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users can only edit orders that belong to them.\n\n### Path parameter\n- `` — internal order ID.\n\n### Body fields\nAll optional. The same fields documented under **Create Order**, plus:\n- `status_id` — see status enum in the folder description.\n- `notes` — array of strings; **replaces** all existing notes on the order.\n- `custom_fields` — object; replaces existing custom-field values.\n\n### Important constraints\n- You **cannot** set `status_id` to `5` (Despatched) via this endpoint — book a shipment or use **Despatch with Tracking Code** instead. Trying to do so returns `422`.\n- You **cannot** set `status_id` to `2800` (New Order).\n- Orders with `pregenerated_label = 1` only allow updates to `status_id` and `notes`. Any other field is silently ignored and the response includes a warning message.\n- `total_discount` cannot exceed `total_paid` — `422` otherwise.\n- Orders that are merged (status `3000`) cannot be updated at all — `422`.\n- Setting `auto_calculate_tax` from `1` → `0` resets `total_tax` to `0`. Setting it `1` triggers tax recalculation.\n- If the order is linked to a contact, updates to `vat_number` / `eori_number` / `tax_id` / `ioss_number` / `ukims_number` are also written to the contact.\n\n### Response\nThe updated order record. If a pregenerated-label restriction was hit, the response includes a top-level `message` field explaining what was ignored.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"warning_message\": \"Because the order was cancelled, only the status and notes were updated. Ignored fields: customer_comments.\",\n    \"order\": {\n        \"id\": 6312,\n        \"status_id\": 3,\n        \"previous_status_id\": 6,\n        \"sale_type\": \"b2c\",\n        \"allocation_status_id\": 0,\n        \"bulk_despatched_without_allocation\": 0,\n        \"channel_order_id\": \"POSTMAN-TEST-G1-A\",\n        \"chapi_id\": null,\n        \"channel_id\": 34,\n        \"channel_username\": null,\n        \"channel_alt_id\": null,\n        \"is_merge\": 0,\n        \"is_merged_with_new_logic\": 0,\n        \"is_revertable\": 1,\n        \"merge_order_summary_id\": null,\n        \"is_split\": 0,\n        \"split_order_summary_id\": null,\n        \"is_sorted\": 0,\n        \"contact_id\": 5792,\n        \"shipping_name_company\": null,\n        \"shipping_name\": \"Test Customer\",\n        \"shipping_address_line_one\": \"2 New Street\",\n        \"shipping_address_line_two\": null,\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_county\": null,\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 2BB\",\n        \"shipping_address_packing_postcode\": null,\n        \"shipping_address_iso\": \"GB\",\n        \"invoice_name_company\": null,\n        \"invoice_name\": \"Test Customer\",\n        \"invoice_address_line_one\": \"1 Test Street\",\n        \"invoice_address_line_two\": null,\n        \"invoice_address_city\": \"London\",\n        \"invoice_address_county\": null,\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"SW1A 1AA\",\n        \"invoice_address_iso\": \"GB\",\n        \"email\": \"g1a-test@example.com\",\n        \"email_shipping\": \"g1a-test@example.com\",\n        \"phone_one\": \"+44 1234 567890\",\n        \"phone_two\": null,\n        \"total_paid\": \"28.9900\",\n        \"total_discount\": \"0.0000\",\n        \"order_discount\": \"0.0000\",\n        \"total_tax\": \"0.0000\",\n        \"auto_calculate_tax\": 1,\n        \"shipping_paid\": \"4.9900\",\n        \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n        \"lock_shipping_method\": 0,\n        \"shipping_tracking_code\": null,\n        \"payment_method\": \"\",\n        \"payment_ref\": null,\n        \"payment_currency\": \"GBP\",\n        \"sales_channel\": \"Manual\",\n        \"date_received\": \"2026-04-30 13:06:41\",\n        \"date_dispatched\": \"0000-00-00 00:00:00\",\n        \"collection_date\": null,\n        \"allowed_despatch_date\": null,\n        \"ship_by_date\": null,\n        \"customer_comments\": \"Updated via Postman test\",\n        \"gift_note\": null,\n        \"delivery_instructions\": null,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"channel_updated\": 0,\n        \"channel_updated_time\": 0,\n        \"total_weight\": \"0.000\",\n        \"one_off_shipment\": 0,\n        \"shipment_id\": null,\n        \"fulfilment_client_id\": null,\n        \"sync_informed\": 0,\n        \"total_inventory_count\": 0,\n        \"total_inventory_quantity\": 0,\n        \"stock_levels_adjusted\": 0,\n        \"custom_fields\": {},\n        \"pudo_id\": null,\n        \"ioss_number\": null,\n        \"ukims_number\": null,\n        \"vat_number\": null,\n        \"eori_number\": null,\n        \"tax_id\": null,\n        \"access_url\": null,\n        \"packer_id\": null,\n        \"packed_at\": 0,\n        \"calculated_shipping_service\": null,\n        \"calculated_shipping_service_run_count\": 0,\n        \"is_sent_accounting_invoice\": 0,\n        \"pregenerated_label\": 0,\n        \"has_ecommerce_return\": 0,\n        \"is_locked\": 0,\n        \"is_bopis\": 0,\n        \"is_easyship\": 0,\n        \"is_force_despatched\": 0,\n        \"is_force_locked\": 0,\n        \"is_dropship\": 0,\n        \"fulfilment_job_status\": 0,\n        \"is_new_order\": 0,\n        \"is_archived\": 0,\n        \"created_at\": \"2026-04-30 13:06:41\",\n        \"updated_at\": \"2026-04-30 13:06:50\",\n        \"webhook_run_id\": null,\n        \"batch_label\": 0,\n        \"is_mcf\": 0,\n        \"mcf_plugin_id\": null,\n        \"created_date\": \"2026-04-30\",\n        \"is_pos\": 0,\n        \"tracking_status_id\": null,\n        \"dtpp_run\": null,\n        \"dtpp_queue_status\": null,\n        \"dtpp_started_at\": null,\n        \"dtpp_queue_error\": null,\n        \"pick_completed_at\": null,\n        \"status\": \"Despatch Ready\"\n    }\n}"},{"id":"47bcfa79-e296-40c7-8b3e-205fa4af2b15","name":"Validation error - order status cannot be edited","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"customer_comments\": \"Updated note\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update","description":"Updates editable fields on an existing order. Send only the fields you want to change — anything omitted stays as-is.\n\n### Use cases\n- Changing the order status as the workflow progresses.\n- Correcting an address before despatch.\n- Updating payment metadata after a refund/partial-charge.\n- Replacing the order's notes list.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users can only edit orders that belong to them.\n\n### Path parameter\n- `` — internal order ID.\n\n### Body fields\nAll optional. The same fields documented under **Create Order**, plus:\n- `status_id` — see status enum in the folder description.\n- `notes` — array of strings; **replaces** all existing notes on the order.\n- `custom_fields` — object; replaces existing custom-field values.\n\n### Important constraints\n- You **cannot** set `status_id` to `5` (Despatched) via this endpoint — book a shipment or use **Despatch with Tracking Code** instead. Trying to do so returns `422`.\n- You **cannot** set `status_id` to `2800` (New Order).\n- Orders with `pregenerated_label = 1` only allow updates to `status_id` and `notes`. Any other field is silently ignored and the response includes a warning message.\n- `total_discount` cannot exceed `total_paid` — `422` otherwise.\n- Orders that are merged (status `3000`) cannot be updated at all — `422`.\n- Setting `auto_calculate_tax` from `1` → `0` resets `total_tax` to `0`. Setting it `1` triggers tax recalculation.\n- If the order is linked to a contact, updates to `vat_number` / `eori_number` / `tax_id` / `ioss_number` / `ukims_number` are also written to the contact.\n\n### Response\nThe updated order record. If a pregenerated-label restriction was hit, the response includes a top-level `message` field explaining what was ignored.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"This order cannot be updated while it is in the 'Picking' status.\"\n}"},{"id":"c0cfa2d6-b548-49c6-93ba-659a665f5896","name":"Validation error - unknown or blocked status","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"status_id\": 99999\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update","description":"Updates editable fields on an existing order. Send only the fields you want to change — anything omitted stays as-is.\n\n### Use cases\n- Changing the order status as the workflow progresses.\n- Correcting an address before despatch.\n- Updating payment metadata after a refund/partial-charge.\n- Replacing the order's notes list.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users can only edit orders that belong to them.\n\n### Path parameter\n- `` — internal order ID.\n\n### Body fields\nAll optional. The same fields documented under **Create Order**, plus:\n- `status_id` — see status enum in the folder description.\n- `notes` — array of strings; **replaces** all existing notes on the order.\n- `custom_fields` — object; replaces existing custom-field values.\n\n### Important constraints\n- You **cannot** set `status_id` to `5` (Despatched) via this endpoint — book a shipment or use **Despatch with Tracking Code** instead. Trying to do so returns `422`.\n- You **cannot** set `status_id` to `2800` (New Order).\n- Orders with `pregenerated_label = 1` only allow updates to `status_id` and `notes`. Any other field is silently ignored and the response includes a warning message.\n- `total_discount` cannot exceed `total_paid` — `422` otherwise.\n- Orders that are merged (status `3000`) cannot be updated at all — `422`.\n- Setting `auto_calculate_tax` from `1` → `0` resets `total_tax` to `0`. Setting it `1` triggers tax recalculation.\n- If the order is linked to a contact, updates to `vat_number` / `eori_number` / `tax_id` / `ioss_number` / `ukims_number` are also written to the contact.\n\n### Response\nThe updated order record. If a pregenerated-label restriction was hit, the response includes a top-level `message` field explaining what was ignored.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"Order status ID 99999 does not exist.\"\n}"}],"_postman_id":"869dc578-15de-49af-8420-bd07c03facf9"},{"name":"Cancel Order","id":"055af9af-1597-4d88-bd64-a9c82060caf1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel","description":"<p>Cancels an order - sets its status to <code>6</code> (Cancelled), releases its stock allocations, removes it from any pick it is on, cancels a pre-generated shipping label with the courier and clears its tote/box assignment.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user at or above the order cancel permission level configured under Settings in Helm (Supervisor by default). Fulfilment-client users can only cancel their own orders and, below that permission level, only while the order is in a status flagged as cancellable for fulfilment clients (for example Back Order).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order must not already be despatched (<code>status_id == 5</code>) - <code>422</code> otherwise. Use <strong>Cancel Shipping Label</strong> first; that returns the order to a cancellable state.</li>\n<li>The order must not be merged (<code>status_id == 3000</code>) - <code>422</code> otherwise.</li>\n<li>Callers without the required permission receive <code>422</code> with a message explaining which rule blocked the request.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre><h3 id=\"reversing-a-cancellation\">Reversing a cancellation</h3>\n<p>Use <strong>Update Order</strong> with a <code>status_id</code> to move a cancelled order back into the workflow (for example <code>3</code> for Despatch Ready). Only the status and notes are applied on that call.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","cancel"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"3f383f33-65e0-4cb7-b953-bc32ca40215c","name":"200 — cancelled","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order/6311/cancel"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\"\n}"},{"id":"945cf063-baf8-4108-b1d4-0797fe0297be","name":"Validation error - order already despatched","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order/6311/cancel"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"A despatched order cannot be cancelled. Cancel its shipping label first.\"\n}"}],"_postman_id":"055af9af-1597-4d88-bd64-a9c82060caf1"},{"name":"Cancel Shipping Label","id":"3aed3d7d-3e42-41c8-b70e-c987f1ea19ec","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"<p>Cancels the shipping label attached to an order, with the courier where supported. Two situations are handled:</p>\n<ul>\n<li><strong>Despatched order</strong> (<code>status_id == 5</code> with a shipment): the label is cancelled and the order is returned to a pre-despatch state. Use this before <strong>Cancel Order</strong> when the order has already been despatched. The response is <code>success</code> and the message ends with <code>Your order has been reset.</code>. The order is returned to a pre-despatch state even if the courier refuses to cancel the label; the message then carries the courier's reason followed by <code>The label could not be cancelled at the courier, but your order has been reset.</code> Check with the courier that the label is void.</li>\n<li><strong>Order carrying a pre-generated label</strong> (<code>pregenerated_label = 1</code>, not despatched): every active label on the order is cancelled with the courier, the pre-generated flag is cleared and the order <strong>keeps its current status</strong>. This is the way to remove a pre-generated label through the API; you do not need to cancel the order itself.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only act on orders that belong to them (<code>401</code> otherwise).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order must either be despatched with a shipment, or carry a pre-generated label. Otherwise <code>422</code>.</li>\n<li>A pre-generated order whose labels have all been cancelled already (for example cancelled from Batch History while the order was not despatched) still carries the pre-generated flag and cannot be packed. Calling this endpoint on it clears the flag and returns <code>success</code> with <code>ref: null</code> and the message <code>The pregenerated label had already been cancelled, so the order has been cleared and can be packed again.</code> No request is sent to the courier. The order keeps its status, and a new label is created when it is packed.</li>\n<li>An order whose pre-generated label has been requested but not yet received from the courier cannot be cancelled yet and returns <code>422</code>. Try again once the label has arrived.</li>\n<li>An order whose labels are all cancelled but which is part of a batch that is still in progress is left as it is: the response is <code>fail</code> with the message <code>A batch label request is still being processed for this order, so its label flags were left in place.</code> Try again once the batch has finished.</li>\n<li>Labels that have already been manifested cannot be cancelled; the response comes back with <code>status: \"fail\"</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n</code></pre><p><code>ref</code> is the label reference (comma-separated when several labels were cancelled). A <code>fail</code> status means the courier rejected the cancellation request - the <code>message</code> field carries the courier's reason. On a <code>fail</code> for a pre-generated label the label the courier refused stays open and the order keeps its pre-generated flag, so the same call can be retried. The flag is cleared only once every open label on the order has been cancelled.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","cancel_label"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"daea8196-2b32-49d7-905e-2265e34be634","name":"Success - despatched order reset","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"Cancels the shipping label of a despatched order, with the courier where supported, and returns the order to a pre-despatch state. Use this before **Cancel Order** when the order has already been despatched.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Constraints\n- The order must have a `shipment_id` AND `status_id == 5` (Despatched). Otherwise `422`.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n```\n\nA `fail` status indicates the courier rejected the cancellation request — the `message` field carries the reason.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"ref\": \"DC1788766010428\",\n  \"message\": \"royalmail Label cancelled succesfully. Your order has been reset.\"\n}"},{"id":"ac24928a-f90f-4094-b4ec-0c82c616e79d","name":"Success - despatched order reset, courier refused","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"Cancels the shipping label of a despatched order, with the courier where supported, and returns the order to a pre-despatch state. Use this before **Cancel Order** when the order has already been despatched.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Constraints\n- The order must have a `shipment_id` AND `status_id == 5` (Despatched). Otherwise `422`.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n```\n\nA `fail` status indicates the courier rejected the cancellation request — the `message` field carries the reason.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"ref\": \"DC1788766010428\",\n  \"message\": \"royalmail Message: Shipment already collected. The label could not be cancelled at the courier, but your order has been reset.\"\n}"},{"id":"a1565eb0-39c5-4b53-901d-36860b3c3dd6","name":"Success - pre-generated label cancelled","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"Cancels the shipping label of a despatched order, with the courier where supported, and returns the order to a pre-despatch state. Use this before **Cancel Order** when the order has already been despatched.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Constraints\n- The order must have a `shipment_id` AND `status_id == 5` (Despatched). Otherwise `422`.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n```\n\nA `fail` status indicates the courier rejected the cancellation request — the `message` field carries the reason.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"ref\": \"DC1788766010428\",\n    \"message\": \"royalmail Label cancelled succesfully.\"\n}"},{"id":"c6b6424d-0956-4f54-909b-6d20fdc34e13","name":"Success - label was already cancelled, order cleared","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"Cancels the shipping label of a despatched order, with the courier where supported, and returns the order to a pre-despatch state. Use this before **Cancel Order** when the order has already been despatched.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Constraints\n- The order must have a `shipment_id` AND `status_id == 5` (Despatched). Otherwise `422`.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n```\n\nA `fail` status indicates the courier rejected the cancellation request — the `message` field carries the reason.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"ref\": null,\n    \"message\": \"The pregenerated label had already been cancelled, so the order has been cleared and can be packed again.\"\n}"},{"id":"aaaee2a5-5214-460c-b4ba-c81ec56f87ec","name":"Courier rejected the cancellation","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"Cancels the shipping label of a despatched order, with the courier where supported, and returns the order to a pre-despatch state. Use this before **Cancel Order** when the order has already been despatched.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Constraints\n- The order must have a `shipment_id` AND `status_id == 5` (Despatched). Otherwise `422`.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n```\n\nA `fail` status indicates the courier rejected the cancellation request — the `message` field carries the reason.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"fail\",\n    \"ref\": \"DC1788766010428\",\n    \"message\": \"royalmail Message: Shipment already collected. The pregenerated label is still active and the order has not been changed.\"\n}"},{"id":"25f6c69c-0115-4750-975d-6f46cf11e498","name":"Validation error - nothing to cancel","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order//cancel_label","description":"Cancels the shipping label of a despatched order, with the courier where supported, and returns the order to a pre-despatch state. Use this before **Cancel Order** when the order has already been despatched.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Constraints\n- The order must have a `shipment_id` AND `status_id == 5` (Despatched). Otherwise `422`.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"fail\",\n  \"ref\":    string|null,\n  \"message\": string|null\n}\n```\n\nA `fail` status indicates the courier rejected the cancellation request — the `message` field carries the reason.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"The order has no shipping label to cancel: it is neither despatched nor carrying a pre-generated label.\"\n}"}],"_postman_id":"3aed3d7d-3e42-41c8-b70e-c987f1ea19ec"},{"name":"Delete Order","id":"f422ba2a-8100-45fb-a734-acc199e49bd1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/order//delete","description":"<p>Soft-deletes an order. The order remains in the database (audit trail) but is filtered out of all listing endpoints.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only delete their own orders.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Cannot delete merged orders (<code>status_id == 3000</code>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;order_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"dcb1a064-6508-4f3b-8d4f-c0d5f457fe0c","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/order//delete","description":"Soft-deletes an order. The order remains in the database (audit trail) but is filtered out of all listing endpoints.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users can only delete their own orders.\n\n### Constraints\n- Cannot delete merged orders (`status_id == 3000`).\n\n### Response\n```\n{ \"id\": <order_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6314\n}"}],"_postman_id":"f422ba2a-8100-45fb-a734-acc199e49bd1"},{"name":"Add Inventory to Order","id":"f0c8830b-b4f7-4503-a81d-5981dcd7ea19","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"inventory_id\":         1,                       // existing inventory record\n            \"sku\":                  \"ha_product_test_1\",     // SKU code on the line\n            \"name\":                 \"HA Product Test - 1\",   // display name on the line\n            \"quantity\":             1,                       // default 1\n            \"unit_price\":           1.00,                    // default 0; stored as absolute value\n            \"unit_tax\":             0.00,                    // default 0\n            \"line_total_discount\":  0.00,                    // default 0\n            \"hs_code\":              \"\",                      // customs HS/tariff code\n            \"country_of_origin\":    \"GB\"                     // ISO country code\n            // Optional: \"notes\": \"\", \"image_url\": \"\", \"fulfilment_client_id\": null\n            // Optional batch selection (batch-numbered items only, quantities must sum to the line quantity):\n            // \"batches\": [ { \"batch_value\": \"BATCH-A\", \"quantity\": 4 },\n            //               { \"batch_value\": \"BATCH-B\", \"quantity\": 6 } ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_inventory","description":"<p>Adds one or more inventory line items to an existing order.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — internal order ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least one item required.</td>\n</tr>\n<tr>\n<td><code>items[].inventory_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Existing inventory record to link the line to.</td>\n</tr>\n<tr>\n<td><code>items[].name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Display name on the line.</td>\n</tr>\n<tr>\n<td><code>items[].sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>SKU code on the line.</td>\n</tr>\n<tr>\n<td><code>items[].quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>items[].unit_price</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>items[].unit_tax</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>items[].line_total_discount</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>items[].options</code></td>\n<td>object</td>\n<td>no</td>\n<td>Free-form per-line attributes.</td>\n</tr>\n<tr>\n<td><code>items[].notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-line note.</td>\n</tr>\n<tr>\n<td><code>items[].image_url</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-line image URL.</td>\n</tr>\n<tr>\n<td><code>items[].hs_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>Customs HS code.</td>\n</tr>\n<tr>\n<td><code>items[].country_of_origin</code></td>\n<td>string</td>\n<td>no</td>\n<td>ISO code.</td>\n</tr>\n<tr>\n<td><code>items[].fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Fulfilment client ID; auto-set if the API user is a fulfilment-client user.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order must not be in status <code>4</code> (Picking), <code>10</code> (Picked), <code>6</code> (Cancelled), <code>5</code> (Despatched), or <code>3000</code> (Merged). Otherwise <code>422</code>.</li>\n<li>The order must not have a pre-generated label. If it does, you must cancel the label first.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"success\" | \"partial_success\" | \"fail\",\n  \"result\": {\n    \"items\": [ ...created order_inventory rows... ],\n    \"errors\": [ { \"input\": {...}, \"error\": \"...\" } ]\n  }\n}\n</code></pre><p><code>partial_success</code> is returned when some items succeeded and some failed (per-item validation, missing inventory, etc.).</p>\n<h3 id=\"batch-selection-batch-numbered-items-only\">Batch selection (batch-numbered items only)</h3>\n<p>Each item accepts an optional <code>batches</code> array to pin specific batches instead of Helm's default expiry-based (FEFO) auto-selection. Only for inventory items with <code>batching_type = 2</code>; the selection is applied as an immediate stock allocation with exact per-batch quantities.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items[].batches[]</code></td>\n<td>array</td>\n<td>no</td>\n<td>Optional batch selection for the line.</td>\n</tr>\n<tr>\n<td><code>items[].batches[].batch_value</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Existing batch number for this inventory item (created via <code>add_inventory_batch</code>).</td>\n</tr>\n<tr>\n<td><code>items[].batches[].quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Units to take from that batch (&gt;= 1). Quantities must sum to the line quantity.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Notes:</p>\n<ul>\n<li>Multi-batch per line is supported (split a line across batches).</li>\n<li>Duplicate <code>batch_value</code> entries are merged (quantities summed).</li>\n<li>A batch value held at several locations is drawn FEFO across locations (all warehouses; pickable, on-hand, non-tote locations - same scope as the UI batch selector).</li>\n<li>The selection is also saved as the line's batch preference list (same mechanism as the order-edit UI), so wave/zone re-allocation keeps preferring these batches.</li>\n<li>An invalid selection NEVER fails the request: the line is still created, falls back to default selection, and the problem is reported in <code>result.warnings</code>. HTTP status stays 200.</li>\n<li>Each successfully processed item gains a <code>batch_assignments</code> array in the response showing what was actually allocated (<code>batch_value</code>, <code>quantity</code>, <code>location_id</code>, <code>expire_date</code>).</li>\n<li>Verify assignments any time via <code>GET /order/{id}/batch-values?include=allocations</code>.</li>\n</ul>\n<h4 id=\"warning-codes\">Warning codes</h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Trigger</th>\n<th>Behaviour</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_not_found</code></td>\n<td>Batch value does not exist for that inventory item (a batch of a different inventory item is indistinguishable - lookup is inventory-scoped)</td>\n<td>Whole line falls back to default FEFO selection</td>\n</tr>\n<tr>\n<td><code>quantity_mismatch</code></td>\n<td>Sum of batch quantities != line quantity</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>invalid_batch_payload</code></td>\n<td>Malformed entry (empty <code>batch_value</code>, non-integer or &lt; 1 <code>quantity</code>)</td>\n<td>Selection rejected for the line</td>\n</tr>\n<tr>\n<td><code>line_not_batch_numbered</code></td>\n<td>Inventory item is not batch numbered (<code>batching_type != 2</code>, incl. serial-numbered)</td>\n<td>Selection ignored</td>\n</tr>\n<tr>\n<td><code>unsupported_line_type</code></td>\n<td>Group/kit SKU or dynamic assembly item</td>\n<td>Selection ignored; assign batches to the expanded child lines instead</td>\n</tr>\n<tr>\n<td><code>line_not_found</code></td>\n<td>assign-batches only: <code>order_inventory_id</code> not on this order</td>\n<td>Line skipped</td>\n</tr>\n<tr>\n<td><code>insufficient_batch_stock</code></td>\n<td>Requested quantity exceeds the batch's available stock</td>\n<td>Available quantity assigned, remainder left to default selection</td>\n</tr>\n<tr>\n<td><code>batch_expired</code></td>\n<td>Assigned batch's <code>expire_date</code> is in the past</td>\n<td>Honoured, warning returned</td>\n</tr>\n<tr>\n<td><code>batch_assignment_failed</code></td>\n<td>Unexpected internal error while applying a validated selection</td>\n<td>Selection not applied for the line</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","add_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"c3468ce5-15bb-449a-a2b8-9a04c2408e07","name":"200 — items added","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"items\":[{\"inventory_id\":744,\"sku\":\"API-TEST-001\",\"name\":\"API Test Product\",\"quantity\":2,\"unit_price\":12.99}]}"},"url":"https://your-company.myhelm.app/public-api/order/6311/add_inventory"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"result\": {\n        \"items\": [\n            {\n                \"id\": 21150,\n                \"inventory_id\": 744,\n                \"order_summary_id\": 6311,\n                \"sku\": \"API-TEST-001\",\n                \"quantity\": 2,\n                \"name\": \"API Test Product\",\n                \"unit_price\": \"12.9900\",\n                \"unit_tax\": \"0.0000\",\n                \"line_total_discount\": \"0.0000\",\n                \"price\": \"25.9800\",\n                \"hs_code\": \"\",\n                \"country_of_origin\": \"GB\",\n                \"created_at\": \"2026-04-30 11:50:51\",\n                \"updated_at\": \"2026-04-30 11:50:51\"\n            }\n        ],\n        \"errors\": []\n    }\n}"},{"id":"7fcb9213-326a-4f29-93ab-52bb29feb08a","name":"Success - Multi-line","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"inventory_id\":         1,                       // existing inventory record\n            \"sku\":                  \"ha_product_test_1\",     // SKU code on the line\n            \"name\":                 \"HA Product Test - 1\",   // display name on the line\n            \"quantity\":             1,                       // default 1\n            \"unit_price\":           1.00,                    // default 0; stored as absolute value\n            \"unit_tax\":             0.00,                    // default 0\n            \"line_total_discount\":  0.00,                    // default 0\n            \"hs_code\":              \"\",                      // customs HS/tariff code\n            \"country_of_origin\":    \"GB\"                     // ISO country code\n            // \"options\": {}, \"notes\": \"\", \"image_url\": \"\", \"fulfilment_client_id\": null  // also accepted\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_inventory","description":"Adds one or more inventory line items to an existing order.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Path parameter\n- `` — internal order ID.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `items[]` | array | yes | At least one item required. |\n| `items[].inventory_id` | int | no | Existing inventory record to link the line to. |\n| `items[].name` | string | no | Display name on the line. |\n| `items[].sku` | string | no | SKU code on the line. |\n| `items[].quantity` | int | no | Default `1`. |\n| `items[].unit_price` | number | no | Default `0`. |\n| `items[].unit_tax` | number | no | Default `0`. |\n| `items[].line_total_discount` | number | no | Default `0`. |\n| `items[].options` | object | no | Free-form per-line attributes. |\n| `items[].notes` | string | no | Per-line note. |\n| `items[].image_url` | string | no | Per-line image URL. |\n| `items[].hs_code` | string | no | Customs HS code. |\n| `items[].country_of_origin` | string | no | ISO code. |\n| `items[].fulfilment_client_id` | int | no | Fulfilment client ID; auto-set if the API user is a fulfilment-client user. |\n\n### Constraints\n- The order must not be in status `4` (Picking), `10` (Picked), `6` (Cancelled), `5` (Despatched), or `3000` (Merged). Otherwise `422`.\n- The order must not have a pre-generated label. If it does, you must cancel the label first.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"partial_success\" | \"fail\",\n  \"result\": {\n    \"items\": [ ...created order_inventory rows... ],\n    \"errors\": [ { \"input\": {...}, \"error\": \"...\" } ]\n  }\n}\n```\n\n`partial_success` is returned when some items succeeded and some failed (per-item validation, missing inventory, etc.).\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"result\": {\n    \"items\": [\n      {\n        \"id\": 21152,\n        \"inventory_id\": 2,\n        \"order_summary_id\": 6312,\n        \"merge_order_summary_id\": null,\n        \"sales_channel_item_id\": null,\n        \"channel_product_sku\": null,\n        \"sku\": \"ha_product_test_2\",\n        \"kit_sku\": null,\n        \"quantity\": 1,\n        \"kit_quantity\": null,\n        \"name\": \"HA Product Test - 2\",\n        \"unit_price\": \"9.5000\",\n        \"unit_tax\": \"1.9000\",\n        \"line_total_discount\": \"0.5000\",\n        \"price\": \"9.0000\",\n        \"options\": \"\",\n        \"selected_batches\": null,\n        \"notes\": \"Second line\",\n        \"hs_code\": \"950300\",\n        \"country_of_origin\": \"GB\",\n        \"customs_description\": null,\n        \"allocated_location_list\": null,\n        \"temp_identifier\": null,\n        \"created_at\": \"2026-04-30 13:07:47\",\n        \"updated_at\": \"2026-04-30 13:07:47\"\n      }\n    ],\n    \"errors\": []\n  }\n}"},{"id":"a349ac4d-dae1-4c7b-aeab-d4d9894241ad","name":"Partial Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"inventory_id\":         1,                       // existing inventory record\n            \"sku\":                  \"ha_product_test_1\",     // SKU code on the line\n            \"name\":                 \"HA Product Test - 1\",   // display name on the line\n            \"quantity\":             1,                       // default 1\n            \"unit_price\":           1.00,                    // default 0; stored as absolute value\n            \"unit_tax\":             0.00,                    // default 0\n            \"line_total_discount\":  0.00,                    // default 0\n            \"hs_code\":              \"\",                      // customs HS/tariff code\n            \"country_of_origin\":    \"GB\"                     // ISO country code\n            // \"options\": {}, \"notes\": \"\", \"image_url\": \"\", \"fulfilment_client_id\": null  // also accepted\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_inventory","description":"Adds one or more inventory line items to an existing order.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Path parameter\n- `` — internal order ID.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `items[]` | array | yes | At least one item required. |\n| `items[].inventory_id` | int | no | Existing inventory record to link the line to. |\n| `items[].name` | string | no | Display name on the line. |\n| `items[].sku` | string | no | SKU code on the line. |\n| `items[].quantity` | int | no | Default `1`. |\n| `items[].unit_price` | number | no | Default `0`. |\n| `items[].unit_tax` | number | no | Default `0`. |\n| `items[].line_total_discount` | number | no | Default `0`. |\n| `items[].options` | object | no | Free-form per-line attributes. |\n| `items[].notes` | string | no | Per-line note. |\n| `items[].image_url` | string | no | Per-line image URL. |\n| `items[].hs_code` | string | no | Customs HS code. |\n| `items[].country_of_origin` | string | no | ISO code. |\n| `items[].fulfilment_client_id` | int | no | Fulfilment client ID; auto-set if the API user is a fulfilment-client user. |\n\n### Constraints\n- The order must not be in status `4` (Picking), `10` (Picked), `6` (Cancelled), `5` (Despatched), or `3000` (Merged). Otherwise `422`.\n- The order must not have a pre-generated label. If it does, you must cancel the label first.\n\n### Response\n```\n{\n  \"status\": \"success\" | \"partial_success\" | \"fail\",\n  \"result\": {\n    \"items\": [ ...created order_inventory rows... ],\n    \"errors\": [ { \"input\": {...}, \"error\": \"...\" } ]\n  }\n}\n```\n\n`partial_success` is returned when some items succeeded and some failed (per-item validation, missing inventory, etc.).\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"partial_success\",\n  \"result\": {\n    \"items\": [\n      {\n        \"id\": 21153,\n        \"inventory_id\": 3,\n        \"order_summary_id\": 6312,\n        \"merge_order_summary_id\": null,\n        \"sales_channel_item_id\": null,\n        \"channel_product_sku\": null,\n        \"sku\": \"po_test\",\n        \"kit_sku\": null,\n        \"quantity\": 1,\n        \"kit_quantity\": null,\n        \"name\": \"\",\n        \"unit_price\": \"2.0000\",\n        \"unit_tax\": \"0.0000\",\n        \"line_total_discount\": \"0.0000\",\n        \"price\": \"2.0000\",\n        \"options\": \"\",\n        \"selected_batches\": null,\n        \"notes\": \"\",\n        \"hs_code\": \"\",\n        \"country_of_origin\": \"\",\n        \"customs_description\": null,\n        \"allocated_location_list\": null,\n        \"temp_identifier\": null,\n        \"created_at\": \"2026-04-30 13:07:47\",\n        \"updated_at\": \"2026-04-30 13:07:47\"\n      }\n    ],\n    \"errors\": [\n      {\n        \"input\": {\n          \"inventory_id\": 999999,\n          \"sku\": \"BAD-SKU\",\n          \"quantity\": 1,\n          \"unit_price\": 1\n        },\n        \"error\": \"name field is required.\"\n      }\n    ]\n  }\n}"},{"id":"33342de8-65c3-484c-b1eb-7766b707bf10","name":"200 — batch selection: assigned + warnings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"inventory_id\": 802,\n            \"sku\": \"CLB-API-1\",\n            \"name\": \"Product A\",\n            \"quantity\": 10,\n            \"unit_price\": 2.5,\n            \"batches\": [\n                {\n                    \"batch_value\": \"BATCH-A\",\n                    \"quantity\": 4\n                },\n                {\n                    \"batch_value\": \"BATCH-B\",\n                    \"quantity\": 6\n                }\n            ]\n        },\n        {\n            \"inventory_id\": 803,\n            \"sku\": \"CLB-API-2\",\n            \"name\": \"Product B\",\n            \"quantity\": 3,\n            \"batches\": [\n                {\n                    \"batch_value\": \"NOPE-1\",\n                    \"quantity\": 3\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178934/add_inventory"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"result\": {\n        \"items\": [\n            {\n                \"id\": 193982,\n                \"inventory_id\": 802,\n                \"order_summary_id\": 178934,\n                \"sku\": \"CLB-API-1\",\n                \"name\": \"Product A\",\n                \"quantity\": 10,\n                \"unit_price\": \"2.5000\",\n                \"batch_assignments\": [\n                    {\n                        \"batch_value\": \"BATCH-A\",\n                        \"quantity\": 4,\n                        \"location_id\": 12,\n                        \"expire_date\": \"2027-03-01\"\n                    },\n                    {\n                        \"batch_value\": \"BATCH-B\",\n                        \"quantity\": 6,\n                        \"location_id\": 12,\n                        \"expire_date\": null\n                    }\n                ]\n            },\n            {\n                \"id\": 193983,\n                \"inventory_id\": 803,\n                \"order_summary_id\": 178934,\n                \"sku\": \"CLB-API-2\",\n                \"name\": \"Product B\",\n                \"quantity\": 3,\n                \"unit_price\": \"0.0000\"\n            }\n        ],\n        \"errors\": [],\n        \"warnings\": [\n            {\n                \"code\": \"batch_not_found\",\n                \"order_inventory_id\": 193983,\n                \"inventory_id\": 803,\n                \"sku\": \"CLB-API-2\",\n                \"batch_values\": [\n                    \"NOPE-1\"\n                ],\n                \"message\": \"Batch numbers for the specified items (CLB-API-2) don't exist in the system, thus, they are not auto-selected. Please use the assign batches API request after making sure the specified batches are in the system.\"\n            }\n        ]\n    }\n}"}],"_postman_id":"f0c8830b-b4f7-4503-a81d-5981dcd7ea19"},{"name":"Update Order Inventory Item","id":"c7c4a879-a4bb-468a-8c2c-5c2ba5dc13f4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_inventory_id\": 21148,\n    \"name\": \"Updated line name\",\n    \"quantity\": 2,\n    \"unit_price\": 1.50,\n    \"unit_tax\": 0.30,\n    \"line_total_discount\": 0.00,\n    \"options\": {},\n    \"notes\": \"\",\n    \"hs_code\": \"\",\n    \"country_of_origin\": \"GB\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update_inventory","description":"<p>Updates a single inventory line on an order. Pass the order line's <code>id</code> (NOT the inventory ID) as <code>order_inventory_id</code>.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_inventory_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The <code>id</code> of the order line to update (from the <code>inventory[]</code> array on the order detail).</td>\n</tr>\n<tr>\n<td><code>name</code> / <code>quantity</code> / <code>unit_price</code> / <code>unit_tax</code> / <code>line_total_discount</code> / <code>options</code> / <code>notes</code> / <code>hs_code</code> / <code>country_of_origin</code></td>\n<td>mixed</td>\n<td>no</td>\n<td>Only these fields can be updated. Anything else is ignored.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Order status must not be <code>4</code> / <code>10</code> / <code>6</code> / <code>5</code> / <code>3000</code>.</li>\n<li>Pre-generated label orders are read-only on inventory.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated order_inventory record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","update_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"3eeef52a-4537-4bb3-9961-350a21925814","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_inventory_id\": 21148,\n    \"name\": \"Updated line name\",\n    \"quantity\": 2,\n    \"unit_price\": 1.50,\n    \"unit_tax\": 0.30,\n    \"line_total_discount\": 0.00,\n    \"options\": {},\n    \"notes\": \"\",\n    \"hs_code\": \"\",\n    \"country_of_origin\": \"GB\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update_inventory","description":"Updates a single inventory line on an order. Pass the order line's `id` (NOT the inventory ID) as `order_inventory_id`.\n\n### Permissions\nAny authenticated user (Supervisor+).\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `order_inventory_id` | int | yes | The `id` of the order line to update (from the `inventory[]` array on the order detail). |\n| `name` / `quantity` / `unit_price` / `unit_tax` / `line_total_discount` / `options` / `notes` / `hs_code` / `country_of_origin` | mixed | no | Only these fields can be updated. Anything else is ignored. |\n\n### Constraints\n- Order status must not be `4` / `10` / `6` / `5` / `3000`.\n- Pre-generated label orders are read-only on inventory.\n\n### Response\nThe updated order_inventory record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 21151,\n  \"inventory_id\": 1,\n  \"order_summary_id\": 6312,\n  \"merge_order_summary_id\": null,\n  \"sales_channel_item_id\": null,\n  \"channel_product_sku\": null,\n  \"sku\": \"ha_product_test_1\",\n  \"kit_sku\": null,\n  \"quantity\": 5,\n  \"kit_quantity\": null,\n  \"name\": \"Updated line - HA Product Test 1\",\n  \"unit_price\": \"4.5000\",\n  \"unit_tax\": \"0.9000\",\n  \"line_total_discount\": \"1.0000\",\n  \"price\": \"21.5000\",\n  \"options\": \"\",\n  \"selected_batches\": null,\n  \"notes\": \"Updated by test\",\n  \"hs_code\": \"950300\",\n  \"country_of_origin\": \"GB\",\n  \"customs_description\": null,\n  \"allocated_location_list\": null,\n  \"temp_identifier\": null,\n  \"created_at\": \"2026-04-30 13:07:37\",\n  \"updated_at\": \"2026-04-30 13:07:58\"\n}"}],"_postman_id":"c7c4a879-a4bb-468a-8c2c-5c2ba5dc13f4"},{"name":"Remove Inventory from Order","id":"b0b21514-5071-4e2a-89fc-aae9d68b55a7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_inventory_id\": 21148\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//remove_inventory","description":"<p>Removes a single inventory line from an order.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>order_inventory_id</code> (int, required) — the <code>id</code> of the order line, not the inventory ID.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<p>Same as <strong>Update Order Inventory Item</strong> — order status not in <code>[4, 10, 6, 5, 3000]</code>, no pre-generated label.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;order_inventory_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","remove_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"99d71af2-4901-40c4-a459-a1ce09d2b4a1","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_inventory_id\": 21148\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//remove_inventory","description":"Removes a single inventory line from an order.\n\n### Body field\n- `order_inventory_id` (int, required) — the `id` of the order line, not the inventory ID.\n\n### Constraints\nSame as **Update Order Inventory Item** — order status not in `[4, 10, 6, 5, 3000]`, no pre-generated label.\n\n### Response\n```\n{ \"id\": <order_inventory_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 21152\n}"}],"_postman_id":"b0b21514-5071-4e2a-89fc-aae9d68b55a7"},{"name":"Add Requested Packaging to Order","id":"874825b5-48e0-4825-a657-f117ede37bbd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_id\": 820,          // packaging inventory item (or send \"sku\")\n    \"packaging_type\": 4,          // 4 = Packaging (default), 5 = Auxiliary Packaging\n    \"quantity\": 2                 // default 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_packaging","description":"<p>Adds a packaging requirement to an order: a packaging item (box, mailer, wrapper) or an auxiliary packaging item (filler, ice pack, insert) that must be used when the order is packed. Requested packaging is shown to the packer, is returned on the order detail as <code>requested_packaging[]</code>, and is used by the packing and despatch flows.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Force a fragile order into a specific box size chosen by your own system.</li>\n<li>Add branded inserts or cool-chain packaging to selected orders at import time.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only change their own orders.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>inventory_id</code></td>\n<td>int</td>\n<td>conditional</td>\n<td>ID of the packaging inventory item. Either <code>inventory_id</code> or <code>sku</code> is required; <code>inventory_id</code> wins when both are sent.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td>string</td>\n<td>conditional</td>\n<td>SKU of the packaging inventory item, used when <code>inventory_id</code> is omitted.</td>\n</tr>\n<tr>\n<td><code>packaging_type</code></td>\n<td>int</td>\n<td>no</td>\n<td><code>4</code> = Packaging (default) or <code>5</code> = Auxiliary Packaging. The inventory item must be of this type.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Whole number of at least <code>1</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order must exist and, for fulfilment-client tokens, belong to the caller's client (<code>401</code> otherwise).</li>\n<li>Cancelled and despatched orders cannot be changed; the response is <code>200</code> with an <code>error</code> message. Fulfilment-client users can only change orders in a status their client is allowed to edit.</li>\n<li>An order with a pre-generated label cannot be changed. Cancel the label first (<strong>Cancel Shipping Label</strong>).</li>\n<li>The packaging item must be of the requested <code>packaging_type</code> and must be either shared (not assigned to any fulfilment client) or assigned to the order's client; otherwise <code>404</code>.</li>\n<li>Each call adds a new entry. Adding the same item twice creates two entries; use <strong>Update Requested Packaging Quantity</strong> to change an existing one.</li>\n<li>The order's allocation status is re-evaluated after the packaging is added.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created entry. Its <code>id</code> is the <code>order_packaging_id</code> used by the update and remove endpoints. <code>requested_packaging[]</code> is the complete list now on the order.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Neither <code>inventory_id</code> nor <code>sku</code> sent</td>\n<td><code>422</code> <code>{\"validation_error\": [\"Field inventory_id or sku is required.\"]}</code></td>\n</tr>\n<tr>\n<td><code>packaging_type</code> not <code>4</code> or <code>5</code>, or <code>quantity</code> below <code>1</code></td>\n<td><code>422</code> with the field message</td>\n</tr>\n<tr>\n<td>No packaging item of that type available to the order</td>\n<td><code>404</code> <code>{\"error\": \"Packaging inventory not found for the given type, or it is not available to this order.\"}</code></td>\n</tr>\n<tr>\n<td>Order cancelled, despatched or carrying a pre-generated label</td>\n<td><code>200</code> <code>{\"error\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>Order not found or deleted</td>\n<td><code>404</code> <code>{\"error\": \"Order Not Found\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","add_packaging"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"138b0625-66e3-4a90-9c56-91bc07ac97bc","name":"200 - packaging added","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_id\": 820,          // packaging inventory item (or send \"sku\")\n    \"packaging_type\": 4,          // 4 = Packaging (default), 5 = Auxiliary Packaging\n    \"quantity\": 2                 // default 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_packaging"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6,\n  \"order_id\": 178935,\n  \"inventory_id\": 820,\n  \"quantity\": 2,\n  \"packaging_type\": 4,\n  \"inventory_name\": \"API Doc Test Box\",\n  \"inventory_sku\": \"PKG-API-DOC-BOX\",\n  \"requested_packaging\": [\n    {\n      \"id\": 6,\n      \"inventory_id\": 820,\n      \"quantity\": 2,\n      \"packaging_type\": 4,\n      \"inventory_name\": \"API Doc Test Box\",\n      \"inventory_sku\": \"PKG-API-DOC-BOX\"\n    }\n  ]\n}"},{"id":"f1a70e6b-e033-4466-80aa-119681e31057","name":"404 - no packaging item of that type","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"sku\": \"PKG-API-DOC-BOX\",\n    \"packaging_type\": 5,\n    \"quantity\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_packaging"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Packaging inventory not found for the given type, or it is not available to this order.\"\n}"},{"id":"c6ff589f-6f68-4a33-9790-317136a44aeb","name":"422 - inventory_id or sku missing","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"quantity\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_packaging"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field inventory_id or sku is required.\"\n  ]\n}"},{"id":"f799a91d-2969-4cf1-aee3-82c9fd665e45","name":"422 - invalid packaging_type","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_id\": 820,\n    \"packaging_type\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//add_packaging"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field packaging_type must be 4 (standard) or 5 (auxiliary).\"\n  ]\n}"},{"id":"4dca1f08-2094-4efd-938b-1c0a123fa9fb","name":"200 - order already despatched","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_id\": 820\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order/178934/add_packaging"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Requested packaging cannot be modified because the order is despatched.\"\n}"}],"_postman_id":"874825b5-48e0-4825-a657-f117ede37bbd"},{"name":"Update Requested Packaging Quantity","id":"7fd5f30c-7ba3-4629-a654-6df6490d5d22","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 6,\n    \"quantity\": 3\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update_packaging","description":"<p>Changes the quantity of a packaging entry already requested on an order.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only change their own orders.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_packaging_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The entry's <code>id</code>, as returned by <strong>Add Requested Packaging to Order</strong> or listed in <code>requested_packaging[]</code> on the order detail. It must belong to this order.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>New quantity. Whole number of at least <code>1</code>. To remove the entry use <strong>Remove Requested Packaging</strong>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order must exist and, for fulfilment-client tokens, belong to the caller's client (<code>401</code> otherwise).</li>\n<li>Cancelled and despatched orders cannot be changed; the response is <code>200</code> with an <code>error</code> message. Fulfilment-client users can only change orders in a status their client is allowed to edit.</li>\n<li>An order with a pre-generated label cannot be changed. Cancel the label first (<strong>Cancel Shipping Label</strong>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated entry plus <code>requested_packaging[]</code>, the complete list now on the order.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_packaging_id</code> missing</td>\n<td><code>422</code> <code>{\"validation_error\": [\"Field order_packaging_id is required.\"]}</code></td>\n</tr>\n<tr>\n<td><code>quantity</code> missing or below <code>1</code></td>\n<td><code>422</code> <code>{\"validation_error\": [\"Field quantity must be an integer of at least 1.\"]}</code></td>\n</tr>\n<tr>\n<td>Entry not found on this order</td>\n<td><code>404</code> <code>{\"error\": \"Requested packaging not found on this order.\"}</code></td>\n</tr>\n<tr>\n<td>Order cancelled, despatched or carrying a pre-generated label</td>\n<td><code>200</code> <code>{\"error\": \"...\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","update_packaging"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"2e840e84-9a64-40e5-b040-204624a70f66","name":"200 - quantity updated","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 6,\n    \"quantity\": 3\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update_packaging"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6,\n  \"order_id\": 178935,\n  \"inventory_id\": 820,\n  \"quantity\": 3,\n  \"packaging_type\": 4,\n  \"inventory_name\": \"API Doc Test Box\",\n  \"inventory_sku\": \"PKG-API-DOC-BOX\",\n  \"requested_packaging\": [\n    {\n      \"id\": 6,\n      \"inventory_id\": 820,\n      \"quantity\": 3,\n      \"packaging_type\": 4,\n      \"inventory_name\": \"API Doc Test Box\",\n      \"inventory_sku\": \"PKG-API-DOC-BOX\"\n    }\n  ]\n}"},{"id":"8aa90e11-4ae3-4bdc-aad4-ac38b7937d6a","name":"404 - entry not on this order","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 999999,\n    \"quantity\": 3\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update_packaging"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Requested packaging not found on this order.\"\n}"},{"id":"43d67409-4b0a-455b-9f23-d9e59d744b4f","name":"422 - quantity below 1","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 6,\n    \"quantity\": 0\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//update_packaging"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field quantity must be an integer of at least 1.\"\n  ]\n}"}],"_postman_id":"7fd5f30c-7ba3-4629-a654-6df6490d5d22"},{"name":"Remove Requested Packaging","id":"77712432-0156-4dc7-aeee-23a3473ac6db","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 6\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//remove_packaging","description":"<p>Removes a packaging entry from an order.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only change their own orders.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal order ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_packaging_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The entry's <code>id</code>. It must belong to this order.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order must exist and, for fulfilment-client tokens, belong to the caller's client (<code>401</code> otherwise).</li>\n<li>Cancelled and despatched orders cannot be changed; the response is <code>200</code> with an <code>error</code> message. Fulfilment-client users can only change orders in a status their client is allowed to edit.</li>\n<li>An order with a pre-generated label cannot be changed. Cancel the label first (<strong>Cancel Shipping Label</strong>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p><code>id</code> of the removed entry, the <code>order_id</code>, and <code>requested_packaging[]</code> with what remains on the order.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_packaging_id</code> missing</td>\n<td><code>422</code> <code>{\"validation_error\": [\"Field order_packaging_id is required.\"]}</code></td>\n</tr>\n<tr>\n<td>Entry not found on this order (including an entry already removed)</td>\n<td><code>404</code> <code>{\"error\": \"Requested packaging not found on this order.\"}</code></td>\n</tr>\n<tr>\n<td>Order cancelled, despatched or carrying a pre-generated label</td>\n<td><code>200</code> <code>{\"error\": \"...\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","remove_packaging"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"05dc567c-1ca6-4400-87bc-904e422cfe19","name":"200 - entry removed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 6\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//remove_packaging"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6,\n  \"order_id\": 178935,\n  \"requested_packaging\": []\n}"},{"id":"9c1dd664-9db7-4b67-a596-5c6d9cf8df51","name":"404 - entry not on this order","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": 6\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//remove_packaging"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Requested packaging not found on this order.\"\n}"},{"id":"8110cc52-4209-407e-9895-7273b711f5be","name":"422 - order_packaging_id missing","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_packaging_id\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//remove_packaging"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field order_packaging_id is required.\"\n  ]\n}"}],"_postman_id":"77712432-0156-4dc7-aeee-23a3473ac6db"},{"name":"Partially Allocate Order","id":"2336046f-078a-49d9-846d-03e8372b8cff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"warehouse_id\": 6,\n    \"global_allocation\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//partially_allocate","description":"<p>Allocates available stock to an order from a specific warehouse — full allocation if there's enough stock, partial otherwise. If the order already has allocations, they are removed before re-allocating.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Triggering allocation when an order arrives with <code>allocation_status_id = 0</code>.</li>\n<li>Forcing re-allocation after a stock adjustment.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+) who has access to the warehouse.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>warehouse_id</code></td>\n<td>int</td>\n<td>conditional</td>\n<td>Required unless <code>global_allocation</code> is <code>true</code>.</td>\n</tr>\n<tr>\n<td><code>global_allocation</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>false</code>. If <code>true</code>, allocation is not scoped to a single warehouse. Only honoured when the <em>Global Allocation</em> feature is enabled in your tenant.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Stock-control must be enabled on the tenant.</li>\n<li>The order must be in an allocation-eligible status (typically Draft, Despatch Ready, etc.).</li>\n<li>The user must be linked to the warehouse.</li>\n<li>An order that is already fully allocated is rejected with <code>422</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"success\",\n  \"message\": \"Order fully allocated successfully.\" | \"Order partially allocated successfully.\",\n  \"order\":  { ...order_summary... },\n  \"allocations\": [ ... ]\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","partially_allocate"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"9272bd1a-86c1-4e79-8baa-23a10e561eed","name":"Success - Fully Allocated","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"warehouse_id\": 6,\n    \"global_allocation\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//partially_allocate","description":"Allocates available stock to an order from a specific warehouse — full allocation if there's enough stock, partial otherwise. If the order already has allocations, they are removed before re-allocating.\n\n### Use cases\n- Triggering allocation when an order arrives with `allocation_status_id = 0`.\n- Forcing re-allocation after a stock adjustment.\n\n### Permissions\nAny authenticated user (Supervisor+) who has access to the warehouse.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `warehouse_id` | int | conditional | Required unless `global_allocation` is `true`. |\n| `global_allocation` | bool | no | Default `false`. If `true`, allocation is not scoped to a single warehouse. Only honoured when the *Global Allocation* feature is enabled in your tenant. |\n\n### Constraints\n- Stock-control must be enabled on the tenant.\n- The order must be in an allocation-eligible status (typically Draft, Despatch Ready, etc.).\n- The user must be linked to the warehouse.\n- An order that is already fully allocated is rejected with `422`.\n\n### Response\n```\n{\n  \"status\": \"success\",\n  \"message\": \"Order fully allocated successfully.\" | \"Order partially allocated successfully.\",\n  \"order\":  { ...order_summary... },\n  \"allocations\": [ ... ]\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"message\": \"Order fully allocated successfully.\",\n  \"order\": {\n    \"id\": 6312,\n    \"status_id\": 3,\n    \"previous_status_id\": 1,\n    \"sale_type\": \"b2c\",\n    \"allocation_status_id\": 2,\n    \"bulk_despatched_without_allocation\": 0,\n    \"channel_order_id\": \"POSTMAN-TEST-G1-A\",\n    \"chapi_id\": null,\n    \"channel_id\": 34,\n    \"channel_username\": null,\n    \"channel_alt_id\": null,\n    \"is_merge\": 0,\n    \"is_merged_with_new_logic\": 0,\n    \"is_revertable\": 1,\n    \"merge_order_summary_id\": null,\n    \"is_split\": 0,\n    \"split_order_summary_id\": null,\n    \"is_sorted\": 0,\n    \"contact_id\": 5792,\n    \"shipping_name_company\": null,\n    \"shipping_name\": \"Test Customer\",\n    \"shipping_address_line_one\": \"2 New Street\",\n    \"shipping_address_line_two\": null,\n    \"shipping_address_city\": \"London\",\n    \"shipping_address_county\": null,\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"SW1A 2BB\",\n    \"shipping_address_packing_postcode\": null,\n    \"shipping_address_iso\": \"GB\",\n    \"invoice_name_company\": null,\n    \"invoice_name\": \"Test Customer\",\n    \"invoice_address_line_one\": \"1 Test Street\",\n    \"invoice_address_line_two\": null,\n    \"invoice_address_city\": \"London\",\n    \"invoice_address_county\": null,\n    \"invoice_address_country\": \"United Kingdom\",\n    \"invoice_address_postcode\": \"SW1A 1AA\",\n    \"invoice_address_iso\": \"GB\",\n    \"email\": \"g1a-test@example.com\",\n    \"email_shipping\": \"g1a-test@example.com\",\n    \"phone_one\": \"+44 1234 567890\",\n    \"phone_two\": null,\n    \"total_paid\": \"28.4900\",\n    \"total_discount\": \"1.0000\",\n    \"order_discount\": \"0.0000\",\n    \"total_tax\": \"4.5000\",\n    \"auto_calculate_tax\": 1,\n    \"shipping_paid\": \"4.9900\",\n    \"shipping_method_requested\": \"Royal Mail Tracked 24\",\n    \"lock_shipping_method\": 0,\n    \"shipping_tracking_code\": null,\n    \"payment_method\": \"\",\n    \"payment_ref\": null,\n    \"payment_currency\": \"GBP\",\n    \"sales_channel\": \"Manual\",\n    \"date_received\": \"2026-04-30 13:06:41\",\n    \"date_dispatched\": \"0000-00-00 00:00:00\",\n    \"collection_date\": null,\n    \"allowed_despatch_date\": null,\n    \"ship_by_date\": null,\n    \"customer_comments\": \"Updated via Postman test\",\n    \"gift_note\": null,\n    \"delivery_instructions\": null,\n    \"deleted\": 0,\n    \"deleted_at\": null,\n    \"channel_updated\": 0,\n    \"channel_updated_time\": 0,\n    \"total_weight\": \"7.000\",\n    \"one_off_shipment\": 0,\n    \"shipment_id\": null,\n    \"fulfilment_client_id\": null,\n    \"sync_informed\": 0,\n    \"total_inventory_count\": 2,\n    \"total_inventory_quantity\": 6,\n    \"stock_levels_adjusted\": 0,\n    \"custom_fields\": null,\n    \"pudo_id\": null,\n    \"ioss_number\": null,\n    \"ukims_number\": null,\n    \"vat_number\": null,\n    \"eori_number\": null,\n    \"tax_id\": null,\n    \"access_url\": null,\n    \"packer_id\": null,\n    \"packed_at\": 0,\n    \"calculated_shipping_service\": null,\n    \"calculated_shipping_service_run_count\": 0,\n    \"is_sent_accounting_invoice\": 0,\n    \"pregenerated_label\": 0,\n    \"has_ecommerce_return\": 0,\n    \"is_locked\": 0,\n    \"is_bopis\": 0,\n    \"is_easyship\": 0,\n    \"is_force_despatched\": 0,\n    \"is_force_locked\": 0,\n    \"is_dropship\": 0,\n    \"fulfilment_job_status\": 0,\n    \"is_new_order\": 0,\n    \"is_archived\": 0,\n    \"created_at\": \"2026-04-30 13:06:41\",\n    \"updated_at\": \"2026-04-30 13:07:58\",\n    \"webhook_run_id\": null,\n    \"batch_label\": 0,\n    \"is_mcf\": 0,\n    \"mcf_plugin_id\": null,\n    \"created_date\": \"2026-04-30\",\n    \"is_pos\": 0,\n    \"tracking_status_id\": null,\n    \"dtpp_run\": null,\n    \"dtpp_queue_status\": null,\n    \"dtpp_started_at\": null,\n    \"dtpp_queue_error\": null,\n    \"pick_completed_at\": null\n  },\n  \"allocations\": [\n    {\n      \"id\": 3456,\n      \"inventory_location_index_id\": 1,\n      \"order_summary_id\": 6312,\n      \"order_inventory_id\": 21151,\n      \"inventory_id\": 1,\n      \"location_id\": 1,\n      \"warehouse_id\": 6,\n      \"quantity\": 5,\n      \"created_at\": \"2026-04-30 13:08:17\",\n      \"updated_at\": \"2026-04-30 13:08:17\"\n    },\n    {\n      \"id\": 3457,\n      \"inventory_location_index_id\": 747,\n      \"order_summary_id\": 6312,\n      \"order_inventory_id\": 21153,\n      \"inventory_id\": 3,\n      \"location_id\": 32,\n      \"warehouse_id\": 6,\n      \"quantity\": 1,\n      \"created_at\": \"2026-04-30 13:08:17\",\n      \"updated_at\": \"2026-04-30 13:08:17\"\n    }\n  ]\n}"}],"_postman_id":"2336046f-078a-49d9-846d-03e8372b8cff"},{"name":"Allocate Multiple Orders","id":"67b50865-4a50-4ac7-873c-b064187cb13f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"warehouse_id\": 6,\n    \"order_search_filters\": {\n        \"order_status_id\": 3,\n        \"start_date\": \"2026-04-01 00:00:00\",\n        \"end_date\": \"2026-04-30 23:59:59\",\n        \"limit_results\": 100\n    },\n    \"allocation_success_status_id\": 3,\n    \"allocation_failed_status_id\": 2\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order_allocations/allocate","description":"<p>Bulk-allocates a batch of orders matched by filters. Operates either synchronously (direct allocation) or asynchronously by enqueuing the work — the <code>is_direct_allocation</code> flag in the response tells you which mode was used.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Nightly allocation runs.</li>\n<li>After a goods-in (PO delivery) — allocate any orders that were previously short-stock.</li>\n<li>Triggered allocation after channel sync.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+) with warehouse access.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>warehouse_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Warehouse to allocate from.</td>\n</tr>\n<tr>\n<td><code>order_search_filters</code></td>\n<td>object</td>\n<td>yes (at least one inner filter)</td>\n<td>Selects which orders are picked up by the batch.</td>\n</tr>\n<tr>\n<td><code>order_search_filters.order_status_id</code></td>\n<td>int or array</td>\n<td>no</td>\n<td>Order status ID(s). Excludes statuses that aren't allocation-eligible.</td>\n</tr>\n<tr>\n<td><code>order_search_filters.channel_order_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Match on external order ID.</td>\n</tr>\n<tr>\n<td><code>order_search_filters.channel_alt_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Match on alternate channel order ID.</td>\n</tr>\n<tr>\n<td><code>order_search_filters.shipping_method_requested</code></td>\n<td>string</td>\n<td>no</td>\n<td>Match on shipping service.</td>\n</tr>\n<tr>\n<td><code>order_search_filters.start_date</code> / <code>end_date</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>YYYY-MM-DD HH:MM:SS</code>. Filters by <code>date_received</code>.</td>\n</tr>\n<tr>\n<td><code>order_search_filters.limit_results</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>100</code>. Capped at <code>100</code>.</td>\n</tr>\n<tr>\n<td><code>allocation_success_status_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Status to apply on each successfully-allocated order.</td>\n</tr>\n<tr>\n<td><code>allocation_failed_status_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Status to apply on each unsuccessfully-allocated order.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Stock-control must be enabled.</li>\n<li>Must provide at least one filter.</li>\n<li>The user must have access to the warehouse.</li>\n<li>Skips orders that are deleted, BOPIS, locked, or dropship.</li>\n<li>Skips orders from archived fulfilment clients.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"success\",\n  \"result\": {\n    \"is_direct_allocation\": true|false,\n    \"reference\": \"&lt;batch ref&gt;\",\n    \"direct_allocation_result\": { ... }   // only if is_direct_allocation is true\n  }\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order_allocations","allocate"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"20a2e21c-145b-4864-8a72-107a36115f50","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"warehouse_id\": 6,\n    \"order_search_filters\": {\n        \"order_status_id\": 3,\n        \"start_date\": \"2026-04-01 00:00:00\",\n        \"end_date\": \"2026-04-30 23:59:59\",\n        \"limit_results\": 100\n    },\n    \"allocation_success_status_id\": 3,\n    \"allocation_failed_status_id\": 2\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order_allocations/allocate","description":"Bulk-allocates a batch of orders matched by filters. Operates either synchronously (direct allocation) or asynchronously by enqueuing the work — the `is_direct_allocation` flag in the response tells you which mode was used.\n\n### Use cases\n- Nightly allocation runs.\n- After a goods-in (PO delivery) — allocate any orders that were previously short-stock.\n- Triggered allocation after channel sync.\n\n### Permissions\nAny authenticated user (Supervisor+) with warehouse access.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `warehouse_id` | int | yes | Warehouse to allocate from. |\n| `order_search_filters` | object | yes (at least one inner filter) | Selects which orders are picked up by the batch. |\n| `order_search_filters.order_status_id` | int or array | no | Order status ID(s). Excludes statuses that aren't allocation-eligible. |\n| `order_search_filters.channel_order_id` | string | no | Match on external order ID. |\n| `order_search_filters.channel_alt_id` | string | no | Match on alternate channel order ID. |\n| `order_search_filters.shipping_method_requested` | string | no | Match on shipping service. |\n| `order_search_filters.start_date` / `end_date` | string | no | `YYYY-MM-DD HH:MM:SS`. Filters by `date_received`. |\n| `order_search_filters.limit_results` | int | no | Default `100`. Capped at `100`. |\n| `allocation_success_status_id` | int | no | Status to apply on each successfully-allocated order. |\n| `allocation_failed_status_id` | int | no | Status to apply on each unsuccessfully-allocated order. |\n\n### Constraints\n- Stock-control must be enabled.\n- Must provide at least one filter.\n- The user must have access to the warehouse.\n- Skips orders that are deleted, BOPIS, locked, or dropship.\n- Skips orders from archived fulfilment clients.\n\n### Response\n```\n{\n  \"status\": \"success\",\n  \"result\": {\n    \"is_direct_allocation\": true|false,\n    \"reference\": \"<batch ref>\",\n    \"direct_allocation_result\": { ... }   // only if is_direct_allocation is true\n  }\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"result\": {\n    \"reference\": \"ypTbReC9KA\",\n    \"total_orders\": 5,\n    \"already_in_queue\": 0,\n    \"added_to_queue\": 5,\n    \"is_direct_allocation\": true,\n    \"direct_allocation_result\": {\n      \"reference\": \"ypTbReC9KA\",\n      \"in_queue_total\": 5,\n      \"order_total\": 5,\n      \"allocation_succeed\": 2,\n      \"allocation_failed\": 3,\n      \"message\": \"Queue processed successfully.\"\n    }\n  }\n}"}],"_postman_id":"67b50865-4a50-4ac7-873c-b064187cb13f"},{"name":"Split Order","id":"fa39fe4a-f5b5-416e-8717-4cccfd7b97ae","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"splits\": [\n        {\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 2 }\n            ]\n        },\n        {\n            \"status_id\": 4,\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 1 },\n                { \"sku\": \"SKU-B\", \"quantity\": 5 }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//split","description":"<p>Splits an order into two or more orders. The order's inventory is distributed into \"chunks\": the first chunk stays on the original order (it gets flagged <code>is_split = 1</code>), every following chunk becomes a new order carrying the same customer/shipping data (<code>split_order_summary_id</code> points back to the original, a new <code>channel_order_id</code> is generated). An <code>order.created</code> webhook is queued for each newly created order.</p>\n<p>This is the API counterpart of the UI split screen (<code>/orders/split?id=X</code>).</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Splitting out lines that are in stock so they can despatch now, leaving back-ordered lines on a separate order.</li>\n<li>Moving part of an order to a different status (e.g. On Hold) while the rest continues through fulfilment.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users may only split their <strong>own</strong> orders, and only while the order is in <strong>Draft</strong> status.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>splits</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least <strong>2</strong> chunks. The first chunk stays on the original order.</td>\n</tr>\n<tr>\n<td><code>splits[].status_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Status the chunk should be moved to. If omitted, the tenant's <em>Split Order Status</em> setting is applied (when configured); otherwise the status is left unchanged. Note: a <code>status_id</code> given on one chunk stays in effect for the following chunks too (matches UI behaviour).</td>\n</tr>\n<tr>\n<td><code>splits[].items</code></td>\n<td>array</td>\n<td>yes</td>\n<td>Lines going into the chunk. At least 1 item.</td>\n</tr>\n<tr>\n<td><code>splits[].items[].order_inventory_id</code></td>\n<td>int</td>\n<td>yes*</td>\n<td>The order's inventory line id (<code>inventory[].id</code> in the <strong>Get Order Detail</strong> response). The <code>id</code> alias is also accepted.</td>\n</tr>\n<tr>\n<td><code>splits[].items[].sku</code></td>\n<td>string</td>\n<td>yes*</td>\n<td>Used to match a line when <code>order_inventory_id</code> is not given. Rejected with <code>422</code> if the SKU appears on more than one line of the order — use <code>order_inventory_id</code> instead.</td>\n</tr>\n<tr>\n<td><code>splits[].items[].quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Positive whole number.</td>\n</tr>\n</tbody>\n</table>\n</div><p>* One of <code>order_inventory_id</code> or <code>sku</code> is required per item.</p>\n<h3 id=\"quantity-conservation\">Quantity conservation</h3>\n<p><strong>Every inventory line of the order must be fully distributed across the chunks</strong> — per line, the quantities across all chunks must add up to the line's current quantity. Under- or over-distribution is rejected with <code>422</code>.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The order's status must allow splitting (a status flagged as splittable in your status settings, and not Despatched, Despatch Pending, Cancelled, Picking/Picked, Sorting/Sorted, Printed, Returned or Merged).</li>\n<li>Total inventory quantity must be greater than 1.</li>\n<li>The order must not be a merged order, a dropship order, or have a pick attached.</li>\n<li><code>splits[].status_id</code> must be a valid split target status (order-type, not deleted, not in the split-exclude list; for fulfilment clients also enabled for clients) — otherwise <code>422</code>.</li>\n</ul>\n<h3 id=\"side-effects\">Side effects</h3>\n<ul>\n<li>Stock allocations are released before the split; location stock is recalculated for every order involved afterwards.</li>\n<li><code>total_tax</code> is reset and <code>auto_calculate_tax = 1</code> is set (tax is recalculated); <code>order_discount</code> is divided evenly across the chunks.</li>\n<li>New orders are created with <code>shipment_id = NULL</code>, <code>shipping_paid = 0</code>, <code>pregenerated_label = 0</code>, <code>batch_label = 0</code>; the original order's shipment is left untouched.</li>\n<li>Not idempotent: an already-split order can be split again.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"success\",\n  \"message\": \"Order has been split into N orders.\",\n  \"original_order_id\": 12345,\n  \"orders\": [ { \"id\", \"channel_order_id\", \"status_id\", \"status\", \"is_original\", \"split_order_summary_id\", \"inventory\": [...] } ]\n}\n</code></pre><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP</th>\n<th>Case</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Order missing / deleted</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Fulfilment client tried to split another client's order</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Status not eligible, order has a pick, fewer than 2 chunks, unknown line, invalid quantity, quantity conservation violated, or invalid target <code>status_id</code></td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td>Unexpected error during the split (the original order is reverted)</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order","","split"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"30d90ab4-3aa9-44ad-8cf8-0659a38833fc","name":"200 — split into 2 orders","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"splits\": [\n        {\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 2 }\n            ]\n        },\n        {\n            \"status_id\": 4,\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 1 },\n                { \"sku\": \"SKU-B\", \"quantity\": 5 }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//split","description":"Splits an order into two or more orders. The order's inventory is distributed into \"chunks\": the first chunk stays on the original order (it gets flagged `is_split = 1`), every following chunk becomes a new order carrying the same customer/shipping data (`split_order_summary_id` points back to the original, a new `channel_order_id` is generated). An `order.created` webhook is queued for each newly created order.\n\nThis is the API counterpart of the UI split screen (`/orders/split?id=X`).\n\n### Use cases\n- Splitting out lines that are in stock so they can despatch now, leaving back-ordered lines on a separate order.\n- Moving part of an order to a different status (e.g. On Hold) while the rest continues through fulfilment.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users may only split their **own** orders, and only while the order is in **Draft** status.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `splits` | array | yes | At least **2** chunks. The first chunk stays on the original order. |\n| `splits[].status_id` | int | no | Status the chunk should be moved to. If omitted, the tenant's *Split Order Status* setting is applied (when configured); otherwise the status is left unchanged. Note: a `status_id` given on one chunk stays in effect for the following chunks too (matches UI behaviour). |\n| `splits[].items` | array | yes | Lines going into the chunk. At least 1 item. |\n| `splits[].items[].order_inventory_id` | int | yes* | The order's inventory line id (`inventory[].id` in the **Get Order Detail** response). The `id` alias is also accepted. |\n| `splits[].items[].sku` | string | yes* | Used to match a line when `order_inventory_id` is not given. Rejected with `422` if the SKU appears on more than one line of the order — use `order_inventory_id` instead. |\n| `splits[].items[].quantity` | int | yes | Positive whole number. |\n\n\\* One of `order_inventory_id` or `sku` is required per item.\n\n### Quantity conservation\n**Every inventory line of the order must be fully distributed across the chunks** — per line, the quantities across all chunks must add up to the line's current quantity. Under- or over-distribution is rejected with `422`.\n\n### Constraints\n- The order's status must allow splitting (a status flagged as splittable in your status settings, and not Despatched, Despatch Pending, Cancelled, Picking/Picked, Sorting/Sorted, Printed, Returned or Merged).\n- Total inventory quantity must be greater than 1.\n- The order must not be a merged order, a dropship order, or have a pick attached.\n- `splits[].status_id` must be a valid split target status (order-type, not deleted, not in the split-exclude list; for fulfilment clients also enabled for clients) — otherwise `422`.\n\n### Side effects\n- Stock allocations are released before the split; location stock is recalculated for every order involved afterwards.\n- `total_tax` is reset and `auto_calculate_tax = 1` is set (tax is recalculated); `order_discount` is divided evenly across the chunks.\n- New orders are created with `shipment_id = NULL`, `shipping_paid = 0`, `pregenerated_label = 0`, `batch_label = 0`; the original order's shipment is left untouched.\n- Not idempotent: an already-split order can be split again.\n\n### Response\n```\n{\n  \"status\": \"success\",\n  \"message\": \"Order has been split into N orders.\",\n  \"original_order_id\": 12345,\n  \"orders\": [ { \"id\", \"channel_order_id\", \"status_id\", \"status\", \"is_original\", \"split_order_summary_id\", \"inventory\": [...] } ]\n}\n```\n\n### Errors\n| HTTP | Case |\n| --- | --- |\n| `404` | Order missing / deleted |\n| `401` | Fulfilment client tried to split another client's order |\n| `422` | Status not eligible, order has a pick, fewer than 2 chunks, unknown line, invalid quantity, quantity conservation violated, or invalid target `status_id` |\n| `500` | Unexpected error during the split (the original order is reverted) |\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"message\": \"Order has been split into 2 orders.\",\n  \"original_order_id\": 12345,\n  \"orders\": [\n    {\n      \"id\": 12345,\n      \"channel_order_id\": \"DC123456789\",\n      \"status_id\": 1,\n      \"status\": \"Despatch Ready\",\n      \"is_original\": true,\n      \"split_order_summary_id\": null,\n      \"inventory\": [\n        { \"id\": 9001, \"inventory_id\": 55, \"sku\": \"SKU-A\", \"name\": \"Widget A\", \"quantity\": 2 }\n      ]\n    },\n    {\n      \"id\": 12399,\n      \"channel_order_id\": \"DC123456790\",\n      \"status_id\": 4,\n      \"status\": \"On Hold\",\n      \"is_original\": false,\n      \"split_order_summary_id\": 12345,\n      \"inventory\": [\n        { \"id\": 9101, \"inventory_id\": 55, \"sku\": \"SKU-A\", \"name\": \"Widget A\", \"quantity\": 1 },\n        { \"id\": 9102, \"inventory_id\": 56, \"sku\": \"SKU-B\", \"name\": \"Widget B\", \"quantity\": 5 }\n      ]\n    }\n  ]\n}"},{"id":"441aa204-d927-4aba-b24e-fcdefc5074ac","name":"422 — quantity not fully distributed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"splits\": [\n        {\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 2 }\n            ]\n        },\n        {\n            \"status_id\": 4,\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 1 },\n                { \"sku\": \"SKU-B\", \"quantity\": 5 }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//split","description":"Splits an order into two or more orders. The order's inventory is distributed into \"chunks\": the first chunk stays on the original order (it gets flagged `is_split = 1`), every following chunk becomes a new order carrying the same customer/shipping data (`split_order_summary_id` points back to the original, a new `channel_order_id` is generated). An `order.created` webhook is queued for each newly created order.\n\nThis is the API counterpart of the UI split screen (`/orders/split?id=X`).\n\n### Use cases\n- Splitting out lines that are in stock so they can despatch now, leaving back-ordered lines on a separate order.\n- Moving part of an order to a different status (e.g. On Hold) while the rest continues through fulfilment.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users may only split their **own** orders, and only while the order is in **Draft** status.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `splits` | array | yes | At least **2** chunks. The first chunk stays on the original order. |\n| `splits[].status_id` | int | no | Status the chunk should be moved to. If omitted, the tenant's *Split Order Status* setting is applied (when configured); otherwise the status is left unchanged. Note: a `status_id` given on one chunk stays in effect for the following chunks too (matches UI behaviour). |\n| `splits[].items` | array | yes | Lines going into the chunk. At least 1 item. |\n| `splits[].items[].order_inventory_id` | int | yes* | The order's inventory line id (`inventory[].id` in the **Get Order Detail** response). The `id` alias is also accepted. |\n| `splits[].items[].sku` | string | yes* | Used to match a line when `order_inventory_id` is not given. Rejected with `422` if the SKU appears on more than one line of the order — use `order_inventory_id` instead. |\n| `splits[].items[].quantity` | int | yes | Positive whole number. |\n\n\\* One of `order_inventory_id` or `sku` is required per item.\n\n### Quantity conservation\n**Every inventory line of the order must be fully distributed across the chunks** — per line, the quantities across all chunks must add up to the line's current quantity. Under- or over-distribution is rejected with `422`.\n\n### Constraints\n- The order's status must allow splitting (a status flagged as splittable in your status settings, and not Despatched, Despatch Pending, Cancelled, Picking/Picked, Sorting/Sorted, Printed, Returned or Merged).\n- Total inventory quantity must be greater than 1.\n- The order must not be a merged order, a dropship order, or have a pick attached.\n- `splits[].status_id` must be a valid split target status (order-type, not deleted, not in the split-exclude list; for fulfilment clients also enabled for clients) — otherwise `422`.\n\n### Side effects\n- Stock allocations are released before the split; location stock is recalculated for every order involved afterwards.\n- `total_tax` is reset and `auto_calculate_tax = 1` is set (tax is recalculated); `order_discount` is divided evenly across the chunks.\n- New orders are created with `shipment_id = NULL`, `shipping_paid = 0`, `pregenerated_label = 0`, `batch_label = 0`; the original order's shipment is left untouched.\n- Not idempotent: an already-split order can be split again.\n\n### Response\n```\n{\n  \"status\": \"success\",\n  \"message\": \"Order has been split into N orders.\",\n  \"original_order_id\": 12345,\n  \"orders\": [ { \"id\", \"channel_order_id\", \"status_id\", \"status\", \"is_original\", \"split_order_summary_id\", \"inventory\": [...] } ]\n}\n```\n\n### Errors\n| HTTP | Case |\n| --- | --- |\n| `404` | Order missing / deleted |\n| `401` | Fulfilment client tried to split another client's order |\n| `422` | Status not eligible, order has a pick, fewer than 2 chunks, unknown line, invalid quantity, quantity conservation violated, or invalid target `status_id` |\n| `500` | Unexpected error during the split (the original order is reverted) |\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"Inventory line 9001 (SKU 'SKU-A') has quantity 3 but the split chunks total 2. All order inventory must be fully distributed across the chunks.\"\n}"},{"id":"38843c83-6005-49b3-b616-f1f476626b1b","name":"422 — status not splittable","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"splits\": [\n        {\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 2 }\n            ]\n        },\n        {\n            \"status_id\": 4,\n            \"items\": [\n                { \"order_inventory_id\": 9001, \"quantity\": 1 },\n                { \"sku\": \"SKU-B\", \"quantity\": 5 }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/order//split","description":"Splits an order into two or more orders. The order's inventory is distributed into \"chunks\": the first chunk stays on the original order (it gets flagged `is_split = 1`), every following chunk becomes a new order carrying the same customer/shipping data (`split_order_summary_id` points back to the original, a new `channel_order_id` is generated). An `order.created` webhook is queued for each newly created order.\n\nThis is the API counterpart of the UI split screen (`/orders/split?id=X`).\n\n### Use cases\n- Splitting out lines that are in stock so they can despatch now, leaving back-ordered lines on a separate order.\n- Moving part of an order to a different status (e.g. On Hold) while the rest continues through fulfilment.\n\n### Permissions\nAny authenticated user (Supervisor+). Fulfilment-client users may only split their **own** orders, and only while the order is in **Draft** status.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `splits` | array | yes | At least **2** chunks. The first chunk stays on the original order. |\n| `splits[].status_id` | int | no | Status the chunk should be moved to. If omitted, the tenant's *Split Order Status* setting is applied (when configured); otherwise the status is left unchanged. Note: a `status_id` given on one chunk stays in effect for the following chunks too (matches UI behaviour). |\n| `splits[].items` | array | yes | Lines going into the chunk. At least 1 item. |\n| `splits[].items[].order_inventory_id` | int | yes* | The order's inventory line id (`inventory[].id` in the **Get Order Detail** response). The `id` alias is also accepted. |\n| `splits[].items[].sku` | string | yes* | Used to match a line when `order_inventory_id` is not given. Rejected with `422` if the SKU appears on more than one line of the order — use `order_inventory_id` instead. |\n| `splits[].items[].quantity` | int | yes | Positive whole number. |\n\n\\* One of `order_inventory_id` or `sku` is required per item.\n\n### Quantity conservation\n**Every inventory line of the order must be fully distributed across the chunks** — per line, the quantities across all chunks must add up to the line's current quantity. Under- or over-distribution is rejected with `422`.\n\n### Constraints\n- The order's status must allow splitting (a status flagged as splittable in your status settings, and not Despatched, Despatch Pending, Cancelled, Picking/Picked, Sorting/Sorted, Printed, Returned or Merged).\n- Total inventory quantity must be greater than 1.\n- The order must not be a merged order, a dropship order, or have a pick attached.\n- `splits[].status_id` must be a valid split target status (order-type, not deleted, not in the split-exclude list; for fulfilment clients also enabled for clients) — otherwise `422`.\n\n### Side effects\n- Stock allocations are released before the split; location stock is recalculated for every order involved afterwards.\n- `total_tax` is reset and `auto_calculate_tax = 1` is set (tax is recalculated); `order_discount` is divided evenly across the chunks.\n- New orders are created with `shipment_id = NULL`, `shipping_paid = 0`, `pregenerated_label = 0`, `batch_label = 0`; the original order's shipment is left untouched.\n- Not idempotent: an already-split order can be split again.\n\n### Response\n```\n{\n  \"status\": \"success\",\n  \"message\": \"Order has been split into N orders.\",\n  \"original_order_id\": 12345,\n  \"orders\": [ { \"id\", \"channel_order_id\", \"status_id\", \"status\", \"is_original\", \"split_order_summary_id\", \"inventory\": [...] } ]\n}\n```\n\n### Errors\n| HTTP | Case |\n| --- | --- |\n| `404` | Order missing / deleted |\n| `401` | Fulfilment client tried to split another client's order |\n| `422` | Status not eligible, order has a pick, fewer than 2 chunks, unknown line, invalid quantity, quantity conservation violated, or invalid target `status_id` |\n| `500` | Unexpected error during the split (the original order is reverted) |\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"This order cannot be split because of its status.\"\n}"}],"_postman_id":"fa39fe4a-f5b5-416e-8717-4cccfd7b97ae"}],"id":"0b923012-9ff0-4f0f-8bb6-aca8b75ac9d4","description":"<p>Endpoints for managing orders — listing, retrieving detail, creating manual orders (with or without inventory or shipment labels), updating, cancelling, allocating, and managing line items.</p>\n<h3 id=\"order-status-reference-used-by-status_id-field-and-filtersstatus\">Order status reference (used by <code>status_id</code> field and <code>filters[status]</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Draft</td>\n</tr>\n<tr>\n<td>2</td>\n<td>On Hold</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Despatch Ready</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Picking</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Despatched</td>\n</tr>\n<tr>\n<td>6</td>\n<td>Cancelled</td>\n</tr>\n<tr>\n<td>7</td>\n<td>API Fetch Error</td>\n</tr>\n<tr>\n<td>8</td>\n<td>Packing</td>\n</tr>\n<tr>\n<td>9</td>\n<td>Returned</td>\n</tr>\n<tr>\n<td>10</td>\n<td>Picked</td>\n</tr>\n<tr>\n<td>17</td>\n<td>Partially Returned</td>\n</tr>\n<tr>\n<td>26</td>\n<td>Importing</td>\n</tr>\n<tr>\n<td>81</td>\n<td>Partially Shipped</td>\n</tr>\n<tr>\n<td>82</td>\n<td>Printed</td>\n</tr>\n<tr>\n<td>2700</td>\n<td>Despatch Pending</td>\n</tr>\n<tr>\n<td>2710</td>\n<td>Sorting</td>\n</tr>\n<tr>\n<td>2711</td>\n<td>Sorted</td>\n</tr>\n<tr>\n<td>2800</td>\n<td>New Order</td>\n</tr>\n<tr>\n<td>2801</td>\n<td>Back Order</td>\n</tr>\n<tr>\n<td>2900</td>\n<td>Amazon Collect in Store</td>\n</tr>\n<tr>\n<td>2901</td>\n<td>Ready for Collection</td>\n</tr>\n<tr>\n<td>2990</td>\n<td>Partially Picked</td>\n</tr>\n<tr>\n<td>3000</td>\n<td>Merged Order</td>\n</tr>\n</tbody>\n</table>\n</div><p>Custom statuses created by your tenant will appear with their own IDs above 80; query the <code>Settings → Get Setting Parameters</code> endpoint with no specific key support, or read them from your dashboard.</p>\n<h3 id=\"order-types-used-by-filterstype\">Order types (used by <code>filters[type]</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>SIG</code></td>\n<td>Single Item, Single Quantity (1 unique SKU, total qty = 1)</td>\n</tr>\n<tr>\n<td><code>SIM</code></td>\n<td>Single Item, Multi quantity (1 unique SKU, total qty &gt; 1)</td>\n</tr>\n<tr>\n<td><code>MIM</code></td>\n<td>Multi Item, Multi quantity (more than 1 unique SKU)</td>\n</tr>\n<tr>\n<td><code>ZIO</code></td>\n<td>Zero-Item Order</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"0b923012-9ff0-4f0f-8bb6-aca8b75ac9d4","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Order Tags","item":[{"name":"List Order Tags","id":"5a216339-0b3d-4d1f-91fa-754d2d459707","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags?page=1","description":"<p>Returns a paginated list of distinct tag names with how many (non-deleted) orders carry each one.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Powering an autocomplete on a tag-search input.</li>\n<li>Auditing how many orders sit behind each tag.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users only see tags from their own orders.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by tenant <em>Items per page</em> setting.</p>\n<h3 id=\"filters-and-sorting\">Filters and sorting</h3>\n<ul>\n<li><code>filters[search]</code> - partial match on the tag; use <code>|</code> to OR several terms.</li>\n<li><code>sort</code> = <code>name_az</code> / <code>name_za</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>List envelope; each <code>data[]</code> item is <code>{ tag, order_count }</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order_tags"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code>. Default: tag A→Z.</p>\n","type":"text/plain"},"key":"sort","value":"name_az"},{"disabled":true,"description":{"content":"<p>LIKE-search on tag name. Single pipe <code>|</code> between terms ORs them.</p>\n","type":"text/plain"},"key":"filters[search]","value":"PREGEN"}],"variable":[]}},"response":[{"id":"9ac37490-7af3-4b7b-bd0a-fd7fb6b7d6e8","name":"200 — page of tags","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": \"32\",\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"next_page_url\": null,\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": [\n        { \"tag\": \"API\", \"order_count\": \"10\" },\n        { \"tag\": \"Direct To Print Plugin\", \"order_count\": \"539\" },\n        { \"tag\": \"PREGEN-100262\", \"order_count\": \"48\" },\n        { \"tag\": \"VIP\", \"order_count\": \"3\" }\n    ]\n}"}],"_postman_id":"5a216339-0b3d-4d1f-91fa-754d2d459707"},{"name":"Get Order Tag Detail","id":"e2b19ff9-2cad-46b9-945a-0de470f6e4ee","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags/","description":"<p>Returns the order count for a specific tag plus its <code>data</code> payload (rarely populated; reserved for plugin metadata).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — the tag <em>name</em> (URL-encoded if it contains special characters), not a numeric ID.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"id\":          &lt;integer of the first matching tag row&gt;,\n  \"tag\":         \"&lt;tag name&gt;\",\n  \"data\":        {} | { ... },\n  \"order_count\": &lt;integer&gt;\n}\n</code></pre><p>Returns <code>404</code> if no order carries that tag.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order_tags",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"ef554e1e-2294-4ba4-9a0b-9432132b1e26","name":"200 — tag found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags/PREGEN-100262"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 8850,\n    \"tag\": \"PREGEN-100262\",\n    \"data\": {},\n    \"order_count\": 48\n}"},{"id":"e2a533ef-6e8f-4468-a7b8-8f571d169f12","name":"404 — tag not found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Order Tag Not Found\"\n}"}],"_postman_id":"e2b19ff9-2cad-46b9-945a-0de470f6e4ee"},{"name":"Attach Tag to Order","id":"22c7f300-f7a7-4840-851f-f9cb837dbb1e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags//attach/","description":"<p>Creates a tag attachment between an order and a tag name. If the tag did not exist before this call, it implicitly comes into existence (tags are derived from attachments).</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code></code> — the tag name to attach (URL-encode if needed).</li>\n<li><code></code> — the order to attach it to.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The tag must contain at least 3 alphanumeric characters (after stripping non-alphanumerics). Otherwise <code>422</code>.</li>\n<li>Fulfilment-client users can only tag their own orders.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The newly created tag record.</p>\n<h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>422</code> — tag too short.</li>\n<li><code>404</code> — order not found.</li>\n<li><code>401</code> — fulfilment-client user attempting to tag another client's order.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order_tags","","attach",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"72f72588-7955-44ac-bcc8-a7014cea7e58","name":"200 — attached","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags/api_test_tag/attach/6311"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 10456,\n    \"order_summary_id\": 6311,\n    \"tag\": \"api_test_tag\",\n    \"from_channels\": 0,\n    \"data\": {},\n    \"created_at\": \"2026-04-30 11:50:55\",\n    \"updated_at\": \"2026-04-30 11:50:55\"\n}"},{"id":"a686e791-219b-484b-bf03-30d6a2eab5ff","name":"422 — tag too short","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags/ab/attach/6311"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"Tag must have at least 3 characters\"\n}"}],"_postman_id":"22c7f300-f7a7-4840-851f-f9cb837dbb1e"},{"name":"Detach Tag from Order","id":"23ff4e69-6ff6-4019-b16e-4df9adffc39e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags//detach/","description":"<p>Removes a single tag from a single order. The tag itself remains on other orders that still carry it.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code></code> — the tag name to detach.</li>\n<li><code></code> — the order to detach it from.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The deleted attachment record.</p>\n<h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>404</code> — order not found, or the tag wasn't attached to that order.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order_tags","","detach",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"01736b31-18e2-4d67-9214-6a53b0e98bd9","name":"Success","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags//detach/","description":"Removes a single tag from a single order. The tag itself remains on other orders that still carry it.\n\n### Path parameters\n- `` — the tag name to detach.\n- `` — the order to detach it from.\n\n### Response\nThe deleted attachment record.\n\n### Errors\n- `404` — order not found, or the tag wasn't attached to that order.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 10458,\n  \"order_summary_id\": 6312,\n  \"tag\": \"POSTMAN-TEST-TAG\",\n  \"from_channels\": 0,\n  \"data\": null,\n  \"created_at\": \"2026-04-30 13:08:04\",\n  \"updated_at\": \"2026-04-30 13:08:04\"\n}"}],"_postman_id":"23ff4e69-6ff6-4019-b16e-4df9adffc39e"},{"name":"Delete Tag (Everywhere)","id":"0865335b-9585-473e-bce4-fd6cbc0e0b84","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags//delete","description":"<p>Deletes a tag from <strong>every</strong> non-deleted order it's attached to. The tag effectively ceases to exist after this call returns.</p>\n<p>Use with care — this is a global operation.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — the tag name to delete.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"tag\": \"&lt;tag name&gt;\" }\n</code></pre><p>Returns <code>404</code> if no order currently carries the tag.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["order_tags","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"7d6338df-0679-4a7d-a9c8-d66089e76f1c","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/order_tags//delete","description":"Deletes a tag from **every** non-deleted order it's attached to. The tag effectively ceases to exist after this call returns.\n\nUse with care — this is a global operation.\n\n### Path parameter\n- `` — the tag name to delete.\n\n### Response\n```\n{ \"tag\": \"<tag name>\" }\n```\n\nReturns `404` if no order currently carries the tag.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"tag\": \"POSTMAN-DELETE-TAG\"\n}"}],"_postman_id":"0865335b-9585-473e-bce4-fd6cbc0e0b84"}],"id":"89d59f3f-628b-4787-8906-cac77f09de74","description":"<p>Read, attach, detach, and delete order tags. Tags are free-text labels grouped by <code>tag</code> value across all orders — there is no separate \"tag definition\" table; a tag exists if at least one order has it.</p>\n<p>Examples of tags created automatically by other parts of the system:</p>\n<ul>\n<li><code>API</code> — added to every order created via the public API.</li>\n<li><code>API - PREGEN</code> — added to API orders created with a pre-generated shipping label.</li>\n<li><code>Direct To Print Plugin</code>, <code>PLUGIN - PREGEN</code> — added by various plugins.</li>\n<li><code>BAT-&lt;timestamp&gt;</code> — batch-creation markers.</li>\n</ul>\n<p>Tag names must be at least 3 alphanumeric characters when attached.</p>\n","_postman_id":"89d59f3f-628b-4787-8906-cac77f09de74","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Statuses","item":[{"name":"List Statuses","id":"e9be0b1f-0bd2-4a5d-a54b-9ce31057f128","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/statuses?page=1&per_page=20","description":"<p>Returns the account's statuses, so an integration can turn the <code>status_id</code> on an order, purchase order or delivery into a name, and check what can be done with an order in a given status before trying it. Deleted statuses are never returned.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users get a reduced view, see below.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting). Results are ordered by type, then the status's sort order, then ID.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[type]</code></td>\n<td>string</td>\n<td><code>order</code> (default when omitted), <code>purchase_order</code>, <code>delivery</code> or <code>all</code>.</td>\n</tr>\n<tr>\n<td><code>filters[ids]</code></td>\n<td>string or array</td>\n<td>Only these status IDs: <code>1,2,3</code> or <code>filters[ids][]=1&amp;filters[ids][]=2</code>.</td>\n</tr>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on the status name (and on the fulfilment-client name).</td>\n</tr>\n<tr>\n<td><code>filters[dashboard]</code></td>\n<td><code>0</code>/<code>1</code></td>\n<td>Shown on the dashboard. For fulfilment-client users, on their dashboard.</td>\n</tr>\n<tr>\n<td><code>filters[hidden]</code></td>\n<td><code>0</code>/<code>1</code></td>\n<td>Hidden statuses. Ignored for fulfilment-client users.</td>\n</tr>\n<tr>\n<td><code>filters[side_menu]</code></td>\n<td><code>0</code>/<code>1</code></td>\n<td>Shown in the side menu. Ignored for fulfilment-client users.</td>\n</tr>\n<tr>\n<td><code>filters[visible_to_clients]</code></td>\n<td><code>0</code>/<code>1</code></td>\n<td>Shown to fulfilment clients. Only when fulfilment is enabled; ignored for fulfilment-client users.</td>\n</tr>\n</tbody>\n</table>\n</div><p>An unknown <code>type</code>, a non-numeric ID or a flag other than <code>0</code>/<code>1</code> returns <code>422</code> listing every problem found.</p>\n<h3 id=\"response-fields-account-users\">Response fields (account users)</h3>\n<ul>\n<li><code>id</code>, <code>type</code> (<code>order</code> / <code>purchase_order</code> / <code>delivery</code>), <code>status_type_id</code> (<code>1</code> / <code>2</code> / <code>3</code>), <code>name</code>, <code>icon</code>, <code>colour</code>, <code>text_colour</code>, <code>sort</code>.</li>\n<li><code>dashboard</code>, <code>side_menu</code>, <code>hidden</code>, <code>is_readonly</code> (a built-in status that cannot be renamed or deleted).</li>\n<li>Order statuses only: <code>is_cancellable</code>, <code>enable_split</code>, <code>allow_despatch</code>, <code>enable_pick_creation</code>, <code>enable_print_creation</code>.</li>\n<li>When fulfilment is enabled, <code>fulfilment</code>: how fulfilment clients see the status (<code>visible_to_clients</code>, <code>name</code>, <code>icon</code>, <code>colour</code>, <code>text_colour</code>, <code>dashboard</code>) and, for order statuses, <code>permissions</code> (below).</li>\n</ul>\n<h3 id=\"fulfilment-client-users\">Fulfilment-client users</h3>\n<p>Only order statuses that are shown to fulfilment clients, not hidden, and that at least one of the client's own orders is currently in are returned, together with every purchase-order and delivery status shown to clients. Each status comes under its fulfilment-client name, icon and colours, and <code>search</code> only matches that name. The account's own settings are not included.</p>\n<p>Order statuses carry <code>permissions</code>: what the client may do with an order in that status.</p>\n<ul>\n<li><code>can_edit</code>, <code>can_cancel</code>, <code>can_add_products</code>, <code>can_remove_products</code> - booleans.</li>\n<li><code>allowed_next_status_ids</code> - statuses the client may move such an order to with <strong>Update Order</strong>. Empty when the client may not change the status.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["statuses"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Records per page. Default is the tenant's <em>Items per page</em> setting.</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p><code>order</code> (default), <code>purchase_order</code>, <code>delivery</code> or <code>all</code>.</p>\n","type":"text/plain"},"key":"filters[type]","value":"order"},{"disabled":true,"description":{"content":"<p>Comma-separated status IDs, or send <code>filters[ids][]</code> several times.</p>\n","type":"text/plain"},"key":"filters[ids]","value":"1,2,3"},{"disabled":true,"description":{"content":"<p>Partial match on the status name.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p><code>1</code> or <code>0</code>: shown on the dashboard.</p>\n","type":"text/plain"},"key":"filters[dashboard]","value":"1"},{"disabled":true,"description":{"content":"<p><code>1</code> or <code>0</code>. Ignored for fulfilment-client users.</p>\n","type":"text/plain"},"key":"filters[hidden]","value":"0"},{"disabled":true,"description":{"content":"<p><code>1</code> or <code>0</code>. Ignored for fulfilment-client users.</p>\n","type":"text/plain"},"key":"filters[side_menu]","value":"1"},{"disabled":true,"description":{"content":"<p><code>1</code> or <code>0</code>. Only when fulfilment is enabled; ignored for fulfilment-client users.</p>\n","type":"text/plain"},"key":"filters[visible_to_clients]","value":"1"}],"variable":[]}},"response":[{"id":"c09b13d7-a8d9-42eb-a9bb-baa81efe7287","name":"200 - order statuses","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/statuses?page=1&per_page=20","host":["https://your-company.myhelm.app/public-api"],"path":["statuses"],"query":[{"key":"page","value":"1","description":"1-based page number. Default 1."},{"key":"per_page","value":"20","description":"Records per page. Default is the tenant's *Items per page* setting."},{"key":"filters[type]","value":"order","description":"`order` (default), `purchase_order`, `delivery` or `all`.","disabled":true},{"key":"filters[ids]","value":"1,2,3","description":"Comma-separated status IDs, or send `filters[ids][]` several times.","disabled":true},{"key":"filters[search]","value":"","description":"Partial match on the status name.","disabled":true},{"key":"filters[dashboard]","value":"1","description":"`1` or `0`: shown on the dashboard.","disabled":true},{"key":"filters[hidden]","value":"0","description":"`1` or `0`. Ignored for fulfilment-client users.","disabled":true},{"key":"filters[side_menu]","value":"1","description":"`1` or `0`. Ignored for fulfilment-client users.","disabled":true},{"key":"filters[visible_to_clients]","value":"1","description":"`1` or `0`. Only when fulfilment is enabled; ignored for fulfilment-client users.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 39,\n  \"per_page\": 2,\n  \"current_page\": 1,\n  \"last_page\": 20,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/statuses?&per_page=2&page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 2,\n  \"data\": [\n    {\n      \"id\": 80,\n      \"type\": \"order\",\n      \"status_type_id\": 1,\n      \"name\": \"Sellerfulfilled Amazon Prime\",\n      \"icon\": \"fa-amazon\",\n      \"colour\": null,\n      \"text_colour\": \"white\",\n      \"sort\": 0,\n      \"dashboard\": false,\n      \"side_menu\": false,\n      \"hidden\": true,\n      \"is_readonly\": true,\n      \"is_cancellable\": false,\n      \"enable_split\": false,\n      \"allow_despatch\": true,\n      \"enable_pick_creation\": false,\n      \"enable_print_creation\": false,\n      \"fulfilment\": {\n        \"visible_to_clients\": false,\n        \"name\": \"Sellerfulfilled Amazon Prime\",\n        \"icon\": null,\n        \"colour\": null,\n        \"text_colour\": \"white\",\n        \"dashboard\": false,\n        \"permissions\": {\n          \"can_edit\": true,\n          \"can_cancel\": false,\n          \"can_add_products\": false,\n          \"can_remove_products\": false,\n          \"allowed_next_status_ids\": []\n        }\n      }\n    },\n    {\n      \"id\": 2800,\n      \"type\": \"order\",\n      \"status_type_id\": 1,\n      \"name\": \"New Order\",\n      \"icon\": \"fa fa-plus\",\n      \"colour\": \"#33ccff\",\n      \"text_colour\": \"white\",\n      \"sort\": 0,\n      \"dashboard\": false,\n      \"side_menu\": false,\n      \"hidden\": false,\n      \"is_readonly\": true,\n      \"is_cancellable\": false,\n      \"enable_split\": false,\n      \"allow_despatch\": false,\n      \"enable_pick_creation\": false,\n      \"enable_print_creation\": false,\n      \"fulfilment\": {\n        \"visible_to_clients\": false,\n        \"name\": \"New Order\",\n        \"icon\": \"fa fa-plus\",\n        \"colour\": \"#33ccff\",\n        \"text_colour\": \"white\",\n        \"dashboard\": false,\n        \"permissions\": {\n          \"can_edit\": false,\n          \"can_cancel\": false,\n          \"can_add_products\": false,\n          \"can_remove_products\": false,\n          \"allowed_next_status_ids\": []\n        }\n      }\n    }\n  ]\n}"},{"id":"ff3b0c40-e43a-4adb-97ed-11801a99beeb","name":"200 - fulfilment-client user","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/statuses?page=1&per_page=20","host":["https://your-company.myhelm.app/public-api"],"path":["statuses"],"query":[{"key":"page","value":"1","description":"1-based page number. Default 1."},{"key":"per_page","value":"20","description":"Records per page. Default is the tenant's *Items per page* setting."},{"key":"filters[type]","value":"order","description":"`order` (default), `purchase_order`, `delivery` or `all`.","disabled":true},{"key":"filters[ids]","value":"1,2,3","description":"Comma-separated status IDs, or send `filters[ids][]` several times.","disabled":true},{"key":"filters[search]","value":"","description":"Partial match on the status name.","disabled":true},{"key":"filters[dashboard]","value":"1","description":"`1` or `0`: shown on the dashboard.","disabled":true},{"key":"filters[hidden]","value":"0","description":"`1` or `0`. Ignored for fulfilment-client users.","disabled":true},{"key":"filters[side_menu]","value":"1","description":"`1` or `0`. Ignored for fulfilment-client users.","disabled":true},{"key":"filters[visible_to_clients]","value":"1","description":"`1` or `0`. Only when fulfilment is enabled; ignored for fulfilment-client users.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 4,\n  \"per_page\": 2,\n  \"current_page\": 1,\n  \"last_page\": 2,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/statuses?&per_page=2&page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 2,\n  \"data\": [\n    {\n      \"id\": 3005,\n      \"type\": \"order\",\n      \"status_type_id\": 1,\n      \"name\": \"DTP Collection\",\n      \"icon\": null,\n      \"colour\": null,\n      \"text_colour\": \"white\",\n      \"sort\": 0,\n      \"dashboard\": false,\n      \"hidden\": false,\n      \"permissions\": {\n        \"can_edit\": true,\n        \"can_cancel\": false,\n        \"can_add_products\": false,\n        \"can_remove_products\": false,\n        \"allowed_next_status_ids\": []\n      }\n    },\n    {\n      \"id\": 3011,\n      \"type\": \"order\",\n      \"status_type_id\": 1,\n      \"name\": \"PreOrder\",\n      \"icon\": null,\n      \"colour\": null,\n      \"text_colour\": \"white\",\n      \"sort\": 0,\n      \"dashboard\": true,\n      \"hidden\": false,\n      \"permissions\": {\n        \"can_edit\": true,\n        \"can_cancel\": true,\n        \"can_add_products\": true,\n        \"can_remove_products\": true,\n        \"allowed_next_status_ids\": [\n          3,\n          6\n        ]\n      }\n    }\n  ]\n}"},{"id":"fdcf0840-c43d-47bb-baec-73003c1169e0","name":"422 - unknown type","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/statuses?filters[type]=orders","host":["https://your-company.myhelm.app/public-api"],"path":["statuses"],"query":[{"key":"filters[type]","value":"orders"}]}},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": [\n    \"Field filters.type must be one of: order, purchase_order, delivery, all.\"\n  ]\n}"}],"_postman_id":"e9be0b1f-0bd2-4a5d-a54b-9ce31057f128"}],"id":"fb730bad-17db-4b69-912e-c22be8c300ff","description":"<p>Order, purchase-order and delivery statuses of the account. Use <strong>List Statuses</strong> to name the <code>status_id</code> values other endpoints return and, for fulfilment-client users, to see what they may do with an order in each status.</p>\n","_postman_id":"fb730bad-17db-4b69-912e-c22be8c300ff","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Inventory","item":[{"name":"Stock Locations","item":[{"name":"Create Inventory Location","id":"4fbe0952-2092-42ef-bac6-943a72531841","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"stock_level\": 0,\n    \"stock_warn_level\": 1,\n    \"note\": \"Initial setup\",\n    \"auto_allocate\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_location","description":"<p>Adds a new warehouse location to an inventory item, optionally seeding it with an initial stock level.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The warehouse location ID.</td>\n</tr>\n<tr>\n<td><code>stock_level</code></td>\n<td>int</td>\n<td>no</td>\n<td>Initial stock; default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>stock_warn_level</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>string</td>\n<td>no</td>\n<td>Audit note.</td>\n</tr>\n<tr>\n<td><code>auto_allocate</code></td>\n<td>bool</td>\n<td>no</td>\n<td>If <code>true</code>, immediately attempts to allocate the new stock to pending orders.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"locations-that-cannot-take-stock\">Locations that cannot take stock</h3>\n<p>Stock cannot be created on a <strong>tote</strong>, on the <strong>assembly</strong> location or on a <strong>zone</strong>. Totes only receive stock by picking into them, the assembly location is managed by the assembly process, and a zone only groups other locations. Sending one of these as <code>location_id</code> returns <code>422</code> and nothing is created. To put stock into a tote, pick it or use <strong>Move Stock</strong>.</p>\n<p>A <code>location_id</code> that does not exist, or has been deleted, returns <code>404</code>.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users. The user must have access to the warehouse that owns <code>location_id</code>.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre><p>Errors:</p>\n<ul>\n<li><code>404</code> <code>{ \"error\": \"Location Not Found\" }</code></li>\n<li><code>422</code> <code>{ \"validation_error\": \"You cannot add stock to a tote location. Totes only hold stock that has been picked into them.\" }</code> (tote)</li>\n<li><code>422</code> <code>{ \"validation_error\": \"You cannot add stock to an assembly location.\" }</code></li>\n<li><code>422</code> <code>{ \"validation_error\": \"You cannot create stock on zone level location.\" }</code></li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","create_inventory_location"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"38c35dd0-0b77-493a-b1fe-35ac391a3964","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"stock_level\": 0,\n    \"stock_warn_level\": 1,\n    \"note\": \"Initial setup\",\n    \"auto_allocate\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_location","description":"Adds a new warehouse location to an inventory item, optionally seeding it with an initial stock level.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | yes | The warehouse location ID. |\n| `stock_level` | int | no | Initial stock; default `1`. |\n| `stock_warn_level` | int | no | Default `1`. |\n| `note` | string | no | Audit note. |\n| `auto_allocate` | bool | no | If `true`, immediately attempts to allocate the new stock to pending orders. |\n\n### Permissions\nNot available to fulfilment-client users. The user must have access to the warehouse that owns `location_id`.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\"\n}"},{"id":"a1170952-1147-40b9-ac00-1f9c60ed159a","name":"Validation Error - tote location","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 71,\n    \"stock_level\": 5,\n    \"stock_warn_level\": 1,\n    \"note\": \"Initial setup\",\n    \"auto_allocate\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_location","description":"Adds a new warehouse location to an inventory item, optionally seeding it with an initial stock level.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | yes | The warehouse location ID. |\n| `stock_level` | int | no | Initial stock; default `1`. |\n| `stock_warn_level` | int | no | Default `1`. |\n| `note` | string | no | Audit note. |\n| `auto_allocate` | bool | no | If `true`, immediately attempts to allocate the new stock to pending orders. |\n\n### Permissions\nNot available to fulfilment-client users. The user must have access to the warehouse that owns `location_id`.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"You cannot add stock to a tote location. Totes only hold stock that has been picked into them.\"\n}"},{"id":"6e68537c-1c99-4b83-9cd4-7ce372d5366c","name":"Not Found - location does not exist","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 999999,\n    \"stock_level\": 5,\n    \"stock_warn_level\": 1,\n    \"note\": \"Initial setup\",\n    \"auto_allocate\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_location","description":"Adds a new warehouse location to an inventory item, optionally seeding it with an initial stock level.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | yes | The warehouse location ID. |\n| `stock_level` | int | no | Initial stock; default `1`. |\n| `stock_warn_level` | int | no | Default `1`. |\n| `note` | string | no | Audit note. |\n| `auto_allocate` | bool | no | If `true`, immediately attempts to allocate the new stock to pending orders. |\n\n### Permissions\nNot available to fulfilment-client users. The user must have access to the warehouse that owns `location_id`.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Location Not Found\"\n}"}],"_postman_id":"4fbe0952-2092-42ef-bac6-943a72531841"},{"name":"Adjust Location Stock","id":"3be75b23-e27d-43fa-a906-13118637fc98","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\":  1,\n    \"operator\":     \"set\",          // \"set\" | \"increase\" | \"decrease\"\n    \"quantity\":     100,\n    \"note\":         \"Stock take adjustment\",   // REQUIRED — must be a non-empty string\n    \"auto_allocate\":false,\n    \"batch_data\":   {}              // {batch_values:[...], expire_dates:[...], quantities:[...]} for batch SKUs\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//adjust_location_stock","description":"<p>Increases, decreases, or sets the stock level of an inventory item at a specific warehouse location.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>location_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. The warehouse location to adjust.</td>\n</tr>\n<tr>\n<td><code>operator</code></td>\n<td>string</td>\n<td>no</td>\n<td>One of <code>set</code>, <code>increase</code>, <code>decrease</code>. Default <code>set</code>.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>The amount to set / add / subtract. Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Reason for the adjustment. Required by validation.</td>\n</tr>\n<tr>\n<td><code>auto_allocate</code></td>\n<td>bool</td>\n<td>no</td>\n<td>If <code>true</code>, allocates new stock to pending orders after the adjustment.</td>\n</tr>\n<tr>\n<td><code>batch_data</code></td>\n<td>object</td>\n<td>no</td>\n<td>For batch- or serial-tracked SKUs, identifies which batch row to adjust: <code>{ \"batch_value\": \"&lt;batch&gt;\", \"expire_date\": \"YYYY-MM-DD\" }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li><code>note</code> is mandatory; missing/empty returns <code>422</code>.</li>\n<li>If the <em>Inventory Scrapping</em> feature is enabled, <code>decrease</code> is rejected — use <strong>Scrap Stock</strong> instead so a reason can be recorded.</li>\n<li><code>set</code> and <code>decrease</code> cannot bring the stock level below already-allocated quantities.</li>\n<li><code>set</code> and <code>decrease</code> need the item to already hold stock at <code>location_id</code>. <code>increase</code> on a location where the item has no stock yet creates it there, except on a <strong>tote</strong>, the <strong>assembly</strong> location or a <strong>zone</strong>, which returns <code>422</code> (for example <code>You cannot add stock to a tote location. Totes only hold stock that has been picked into them.</code>). Stock that is already in a tote can still be adjusted.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users. Warehouse access required.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","adjust_location_stock"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"4a51a3d1-925f-4fac-a21a-9524c40690fe","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"operator\": \"set\",\n    \"quantity\": 100,\n    \"note\": \"Stock take adjustment\",\n    \"auto_allocate\": false,\n    \"batch_data\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//adjust_location_stock","description":"Increases, decreases, or sets the stock level of an inventory item at a specific warehouse location.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | no | Default `1`. The warehouse location to adjust. |\n| `operator` | string | no | One of `set`, `increase`, `decrease`. Default `set`. |\n| `quantity` | int | no | The amount to set / add / subtract. Default `0`. |\n| `note` | string | yes | Reason for the adjustment. Required by validation. |\n| `auto_allocate` | bool | no | If `true`, allocates new stock to pending orders after the adjustment. |\n| `batch_data` | object | no | For batch- or serial-tracked SKUs, identifies which batch row to adjust: `{ \"batch_value\": \"<batch>\", \"expire_date\": \"YYYY-MM-DD\" }`. |\n\n### Constraints\n- `note` is mandatory; missing/empty returns `422`.\n- If the *Inventory Scrapping* feature is enabled, `decrease` is rejected — use **Scrap Stock** instead so a reason can be recorded.\n- `set` and `decrease` cannot bring the stock level below already-allocated quantities.\n\n### Permissions\nNot available to fulfilment-client users. Warehouse access required.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\"\n}"},{"id":"c5092444-3d58-48f0-b500-05da2ca9d837","name":"Validation Error - note required","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"operator\": \"set\",\n    \"quantity\": 100,\n    \"note\": \"Stock take adjustment\",\n    \"auto_allocate\": false,\n    \"batch_data\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//adjust_location_stock","description":"Increases, decreases, or sets the stock level of an inventory item at a specific warehouse location.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | no | Default `1`. The warehouse location to adjust. |\n| `operator` | string | no | One of `set`, `increase`, `decrease`. Default `set`. |\n| `quantity` | int | no | The amount to set / add / subtract. Default `0`. |\n| `note` | string | yes | Reason for the adjustment. Required by validation. |\n| `auto_allocate` | bool | no | If `true`, allocates new stock to pending orders after the adjustment. |\n| `batch_data` | object | no | For batch- or serial-tracked SKUs, identifies which batch row to adjust: `{ \"batch_value\": \"<batch>\", \"expire_date\": \"YYYY-MM-DD\" }`. |\n\n### Constraints\n- `note` is mandatory; missing/empty returns `422`.\n- If the *Inventory Scrapping* feature is enabled, `decrease` is rejected — use **Scrap Stock** instead so a reason can be recorded.\n- `set` and `decrease` cannot bring the stock level below already-allocated quantities.\n\n### Permissions\nNot available to fulfilment-client users. Warehouse access required.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"Stock adjustment note field is required.\"\n}"},{"id":"18c21cfe-bce9-4df6-a7ce-a7df66db1d15","name":"Validation Error - no stock in tote yet","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 71,\n    \"operator\": \"increase\",\n    \"quantity\": 3,\n    \"note\": \"Stock take adjustment\",\n    \"auto_allocate\": false,\n    \"batch_data\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//adjust_location_stock","description":"Increases, decreases, or sets the stock level of an inventory item at a specific warehouse location.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | no | Default `1`. The warehouse location to adjust. |\n| `operator` | string | no | One of `set`, `increase`, `decrease`. Default `set`. |\n| `quantity` | int | no | The amount to set / add / subtract. Default `0`. |\n| `note` | string | yes | Reason for the adjustment. Required by validation. |\n| `auto_allocate` | bool | no | If `true`, allocates new stock to pending orders after the adjustment. |\n| `batch_data` | object | no | For batch- or serial-tracked SKUs, identifies which batch row to adjust: `{ \"batch_value\": \"<batch>\", \"expire_date\": \"YYYY-MM-DD\" }`. |\n\n### Constraints\n- `note` is mandatory; missing/empty returns `422`.\n- If the *Inventory Scrapping* feature is enabled, `decrease` is rejected — use **Scrap Stock** instead so a reason can be recorded.\n- `set` and `decrease` cannot bring the stock level below already-allocated quantities.\n\n### Permissions\nNot available to fulfilment-client users. Warehouse access required.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"You cannot add stock to a tote location. Totes only hold stock that has been picked into them.\"\n}"}],"_postman_id":"3be75b23-e27d-43fa-a906-13118637fc98"},{"name":"Move Stock","id":"ac76831e-aec3-431a-9ba9-cb2a513bded8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"source_location_id\": 1,\n    \"target_location_id\": 2,\n    \"quantity\": 5,\n    \"order_ids\": []\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//move_stock","description":"<p>Moves stock of an inventory item between two warehouse locations atomically.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>source_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Where the stock comes from.</td>\n</tr>\n<tr>\n<td><code>target_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Where the stock goes. Must differ from source.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>0</code>. Quantity to move.</td>\n</tr>\n<tr>\n<td><code>order_ids</code></td>\n<td>array</td>\n<td>no</td>\n<td>Optional list of orders the move is associated with (so the stock-allocation log records the link).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users. The user must have access to <strong>both</strong> warehouses.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","move_stock"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"5e2679b5-f925-421d-964a-98311a1e1924","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"source_location_id\": 1,\n    \"target_location_id\": 2,\n    \"quantity\": 5,\n    \"order_ids\": []\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//move_stock","description":"Moves stock of an inventory item between two warehouse locations atomically.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `source_location_id` | int | yes | Where the stock comes from. |\n| `target_location_id` | int | yes | Where the stock goes. Must differ from source. |\n| `quantity` | int | no | Default `0`. Quantity to move. |\n| `order_ids` | array | no | Optional list of orders the move is associated with (so the stock-allocation log records the link). |\n\n### Permissions\nNot available to fulfilment-client users. The user must have access to **both** warehouses.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\"\n}"}],"_postman_id":"ac76831e-aec3-431a-9ba9-cb2a513bded8"},{"name":"Scrap Stock","id":"0eabccc1-a389-4f21-98be-a6731c259a48","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"quantity\": 1,\n    \"reason_id\": \"1\",\n    \"scrap_date\": \"2026-04-30\",\n    \"batch_data\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//scrap","description":"<p>Removes (scraps) stock from inventory at a specific location, recording the reason for audit. Only available when the <em>Inventory Scrapping</em> feature is enabled on the tenant.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>location_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. The warehouse location to scrap from.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>0</code>. Quantity to scrap.</td>\n</tr>\n<tr>\n<td><code>reason_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>An ID from <code>Inventory Scrapping Reasons → List Reasons</code>.</td>\n</tr>\n<tr>\n<td><code>scrap_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>ISO date; defaults to now.</td>\n</tr>\n<tr>\n<td><code>batch_data</code></td>\n<td>object</td>\n<td>no</td>\n<td>For batch/serial-tracked SKUs: <code>{ batch_value, expire_date }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users. Warehouse access required.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","scrap"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"71b2d4cb-35b8-459f-b958-0748a87f6673","name":"Error - Feature Disabled","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"quantity\": 1,\n    \"reason_id\": \"1\",\n    \"scrap_date\": \"2026-04-30\",\n    \"batch_data\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//scrap","description":"Removes (scraps) stock from inventory at a specific location, recording the reason for audit. Only available when the *Inventory Scrapping* feature is enabled on the tenant.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | no | Default `1`. The warehouse location to scrap from. |\n| `quantity` | int | no | Default `0`. Quantity to scrap. |\n| `reason_id` | int | yes | An ID from `Inventory Scrapping Reasons → List Reasons`. |\n| `scrap_date` | string | no | ISO date; defaults to now. |\n| `batch_data` | object | no | For batch/serial-tracked SKUs: `{ batch_value, expire_date }`. |\n\n### Permissions\nNot available to fulfilment-client users. Warehouse access required.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Inventory scrap is not active.\"\n}"}],"_postman_id":"0eabccc1-a389-4f21-98be-a6731c259a48"},{"name":"Remove Inventory Location","id":"d16f000f-d5c7-4453-98f7-76215b680069","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory//location/","description":"<p>Removes a warehouse location from an inventory item.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code></code> — the inventory item.</li>\n<li><code></code> — the warehouse location to remove.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The location's <code>stock_level</code> must be <code>0</code>.</li>\n<li>No active order allocations may be linked to this inventory/location combination.</li>\n<li>Warehouse access required.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","location",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"6e44bbb1-a812-4e3a-81fd-5ba87713730e","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory//location/","description":"Removes a warehouse location from an inventory item.\n\n### Path parameters\n- `` — the inventory item.\n- `` — the warehouse location to remove.\n\n### Constraints\n- The location's `stock_level` must be `0`.\n- No active order allocations may be linked to this inventory/location combination.\n- Warehouse access required.\n\n### Permissions\nNot available to fulfilment-client users.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\"\n}"}],"_postman_id":"d16f000f-d5c7-4453-98f7-76215b680069"}],"id":"0eacbf9b-a3ff-4a2a-9587-20fd3971f3b6","description":"<p>Manage where the SKU lives in the warehouse and how much of it is at each location. All endpoints in this folder are blocked for fulfilment-client users (<code>Not available to fulfilment-client users</code>).</p>\n","_postman_id":"0eacbf9b-a3ff-4a2a-9587-20fd3971f3b6","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Suppliers","item":[{"name":"List Supplier Links","id":"6c3d3616-8c16-42a4-9944-54651d08620a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/supplier-links?page=1&per_page=100","description":"<p>Lists every inventory-to-supplier link in one paginated feed, so you can mirror supplier references, cost prices and minimum order quantities without reading each inventory item. Links are created and edited through <strong>Add Supplier</strong> / <strong>Update Supplier</strong> / <strong>Remove Supplier</strong>.</p>\n<p>The same endpoint is also served at <code>/supplier_links</code> (underscore); both paths behave identically.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Initial load of your supplier catalogue mapping, then incremental sync with <code>filters[updated_since]</code>.</li>\n<li>Look up which suppliers can source a given inventory item, or which items a supplier is linked to.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users only see links for their own inventory items; links belonging to archived fulfilment clients are hidden from everyone else.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>) and <code>per_page</code> (default <code>100</code>, maximum <code>500</code>).</p>\n<p>Records are returned oldest change first (<code>updated_at</code> ascending, then <code>id</code> ascending), so a sync can resume safely from the returned <code>next_cursor</code>.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[inventory_id]</code></td>\n<td>int or array</td>\n<td>Only links for these inventory items.</td>\n</tr>\n<tr>\n<td><code>filters[contact_id]</code></td>\n<td>int or array</td>\n<td>Only links for these supplier contacts.</td>\n</tr>\n<tr>\n<td><code>filters[updated_since]</code></td>\n<td>string</td>\n<td>Only links changed at or after this time. Send a UTC ISO 8601 timestamp such as <code>2026-09-01T09:00:00Z</code>, or pass back <code>next_cursor.updated_at</code> exactly as returned. An unreadable value returns <code>422</code>.</td>\n</tr>\n<tr>\n<td><code>filters[after_id]</code></td>\n<td>int</td>\n<td>Used together with <code>updated_since</code> to continue after the last record of the previous page: returns links changed after that time, plus links changed at exactly that time whose <code>id</code> is greater. Pass back <code>next_cursor.id</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"incremental-sync\">Incremental sync</h3>\n<ol>\n<li>Fetch with no filters to load everything; keep <code>next_cursor</code> from the last page.</li>\n<li>On each later run send <code>filters[updated_since]=&lt;cursor.updated_at&gt;&amp;filters[after_id]=&lt;cursor.id&gt;</code> and page until <code>data</code> is empty.</li>\n<li>Links are removed permanently (including when a supplier contact or inventory item is deleted), so removals never appear in this feed. Reconcile the full set of <code>id</code> values from an unfiltered listing periodically and drop anything you hold that is no longer listed.</li>\n</ol>\n<h3 id=\"response\">Response</h3>\n<p>List envelope plus <code>next_cursor</code> (<code>{ updated_at, id }</code> of the last record on the page, or <code>null</code> when the page is empty). Each <code>data[]</code> item: <code>id</code>, <code>contact_id</code> (supplier), <code>inventory_id</code>, <code>active</code>, <code>primary_supplier</code>, <code>cost_price</code>, <code>supplier_reference</code>, <code>minimum_order_quantity</code>, <code>minimum_pack_quantity</code>, <code>created_at</code>, <code>updated_at</code>. Numeric values are returned as strings.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["supplier-links"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"100"}],"variable":[]}},"response":[{"id":"01947e02-4bba-488b-be87-72923b53cdd6","name":"200 - first page","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://your-company.myhelm.app/public-api/supplier-links?per_page=2","host":["https://your-company.myhelm.app/public-api"],"path":["supplier-links"],"query":[{"key":"per_page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 3,\n  \"per_page\": 2,\n  \"current_page\": 1,\n  \"last_page\": 2,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/supplier-links?&per_page=2&page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 2,\n  \"next_cursor\": {\n    \"updated_at\": \"2026-02-27 11:29:39\",\n    \"id\": 2\n  },\n  \"data\": [\n    {\n      \"id\": \"1\",\n      \"contact_id\": \"5779\",\n      \"inventory_id\": \"3\",\n      \"active\": \"1\",\n      \"primary_supplier\": \"1\",\n      \"cost_price\": \"2.0000\",\n      \"supplier_reference\": \"po_test\",\n      \"minimum_order_quantity\": \"1\",\n      \"minimum_pack_quantity\": \"1\",\n      \"created_at\": \"2026-02-25 13:52:06\",\n      \"updated_at\": \"2026-02-25 13:52:06\"\n    },\n    {\n      \"id\": \"2\",\n      \"contact_id\": \"5779\",\n      \"inventory_id\": \"5\",\n      \"active\": \"1\",\n      \"primary_supplier\": \"1\",\n      \"cost_price\": \"10.0000\",\n      \"supplier_reference\": \"po_test_2\",\n      \"minimum_order_quantity\": \"4\",\n      \"minimum_pack_quantity\": \"1\",\n      \"created_at\": \"2026-02-27 11:29:39\",\n      \"updated_at\": \"2026-02-27 11:29:39\"\n    }\n  ]\n}"},{"id":"6b059cae-9941-4a3d-ab3a-a37447dfb588","name":"200 - continue from cursor","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://your-company.myhelm.app/public-api/supplier-links?per_page=2&filters[updated_since]=2026-02-27T11:29:39Z&filters[after_id]=2","host":["https://your-company.myhelm.app/public-api"],"path":["supplier-links"],"query":[{"key":"per_page","value":"2"},{"key":"filters[updated_since]","value":"2026-02-27T11:29:39Z"},{"key":"filters[after_id]","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 1,\n  \"per_page\": 2,\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 2,\n  \"next_cursor\": {\n    \"updated_at\": \"2026-09-02 12:48:43\",\n    \"id\": 7\n  },\n  \"data\": [\n    {\n      \"id\": \"7\",\n      \"contact_id\": \"5809\",\n      \"inventory_id\": \"806\",\n      \"active\": \"1\",\n      \"primary_supplier\": \"1\",\n      \"cost_price\": \"2.5000\",\n      \"supplier_reference\": \"VENDOR-REF-806\",\n      \"minimum_order_quantity\": \"1\",\n      \"minimum_pack_quantity\": \"1\",\n      \"created_at\": \"2026-09-02 12:48:43\",\n      \"updated_at\": \"2026-09-02 12:48:43\"\n    }\n  ]\n}"},{"id":"a43e807f-db46-4cd5-91a7-2964feb1f484","name":"422 - unreadable updated_since","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://your-company.myhelm.app/public-api/supplier-links?filters[updated_since]=notadate","host":["https://your-company.myhelm.app/public-api"],"path":["supplier-links"],"query":[{"key":"filters[updated_since]","value":"notadate"}]}},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"filters[updated_since] must be a valid UTC ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)\"\n}"}],"_postman_id":"6c3d3616-8c16-42a4-9944-54651d08620a"},{"name":"List Supplier Links (underscore path)","id":"c1ce9398-8fc8-4f55-9331-07bc23d522e0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/supplier_links?page=1&per_page=100","description":"<p>Alternative spelling of <strong>List Supplier Links</strong>: identical parameters, filters and response. Use whichever path suits your client; both stay supported.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users only see links for their own inventory items.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["supplier_links"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"100"}],"variable":[]}},"response":[{"id":"fb21a8fe-f8ed-4ab6-8c6c-a6aba2bcffc2","name":"200 - first page","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://your-company.myhelm.app/public-api/supplier_links?per_page=2","host":["https://your-company.myhelm.app/public-api"],"path":["supplier_links"],"query":[{"key":"per_page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 3,\n  \"per_page\": 2,\n  \"current_page\": 1,\n  \"last_page\": 2,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/supplier-links?&per_page=2&page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 2,\n  \"next_cursor\": {\n    \"updated_at\": \"2026-02-27 11:29:39\",\n    \"id\": 2\n  },\n  \"data\": [\n    {\n      \"id\": \"1\",\n      \"contact_id\": \"5779\",\n      \"inventory_id\": \"3\",\n      \"active\": \"1\",\n      \"primary_supplier\": \"1\",\n      \"cost_price\": \"2.0000\",\n      \"supplier_reference\": \"po_test\",\n      \"minimum_order_quantity\": \"1\",\n      \"minimum_pack_quantity\": \"1\",\n      \"created_at\": \"2026-02-25 13:52:06\",\n      \"updated_at\": \"2026-02-25 13:52:06\"\n    },\n    {\n      \"id\": \"2\",\n      \"contact_id\": \"5779\",\n      \"inventory_id\": \"5\",\n      \"active\": \"1\",\n      \"primary_supplier\": \"1\",\n      \"cost_price\": \"10.0000\",\n      \"supplier_reference\": \"po_test_2\",\n      \"minimum_order_quantity\": \"4\",\n      \"minimum_pack_quantity\": \"1\",\n      \"created_at\": \"2026-02-27 11:29:39\",\n      \"updated_at\": \"2026-02-27 11:29:39\"\n    }\n  ]\n}"}],"_postman_id":"c1ce9398-8fc8-4f55-9331-07bc23d522e0"},{"name":"Add Supplier","id":"1f73606d-f180-4ae5-83a3-4146cd57cd6d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"supplier_id\": 123,\n    \"active\": 1,\n    \"primary_supplier\": 1,\n    \"minimum_order_quantity\": 50,\n    \"cost_price\": 4.50,\n    \"supplier_reference\": \"SUP-REF-001\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//add_supplier","description":"<p>Links a supplier contact to an inventory item, recording the supplier's reference, MOQ, and cost.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>supplier_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Contact ID. The contact must be of type <strong>Supplier</strong> and not archived.</td>\n</tr>\n<tr>\n<td><code>active</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>primary_supplier</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. The primary supplier is the default for new POs.</td>\n</tr>\n<tr>\n<td><code>minimum_order_quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>cost_price</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>. The supplier's price.</td>\n</tr>\n<tr>\n<td><code>supplier_reference</code></td>\n<td>string</td>\n<td>no</td>\n<td>Supplier's own product reference. Defaults to the inventory SKU.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"supplier_link\": { ... supplier link record ... } }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","add_supplier"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"0e59cc45-f63d-4549-928c-42b218e67654","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"supplier_id\": 123,\n    \"active\": 1,\n    \"primary_supplier\": 1,\n    \"minimum_order_quantity\": 50,\n    \"cost_price\": 4.50,\n    \"supplier_reference\": \"SUP-REF-001\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//add_supplier","description":"Links a supplier contact to an inventory item, recording the supplier's reference, MOQ, and cost.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `supplier_id` | int | yes | Contact ID. The contact must be of type **Supplier** and not archived. |\n| `active` | bool | no | Default `0`. |\n| `primary_supplier` | bool | no | Default `0`. The primary supplier is the default for new POs. |\n| `minimum_order_quantity` | int | no | Default `1`. |\n| `cost_price` | number | no | Default `0`. The supplier's price. |\n| `supplier_reference` | string | no | Supplier's own product reference. Defaults to the inventory SKU. |\n\n### Response\n```\n{ \"supplier_link\": { ... supplier link record ... } }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"supplier_link\": {\n    \"id\": 3,\n    \"contact_id\": 5779,\n    \"inventory_id\": 745,\n    \"active\": 1,\n    \"primary_supplier\": 1,\n    \"cost_price\": \"4.5000\",\n    \"supplier_reference\": \"POSTMAN-SUP-REF\",\n    \"minimum_order_quantity\": 50,\n    \"minimum_pack_quantity\": 1,\n    \"created_at\": \"2026-04-30 13:13:22\",\n    \"updated_at\": \"2026-04-30 13:13:22\"\n  }\n}"}],"_postman_id":"1f73606d-f180-4ae5-83a3-4146cd57cd6d"},{"name":"Update Supplier","id":"ae11386e-5fbc-42bc-b141-6289447213d6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_supplier_link_id\": 100,\n    \"active\": 1,\n    \"primary_supplier\": 0,\n    \"minimum_order_quantity\": 100,\n    \"cost_price\": 4.25,\n    \"supplier_reference\": \"SUP-REF-001-V2\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_supplier","description":"<p>Updates an existing inventory↔supplier link.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>inventory_supplier_link_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The link to update (returned by <strong>Add Supplier</strong> as <code>supplier_link.id</code>).</td>\n</tr>\n<tr>\n<td><code>supplier_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Replace the supplier; must point to a non-archived Supplier contact.</td>\n</tr>\n<tr>\n<td><code>active</code> / <code>primary_supplier</code></td>\n<td>bool</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>minimum_order_quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>cost_price</code></td>\n<td>number</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>supplier_reference</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;link_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","update_supplier"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"1d4c7005-d8cc-46a3-8a86-51c0a38bd7b9","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_supplier_link_id\": 100,\n    \"active\": 1,\n    \"primary_supplier\": 0,\n    \"minimum_order_quantity\": 100,\n    \"cost_price\": 4.25,\n    \"supplier_reference\": \"SUP-REF-001-V2\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_supplier","description":"Updates an existing inventory↔supplier link.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `inventory_supplier_link_id` | int | yes | The link to update (returned by **Add Supplier** as `supplier_link.id`). |\n| `supplier_id` | int | no | Replace the supplier; must point to a non-archived Supplier contact. |\n| `active` / `primary_supplier` | bool | no | |\n| `minimum_order_quantity` | int | no | |\n| `cost_price` | number | no | |\n| `supplier_reference` | string | no | |\n\n### Response\n```\n{ \"id\": <link_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3\n}"}],"_postman_id":"ae11386e-5fbc-42bc-b141-6289447213d6"},{"name":"Remove Supplier","id":"9e8542dd-26e6-43e4-9d99-9827260d8551","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_supplier_link_id\": 100\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//remove_supplier","description":"<p>Removes an inventory↔supplier link. The supplier contact itself is not deleted.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>inventory_supplier_link_id</code> (int, required).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;link_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","remove_supplier"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"ac4a87b3-2a13-42f9-97a1-4500c89dd6d5","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_supplier_link_id\": 100\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//remove_supplier","description":"Removes an inventory↔supplier link. The supplier contact itself is not deleted.\n\n### Body field\n- `inventory_supplier_link_id` (int, required).\n\n### Response\n```\n{ \"id\": <link_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3\n}"}],"_postman_id":"9e8542dd-26e6-43e4-9d99-9827260d8551"}],"id":"6b5062d7-68b1-4303-97ce-19d004739c55","description":"<p>Link inventory items to supplier contacts so PO creation, MOQ tracking, and supplier-cost reporting can work.</p>\n","_postman_id":"6b5062d7-68b1-4303-97ce-19d004739c55","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Inventory Links","item":[{"name":"Create Inventory Link","id":"fca37989-3daf-4813-a363-03be69253ef8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_id\": 42,\n    \"quantity\": 1,\n    \"packing_option\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_link","description":"<p>Adds a child inventory link under the parent identified by <code></code>.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>inventory_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Child inventory ID.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Quantity of child per parent.</td>\n</tr>\n<tr>\n<td><code>packing_option</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Packing/picking strategy code.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The child cannot be the same as the parent.</li>\n<li>The child cannot be type Group, Packaging, or Auxiliary Packaging.</li>\n<li>Two dynamic-components items cannot be linked to each other.</li>\n<li>Component (type 2) and Inventory (type 1) items can only link to each other.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"inventory_link\": { ... inventory link record ... } }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","create_inventory_link"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"e0e916ca-0685-477b-b8fe-75ee3c402ed7","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_id\": 42,\n    \"quantity\": 1,\n    \"packing_option\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_link","description":"Adds a child inventory link under the parent identified by ``.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `inventory_id` | int | yes | Child inventory ID. |\n| `quantity` | int | no | Default `1`. Quantity of child per parent. |\n| `packing_option` | int | no | Default `1`. Packing/picking strategy code. |\n\n### Constraints\n- The child cannot be the same as the parent.\n- The child cannot be type Group, Packaging, or Auxiliary Packaging.\n- Two dynamic-components items cannot be linked to each other.\n- Component (type 2) and Inventory (type 1) items can only link to each other.\n\n### Response\n```\n{ \"inventory_link\": { ... inventory link record ... } }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"inventory_link\": {\n    \"id\": 2,\n    \"inventory_id_1\": 745,\n    \"inventory_id_2\": 746,\n    \"quantity\": 2,\n    \"packing_option\": 1,\n    \"created_at\": \"2026-04-30 13:13:54\",\n    \"updated_at\": \"2026-04-30 13:13:54\"\n  }\n}"}],"_postman_id":"fca37989-3daf-4813-a363-03be69253ef8"},{"name":"Update Inventory Link","id":"bb724e31-4094-41f1-97ca-b07ad4db3006","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_inventory_link_id\": 30,\n    \"inventory_id\":                42,    // REQUIRED — the linked inventory ID; must be sent on every update\n    \"quantity\":                    2,\n    \"packing_option\":              1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_inventory_link","description":"<p>Updates an existing inventory link.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>inventory_inventory_link_id</code> (int, required) — the link to update.</li>\n<li><code>inventory_id</code> (int, optional) — replace the child inventory.</li>\n<li><code>quantity</code> (int, optional).</li>\n<li><code>packing_option</code> (int, optional).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;link_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","update_inventory_link"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"30a4c1f8-e49a-44dd-8ea7-8196b93e82ac","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_inventory_link_id\": 30,\n    \"quantity\": 2,\n    \"packing_option\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_inventory_link","description":"Updates an existing inventory link.\n\n### Body fields\n- `inventory_inventory_link_id` (int, required) — the link to update.\n- `inventory_id` (int, optional) — replace the child inventory.\n- `quantity` (int, optional).\n- `packing_option` (int, optional).\n\n### Response\n```\n{ \"id\": <link_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 2\n}"}],"_postman_id":"bb724e31-4094-41f1-97ca-b07ad4db3006"},{"name":"Delete Inventory Link","id":"64dfdffc-443b-4f4a-838c-2343dcebe252","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_inventory_link_id\": 30\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//delete_inventory_link","description":"<p>Removes an inventory link.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>inventory_inventory_link_id</code> (int, required).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;link_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","delete_inventory_link"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"90c76425-c7f1-4f9f-8734-b199ee9cff46","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_inventory_link_id\": 30\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//delete_inventory_link","description":"Removes an inventory link.\n\n### Body field\n- `inventory_inventory_link_id` (int, required).\n\n### Response\n```\n{ \"id\": <link_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 2\n}"}],"_postman_id":"64dfdffc-443b-4f4a-838c-2343dcebe252"}],"id":"3e524d89-883b-4412-bcb7-4034827adf98","description":"<p>Compose inventory items out of other inventory items (kits / groups / dynamic components). A <em>parent</em> item links to one or more <em>children</em>; per-link quantity says how many of the child go into one of the parent.</p>\n","_postman_id":"3e524d89-883b-4412-bcb7-4034827adf98","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Batches & Serials","item":[{"name":"Add Inventory Batch","id":"dde6acfe-a49d-4f58-a289-3502b7c0ef15","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,                                          // must be a location where the item already has a stock record\n    \"batch_values\": [\n        { \"value\": \"BATCH-2026-04-001\", \"expire_date\": \"2027-04-30\", \"quantity\": 50 },\n        { \"value\": \"BATCH-2026-04-002\", \"expire_date\": \"2027-04-30\", \"quantity\": 50 }\n    ]\n}\n// The inventory must have batching_type=1 (serial) or batching_type=2 (batch).","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//add_inventory_batch","description":"<p>Adds one or more batch / serial-number rows to an inventory item, each with their own quantity and (optionally) expiry date.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Warehouse location to add the batches at.</td>\n</tr>\n<tr>\n<td><code>batch_values</code></td>\n<td>array</td>\n<td>yes</td>\n<td>One element per batch/serial; see fields below.</td>\n</tr>\n<tr>\n<td><code>batch_values[].value</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The batch number or serial number. Trimmed before validation.</td>\n</tr>\n<tr>\n<td><code>batch_values[].expire_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>Any date format <code>strtotime</code> accepts. Stored as <code>YYYY-MM-DD</code>.</td>\n</tr>\n<tr>\n<td><code>batch_values[].quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. For serial-numbered items the quantity per row is effectively <code>1</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The inventory must have <code>batching_type != 0</code>.</li>\n<li>For <code>batching_type = 1</code> (Serial Number) every <code>value</code> must be globally unique within the SKU — duplicates across the request <em>or</em> against existing serials are rejected.</li>\n<li>For <code>batching_type = 2</code> (Batch Number) duplicate values are allowed but <code>(value + location + expiry)</code> must be unique.</li>\n<li>Warehouse access required.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"success\": [ ...created batch records... ],\n  \"errors\": {                               // present only if some serials failed validation\n    \"unique_serial_number_values\": [ \"...\" ],\n    \"unique_serial_number_errors\":  \"&lt;message&gt;\"\n  }\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","add_inventory_batch"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"96cc4067-48a7-4ce5-9ce8-2a90183cdd4f","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_id\": 1,\n    \"batch_values\": [\n        { \"value\": \"BATCH-2026-04-001\", \"expire_date\": \"2027-04-30\", \"quantity\": 50 },\n        { \"value\": \"BATCH-2026-04-002\", \"expire_date\": \"2027-04-30\", \"quantity\": 50 }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//add_inventory_batch","description":"Adds one or more batch / serial-number rows to an inventory item, each with their own quantity and (optionally) expiry date.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `location_id` | int | yes | Warehouse location to add the batches at. |\n| `batch_values` | array | yes | One element per batch/serial; see fields below. |\n| `batch_values[].value` | string | yes | The batch number or serial number. Trimmed before validation. |\n| `batch_values[].expire_date` | string | no | Any date format `strtotime` accepts. Stored as `YYYY-MM-DD`. |\n| `batch_values[].quantity` | int | no | Default `1`. For serial-numbered items the quantity per row is effectively `1`. |\n\n### Constraints\n- The inventory must have `batching_type != 0`.\n- For `batching_type = 1` (Serial Number) every `value` must be globally unique within the SKU — duplicates across the request *or* against existing serials are rejected.\n- For `batching_type = 2` (Batch Number) duplicate values are allowed but `(value + location + expiry)` must be unique.\n- Warehouse access required.\n\n### Response\n```\n{\n  \"success\": [ ...created batch records... ],\n  \"errors\": {                               // present only if some serials failed validation\n    \"unique_serial_number_values\": [ \"...\" ],\n    \"unique_serial_number_errors\":  \"<message>\"\n  }\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": [\n    {\n      \"id\": 14,\n      \"inventory_location_index_id\": 806,\n      \"batch_location_id\": 12,\n      \"batch_warehouse_id\": 6,\n      \"batch_number\": \"POSTMAN-BATCH-A\",\n      \"serial_number\": null,\n      \"expire_date\": \"2027-04-30\",\n      \"stock_level\": 30,\n      \"stock_level_available\": 30,\n      \"created_at\": \"2026-04-30 13:14:17\",\n      \"updated_at\": \"2026-04-30 13:14:17\"\n    },\n    {\n      \"id\": 15,\n      \"inventory_location_index_id\": 806,\n      \"batch_location_id\": 12,\n      \"batch_warehouse_id\": 6,\n      \"batch_number\": \"POSTMAN-BATCH-B\",\n      \"serial_number\": null,\n      \"expire_date\": \"2027-04-30\",\n      \"stock_level\": 20,\n      \"stock_level_available\": 20,\n      \"created_at\": \"2026-04-30 13:14:17\",\n      \"updated_at\": \"2026-04-30 13:14:17\"\n    }\n  ]\n}"}],"_postman_id":"dde6acfe-a49d-4f58-a289-3502b7c0ef15"},{"name":"Update Inventory Batch","id":"cf44e445-41f7-407d-8f69-dbbbcd3c3e92","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"batch_id\": 200,\n    \"value\": \"BATCH-2026-04-001-RENAMED\",\n    \"expire_date\": \"2027-06-30\",\n    \"quantity\": 45\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_inventory_batch","description":"<p>Updates a single batch / serial-number row.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>batch_id</code> (int, required).</li>\n<li><code>value</code> (string, optional) — must be unique under the same uniqueness rules as <strong>Add Inventory Batch</strong>.</li>\n<li><code>expire_date</code> (string, optional).</li>\n<li><code>quantity</code> (int, optional) — cannot be reduced below already-allocated stock. If the <em>Inventory Scrapping</em> feature is enabled, you cannot reduce <code>quantity</code> at all (use <strong>Scrap Stock</strong>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;batch_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","update_inventory_batch"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"9b921611-c97f-4a90-83c8-13920044c6d9","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"batch_id\": 200,\n    \"value\": \"BATCH-2026-04-001-RENAMED\",\n    \"expire_date\": \"2027-06-30\",\n    \"quantity\": 45\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_inventory_batch","description":"Updates a single batch / serial-number row.\n\n### Body fields\n- `batch_id` (int, required).\n- `value` (string, optional) — must be unique under the same uniqueness rules as **Add Inventory Batch**.\n- `expire_date` (string, optional).\n- `quantity` (int, optional) — cannot be reduced below already-allocated stock. If the *Inventory Scrapping* feature is enabled, you cannot reduce `quantity` at all (use **Scrap Stock**).\n\n### Response\n```\n{ \"id\": <batch_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 14\n}"}],"_postman_id":"cf44e445-41f7-407d-8f69-dbbbcd3c3e92"},{"name":"Delete Inventory Batch","id":"043f8b6d-a221-42b3-833b-6c10ad753170","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"batch_id\": 200\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//delete_inventory_batch","description":"<p>Removes a batch/serial row entirely. Use this when the batch is no longer in the warehouse and no allocation refers to it.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>batch_id</code> (int, required).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;batch_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","delete_inventory_batch"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"997cc331-53b5-45ce-840e-bfe435865f3e","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"batch_id\": 200\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//delete_inventory_batch","description":"Removes a batch/serial row entirely. Use this when the batch is no longer in the warehouse and no allocation refers to it.\n\n### Body field\n- `batch_id` (int, required).\n\n### Response\n```\n{ \"id\": <batch_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 15\n}"}],"_postman_id":"043f8b6d-a221-42b3-833b-6c10ad753170"}],"id":"d326731a-7809-4821-91c6-cabc8fe1b6ff","description":"<p>Manage individual batch / serial-number stock rows for inventory items configured with <code>batching_type != 0</code>. Use these endpoints to record initial intake, correct mistakes, or remove batches that are no longer in the warehouse.</p>\n","_postman_id":"d326731a-7809-4821-91c6-cabc8fe1b6ff","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Package Configurations","item":[{"name":"Create Package Configuration","id":"e252f446-e4c9-4279-9e26-6593d5521ab6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"type\": 1,\n    \"quantity\": 12,\n    \"weight\": 5.4,\n    \"height\": 20,\n    \"width\": 30,\n    \"length\": 40,\n    \"barcode\": \"5012345678900\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_package_configuration","description":"<p>Adds a new package configuration to an inventory item.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Box type code: <code>1</code> PCS, <code>2</code> Inner, <code>3</code> Outer, <code>4</code> Carton, <code>5</code> Box, <code>6</code> Pallet, <code>7</code> Crate, <code>8</code> Container.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Items per box at this configuration.</td>\n</tr>\n<tr>\n<td><code>weight</code> / <code>height</code> / <code>width</code> / <code>length</code></td>\n<td>number</td>\n<td>no</td>\n<td>Defaults inherited from tenant settings.</td>\n</tr>\n<tr>\n<td><code>barcode</code></td>\n<td>string</td>\n<td>no</td>\n<td>Barcode printed on this pack (for example the case or outer barcode), up to 255 characters. Surrounding spaces are trimmed; omitted or empty is stored as <code>null</code>. A longer value is rejected with <code>422</code> and nothing is created.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"package_configuration\": { ... package configuration record ... } }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","create_package_configuration"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"54ea5ed7-1b53-4163-bddf-b74114d6d2ec","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"type\": 1,\n    \"quantity\": 12,\n    \"weight\": 5.4,\n    \"height\": 20,\n    \"width\": 30,\n    \"length\": 40,\n    \"barcode\": \"5012345678900\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_package_configuration","description":"Adds a new package configuration to an inventory item.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | int | no | Default `1`. Box type code. |\n| `quantity` | int | no | Default `1`. Items per box at this configuration. |\n| `weight` / `height` / `width` / `length` | number | no | Defaults inherited from tenant settings. |\n\n### Response\n```\n{ \"package_configuration\": { ... package configuration record ... } }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"package_configuration\": {\n    \"id\": 2,\n    \"inventory_id\": 745,\n    \"type\": 1,\n    \"quantity\": 12,\n    \"weight\": \"5.400\",\n    \"height\": \"20.0\",\n    \"width\": \"30.0\",\n    \"length\": \"40.0\",\n    \"barcode\": \"5012345678900\",\n    \"created_at\": \"2026-04-30 13:14:32\",\n    \"updated_at\": \"2026-04-30 13:14:32\"\n  }\n}"},{"id":"d67418dd-3fde-42e9-a281-ec313fa5f5f4","name":"422 - barcode too long","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"type\": 1,\n    \"quantity\": 12,\n    \"barcode\": \"<a value longer than 255 characters>\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_package_configuration","description":"Adds a new package configuration to an inventory item.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | int | no | Default `1`. Box type code. |\n| `quantity` | int | no | Default `1`. Items per box at this configuration. |\n| `weight` / `height` / `width` / `length` | number | no | Defaults inherited from tenant settings. |\n\n### Response\n```\n{ \"package_configuration\": { ... package configuration record ... } }\n```\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"barcode field may not be longer than 255 characters\"\n}"}],"_postman_id":"e252f446-e4c9-4279-9e26-6593d5521ab6"},{"name":"Update Package Configuration","id":"acc59556-a9cb-4a61-8379-96177a2f854d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"package_configuration_id\": 50,\n    \"quantity\": 24,\n    \"weight\": 10.5,\n    \"barcode\": \"5012345678900\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_package_configuration","description":"<p>Updates a package configuration. Only the fields you send are changed; every omitted field keeps its current value.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>package_configuration_id</code> (int, required) - the <code>id</code> of the package configuration, as returned by <strong>Create Package Configuration</strong> or listed on <strong>Get Inventory Detail</strong>.</li>\n<li><code>type</code>, <code>quantity</code>, <code>weight</code>, <code>height</code>, <code>width</code>, <code>length</code> (optional). Box type codes are listed on <strong>Create Package Configuration</strong>.</li>\n<li><code>barcode</code> (string, optional, up to 255 characters). Only changed when the key is present in the body. Send <code>\"\"</code> or <code>null</code> to clear the barcode. A longer value is rejected with <code>422</code> and nothing is changed.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;package_configuration_id&gt; }\n</code></pre><p>Returns <code>404</code> if the inventory item or the package configuration does not exist, and <code>422</code> if <code>package_configuration_id</code> is missing.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","update_package_configuration"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"bd5c9cbc-9f8e-475d-8246-17473aab9696","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"package_configuration_id\": 50,\n    \"quantity\": 24,\n    \"weight\": 10.5,\n    \"barcode\": \"5012345678900\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_package_configuration","description":"Updates a package configuration.\n\n### Body fields\n- `package_configuration_id` (int, required).\n- `type`, `quantity`, `weight`, `height`, `width`, `length` (optional).\n\n### Response\n```\n{ \"id\": <package_configuration_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 2\n}"},{"id":"9b3eeb66-0613-487b-9025-80b0bb59422f","name":"422 - barcode too long","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"package_configuration_id\": 50,\n    \"barcode\": \"<a value longer than 255 characters>\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update_package_configuration","description":"Updates a package configuration.\n\n### Body fields\n- `package_configuration_id` (int, required).\n- `type`, `quantity`, `weight`, `height`, `width`, `length` (optional).\n\n### Response\n```\n{ \"id\": <package_configuration_id> }\n```\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"barcode field may not be longer than 255 characters\"\n}"}],"_postman_id":"acc59556-a9cb-4a61-8379-96177a2f854d"},{"name":"Delete Package Configuration","id":"616e4185-72d3-4ebe-8299-7d3dc542c6d0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"package_configuration_id\": 50\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//delete_package_configuration","description":"<p>Deletes a package configuration.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>package_configuration_id</code> (int, required).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;package_configuration_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","delete_package_configuration"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"3d654099-6085-4813-9951-f9da9f820987","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"package_configuration_id\": 50\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//delete_package_configuration","description":"Deletes a package configuration.\n\n### Body field\n- `package_configuration_id` (int, required).\n\n### Response\n```\n{ \"id\": <package_configuration_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 2\n}"}],"_postman_id":"616e4185-72d3-4ebe-8299-7d3dc542c6d0"}],"id":"dc35410a-345b-493b-842b-4f3d2d92c398","description":"<p>Each inventory item can declare one or more <em>package configurations</em> — \"if you put N of this SKU in a box, the box has these dimensions and weight\". Used by the cartonisation engine when generating shipments.</p>\n","_postman_id":"dc35410a-345b-493b-842b-4f3d2d92c398","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Categories","item":[{"name":"Add Category to Inventory","id":"20c718c3-24ee-4889-abfc-b86bfa528654","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"category_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_category","description":"<p>Assigns an existing inventory category to an inventory item.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>category_id</code> (int, required) — see <strong>Inventory Categories → List Categories</strong> for valid IDs.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"status\": \"success\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","create_inventory_category"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"1e6ad351-0b77-453c-a920-e7cdcdd8d801","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"category_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//create_inventory_category","description":"Assigns an existing inventory category to an inventory item.\n\n### Body field\n- `category_id` (int, required) — see **Inventory Categories → List Categories** for valid IDs.\n\n### Response\n```\n{ \"status\": \"success\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\"\n}"}],"_postman_id":"20c718c3-24ee-4889-abfc-b86bfa528654"},{"name":"Remove Category from Inventory","id":"02fbbfd5-9418-40b2-9819-19410f60c211","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_category_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//remove_inventory_category","description":"<p>Removes a category assignment from an inventory item.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>inventory_category_id</code> (int, required) — note the field name is <code>inventory_category_id</code>, not <code>category_id</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;link_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","remove_inventory_category"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"5f1fd7fe-d007-4655-ad78-83acad6ba042","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"inventory_category_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//remove_inventory_category","description":"Removes a category assignment from an inventory item.\n\n### Body field\n- `inventory_category_id` (int, required) — note the field name is `inventory_category_id`, not `category_id`.\n\n### Response\n```\n{ \"id\": <link_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1\n}"}],"_postman_id":"02fbbfd5-9418-40b2-9819-19410f60c211"}],"id":"121685fe-b2db-4b9d-ad70-b438d6684709","description":"<p>Attach and detach inventory categories on an item. To create or rename categories themselves, see the top-level <strong>Inventory Categories</strong> folder.</p>\n","_postman_id":"121685fe-b2db-4b9d-ad70-b438d6684709","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Assembly","item":[{"name":"List Assemblies","id":"b285ceca-811b-41cf-b998-aece7c398732","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/assemblies?page=1&per_page=20","description":"<p>Returns a paginated list of assemblies (kit / formula builds).</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting).</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on assembly <code>reference</code>, output <code>sku</code>, or output <code>name</code>. Use `</td>\n</tr>\n<tr>\n<td><code>filters[status][]</code></td>\n<td>int</td>\n<td>One or more status IDs (repeatable). See the status table below.</td>\n</tr>\n</tbody>\n</table>\n</div><p>When no <code>status</code> filter is supplied, the list defaults to <strong>open</strong> assemblies only (statuses <code>0</code>, <code>1</code>, <code>2</code>, <code>3</code>, <code>4</code>).</p>\n<h3 id=\"status-values\">Status values</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Name</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>0</code></td>\n<td>In Progress</td>\n</tr>\n<tr>\n<td><code>1</code></td>\n<td>Movement Job Created</td>\n</tr>\n<tr>\n<td><code>2</code></td>\n<td>Formula Moved to Target Location</td>\n</tr>\n<tr>\n<td><code>3</code></td>\n<td>Ready to Complete</td>\n</tr>\n<tr>\n<td><code>4</code></td>\n<td>Error</td>\n</tr>\n<tr>\n<td><code>5</code></td>\n<td>Completed</td>\n</tr>\n<tr>\n<td><code>6</code></td>\n<td>Cancelled</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sorting\">Sorting</h3>\n<p><code>sort</code> = <code>created_asc</code> | <code>created_desc</code>. Default: <code>created_desc</code>.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item carries <code>reference</code>, <code>status</code>, the output SKU / name / image, target location, <code>quantity</code>, assigned user, and a <code>components_summary[]</code> array (<code>inventory_id</code>, <code>sku</code>, <code>qty_per_unit</code>). When there are no assemblies, <code>data</code> is <code>null</code>.</p>\n<p>Requires <strong>Warehouse Operative</strong> level or above.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["assemblies"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>Partial match on reference, output SKU or output name.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Status ID (repeatable). See folder description.</p>\n","type":"text/plain"},"key":"filters[status][]","value":"3"},{"disabled":true,"description":{"content":"<p>One of: <code>created_asc</code> | <code>created_desc</code>. Default: <code>created_desc</code>.</p>\n","type":"text/plain"},"key":"sort","value":"created_desc"}],"variable":[]}},"response":[{"id":"d9285664-ba87-4a16-a01b-9fd3ac78778f","name":"200 — assemblies found","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/assemblies?page=1&per_page=20","host":["https://your-company.myhelm.app/public-api"],"path":["assemblies"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"},{"key":"filters[search]","value":"","description":"Partial match on reference, output SKU or output name.","disabled":true},{"key":"filters[status][]","value":"3","description":"Status ID (repeatable). See folder description.","disabled":true},{"key":"sort","value":"created_desc","description":"One of: `created_asc` | `created_desc`. Default: `created_desc`.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 1,\n  \"per_page\": 20,\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": \"https://your-company.myhelm.app/public-api/assemblies?&page=2\",\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 20,\n  \"data\": [\n    {\n      \"id\": 12,\n      \"reference\": \"ASM-202605-0012\",\n      \"status\": 3,\n      \"output_inventory_id\": 1,\n      \"output_sku\": \"ha_product_test_1\",\n      \"output_name\": \"HA Product Test - 1\",\n      \"output_image_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n      \"target_location_id\": 6,\n      \"target_location_name\": \"Warehouse\",\n      \"quantity\": 5,\n      \"assigned_user_id\": 4,\n      \"assigned_user_name\": \"Warehouse Operative\",\n      \"created_at\": \"2026-05-28 09:14:02\",\n      \"updated_at\": \"2026-05-28 09:20:11\",\n      \"components_summary\": [\n        {\n          \"inventory_id\": 2,\n          \"sku\": \"component_a\",\n          \"qty_per_unit\": 2\n        },\n        {\n          \"inventory_id\": 3,\n          \"sku\": \"component_b\",\n          \"qty_per_unit\": 1\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"b285ceca-811b-41cf-b998-aece7c398732"},{"name":"Get Assembly Detail","id":"d7208726-5aef-4aa4-8a9f-7f65ef50d977","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/assemblies/{{assembly_id}}","description":"<p>Returns a single assembly with its full bill-of-materials and batch state.</p>\n<p>In addition to the list fields, the detail payload adds:</p>\n<ul>\n<li><code>components[]</code> — each resolved component with <code>accepted_barcodes[]</code> (the SKU plus item barcodes accepted when scanning), <code>qty_per_unit</code>, <code>total_required</code>, and the <code>batch_selection_required</code> / <code>batch_selection_complete</code> flags.</li>\n<li><code>movement_job_id</code> — the stock movement job created for this assembly, or <code>null</code>.</li>\n<li><code>batch_consumptions[]</code> — the batches / locations that will be consumed for batch-tracked components.</li>\n<li><code>output_batch</code> — the batch created for the finished SKU, or <code>null</code>.</li>\n<li><code>error_message</code> — populated when <code>status</code> is <code>4</code> (Error), otherwise <code>null</code>.</li>\n</ul>\n<p>Requires <strong>Warehouse Operative</strong> level or above.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["assemblies","{{assembly_id}}"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"a011d791-1a24-4f21-8824-4adbb8afcca1","name":"200 — assembly found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/assemblies/{{assembly_id}}","description":"Returns a single assembly with its full bill-of-materials and batch state.\n\nIn addition to the list fields, the detail payload adds:\n- `components[]` — each resolved component with `accepted_barcodes[]` (the SKU plus item barcodes accepted when scanning), `qty_per_unit`, `total_required`, and the `batch_selection_required` / `batch_selection_complete` flags.\n- `movement_job_id` — the stock movement job created for this assembly, or `null`.\n- `batch_consumptions[]` — the batches / locations that will be consumed for batch-tracked components.\n- `output_batch` — the batch created for the finished SKU, or `null`.\n- `error_message` — populated when `status` is `4` (Error), otherwise `null`.\n\nRequires **Warehouse Operative** level or above.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 12,\n  \"reference\": \"ASM-202605-0012\",\n  \"status\": 3,\n  \"output_inventory_id\": 1,\n  \"output_sku\": \"ha_product_test_1\",\n  \"output_name\": \"HA Product Test - 1\",\n  \"output_image_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n  \"target_location_id\": 6,\n  \"target_location_name\": \"Warehouse\",\n  \"quantity\": 5,\n  \"assigned_user_id\": 4,\n  \"assigned_user_name\": \"Warehouse Operative\",\n  \"created_at\": \"2026-05-28 09:14:02\",\n  \"updated_at\": \"2026-05-28 09:20:11\",\n  \"components_summary\": [\n    {\n      \"inventory_id\": 2,\n      \"sku\": \"component_a\",\n      \"qty_per_unit\": 2\n    },\n    {\n      \"inventory_id\": 3,\n      \"sku\": \"component_b\",\n      \"qty_per_unit\": 1\n    }\n  ],\n  \"components\": [\n    {\n      \"assembly_inventory_index_id\": 30,\n      \"inventory_id\": 2,\n      \"sku\": \"component_a\",\n      \"name\": \"Component A\",\n      \"accepted_barcodes\": [\n        \"component_a\",\n        \"5012345678900\"\n      ],\n      \"qty_per_unit\": 2,\n      \"total_required\": 10,\n      \"batch_selection_required\": true,\n      \"batch_selection_complete\": true\n    },\n    {\n      \"assembly_inventory_index_id\": 31,\n      \"inventory_id\": 3,\n      \"sku\": \"component_b\",\n      \"name\": \"Component B\",\n      \"accepted_barcodes\": [\n        \"component_b\"\n      ],\n      \"qty_per_unit\": 1,\n      \"total_required\": 5,\n      \"batch_selection_required\": false,\n      \"batch_selection_complete\": false\n    }\n  ],\n  \"movement_job_id\": 88,\n  \"batch_consumptions\": [\n    {\n      \"id\": 7,\n      \"assembly_inventory_index_id\": 30,\n      \"inventory_id\": 2,\n      \"inventory_location_batch_index_id\": 41,\n      \"batch_number\": \"B-2026-04\",\n      \"expire_date\": \"2027-01-31\",\n      \"quantity\": 10,\n      \"source_location_id\": 1\n    }\n  ],\n  \"output_batch\": {\n    \"id\": 15,\n    \"batch_number\": \"ASM-OUT-0012\",\n    \"expire_date\": \"2027-05-28\",\n    \"quantity\": 5,\n    \"is_auto_generated\": true\n  },\n  \"error_message\": null\n}"}],"_postman_id":"d7208726-5aef-4aa4-8a9f-7f65ef50d977"},{"name":"Confirm Assembly","id":"ae3a3d9b-952b-46dc-8d28-ac17c6ef645e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"quantity\": 5,\n    \"batch_selections\": {\n        \"2\": [\n            {\n                \"batch_id\": 41,\n                \"quantity\": 10,\n                \"location_id\": 1,\n                \"batch_number\": \"B-2026-04\",\n                \"expire_date\": \"2027-01-31\"\n            }\n        ]\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/assemblies/{{assembly_id}}/confirm","description":"<p>Confirms (completes) an assembly: consumes the component stock and produces the finished SKU at the target location. Returns the refreshed assembly detail.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Number of finished units to produce. Must be greater than zero.</td>\n</tr>\n<tr>\n<td><code>auto_allocate_orders</code></td>\n<td>bool</td>\n<td>no</td>\n<td>When <code>true</code>, the newly produced stock is auto-allocated to open orders. Default <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>batch_selections</code></td>\n<td>object</td>\n<td>no</td>\n<td>Batch picks for batch-tracked components, keyed by component <code>inventory_id</code>. Each value is an array of selections. Only needed for components whose detail shows <code>batch_selection_required: true</code>.</td>\n</tr>\n<tr>\n<td><code>batch_selections.{inventory_id}[].batch_id</code></td>\n<td>int</td>\n<td>yes*</td>\n<td>Inventory location batch index ID to consume from.</td>\n</tr>\n<tr>\n<td><code>batch_selections.{inventory_id}[].quantity</code></td>\n<td>int</td>\n<td>yes*</td>\n<td>Quantity to take from this batch.</td>\n</tr>\n<tr>\n<td><code>batch_selections.{inventory_id}[].location_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Source location. Falls back to the batch's own location, then the assembly target location.</td>\n</tr>\n<tr>\n<td><code>batch_selections.{inventory_id}[].batch_number</code></td>\n<td>string</td>\n<td>no</td>\n<td>Looked up from <code>batch_id</code> when omitted.</td>\n</tr>\n<tr>\n<td><code>batch_selections.{inventory_id}[].expire_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>Looked up from <code>batch_id</code> when omitted.</td>\n</tr>\n</tbody>\n</table>\n</div><p>* Required only within a <code>batch_selections</code> entry.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li><code>quantity</code> must be greater than zero.</li>\n<li>Batch selections must cover the required quantity for every batch-tracked component.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The full assembly detail (same shape as <strong>Get Assembly Detail</strong>) reflecting the post-confirm state (<code>status</code> <code>5</code> — Completed).</p>\n<p>Requires <strong>Warehouse Operative</strong> level or above.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["assemblies","{{assembly_id}}","confirm"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b4f8bb17-7d04-4e04-ad33-650cc53fbb2c","name":"200 — assembly confirmed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"quantity\": 5,\n    \"batch_selections\": {\n        \"2\": [\n            {\n                \"batch_id\": 41,\n                \"quantity\": 10,\n                \"location_id\": 1,\n                \"batch_number\": \"B-2026-04\",\n                \"expire_date\": \"2027-01-31\"\n            }\n        ]\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/assemblies/{{assembly_id}}/confirm","description":"Confirms (completes) an assembly: consumes the component stock and produces the finished SKU at the target location. Returns the refreshed assembly detail.\n\n### Body fields\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `quantity` | int | yes | Number of finished units to produce. Must be greater than zero. |\n| `auto_allocate_orders` | bool | no | When `true`, the newly produced stock is auto-allocated to open orders. Default `false`. |\n| `batch_selections` | object | no | Batch picks for batch-tracked components, keyed by component `inventory_id`. Each value is an array of selections. Only needed for components whose detail shows `batch_selection_required: true`. |\n| `batch_selections.{inventory_id}[].batch_id` | int | yes\\* | Inventory location batch index ID to consume from. |\n| `batch_selections.{inventory_id}[].quantity` | int | yes\\* | Quantity to take from this batch. |\n| `batch_selections.{inventory_id}[].location_id` | int | no | Source location. Falls back to the batch's own location, then the assembly target location. |\n| `batch_selections.{inventory_id}[].batch_number` | string | no | Looked up from `batch_id` when omitted. |\n| `batch_selections.{inventory_id}[].expire_date` | string | no | Looked up from `batch_id` when omitted. |\n\n\\* Required only within a `batch_selections` entry.\n\n### Constraints\n- `quantity` must be greater than zero.\n- Batch selections must cover the required quantity for every batch-tracked component.\n\n### Response\nThe full assembly detail (same shape as **Get Assembly Detail**) reflecting the post-confirm state (`status` `5` — Completed).\n\nRequires **Warehouse Operative** level or above.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 12,\n  \"reference\": \"ASM-202605-0012\",\n  \"status\": 5,\n  \"output_inventory_id\": 1,\n  \"output_sku\": \"ha_product_test_1\",\n  \"output_name\": \"HA Product Test - 1\",\n  \"output_image_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n  \"target_location_id\": 6,\n  \"target_location_name\": \"Warehouse\",\n  \"quantity\": 5,\n  \"assigned_user_id\": 4,\n  \"assigned_user_name\": \"Warehouse Operative\",\n  \"created_at\": \"2026-05-28 09:14:02\",\n  \"updated_at\": \"2026-05-28 09:25:44\",\n  \"components_summary\": [\n    {\n      \"inventory_id\": 2,\n      \"sku\": \"component_a\",\n      \"qty_per_unit\": 2\n    },\n    {\n      \"inventory_id\": 3,\n      \"sku\": \"component_b\",\n      \"qty_per_unit\": 1\n    }\n  ],\n  \"components\": [\n    {\n      \"assembly_inventory_index_id\": 30,\n      \"inventory_id\": 2,\n      \"sku\": \"component_a\",\n      \"name\": \"Component A\",\n      \"accepted_barcodes\": [\n        \"component_a\",\n        \"5012345678900\"\n      ],\n      \"qty_per_unit\": 2,\n      \"total_required\": 10,\n      \"batch_selection_required\": true,\n      \"batch_selection_complete\": true\n    },\n    {\n      \"assembly_inventory_index_id\": 31,\n      \"inventory_id\": 3,\n      \"sku\": \"component_b\",\n      \"name\": \"Component B\",\n      \"accepted_barcodes\": [\n        \"component_b\"\n      ],\n      \"qty_per_unit\": 1,\n      \"total_required\": 5,\n      \"batch_selection_required\": false,\n      \"batch_selection_complete\": true\n    }\n  ],\n  \"movement_job_id\": 88,\n  \"batch_consumptions\": [\n    {\n      \"id\": 7,\n      \"assembly_inventory_index_id\": 30,\n      \"inventory_id\": 2,\n      \"inventory_location_batch_index_id\": 41,\n      \"batch_number\": \"B-2026-04\",\n      \"expire_date\": \"2027-01-31\",\n      \"quantity\": 10,\n      \"source_location_id\": 1\n    }\n  ],\n  \"output_batch\": {\n    \"id\": 15,\n    \"batch_number\": \"ASM-OUT-0012\",\n    \"expire_date\": \"2027-05-28\",\n    \"quantity\": 5,\n    \"is_auto_generated\": true\n  },\n  \"error_message\": null\n}"}],"_postman_id":"ae3a3d9b-952b-46dc-8d28-ac17c6ef645e"},{"name":"Cancel Assembly","id":"ac9eca57-8d70-4c72-abd7-0cc3a4e02ef7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/assemblies/{{assembly_id}}/cancel","description":"<p>Cancels an in-progress assembly, reversing any interim stock movement and setting the status to <strong>Cancelled</strong> (<code>6</code>). No request body.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"SUCCESS\",\n  \"assembly_id\": &lt;int&gt;,\n  \"status_code\": 6\n}\n</code></pre><p>Requires <strong>Supervisor</strong> level or above.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["assemblies","{{assembly_id}}","cancel"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"a185d174-0d52-4045-959d-b5b45446e79f","name":"200 — assembly cancelled","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/assemblies/{{assembly_id}}/cancel","description":"Cancels an in-progress assembly, reversing any interim stock movement and setting the status to **Cancelled** (`6`). No request body.\n\n### Response\n```\n{\n  \"status\": \"SUCCESS\",\n  \"assembly_id\": <int>,\n  \"status_code\": 6\n}\n```\n\nRequires **Supervisor** level or above.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"SUCCESS\",\n  \"assembly_id\": 12,\n  \"status_code\": 6\n}"}],"_postman_id":"ac9eca57-8d70-4c72-abd7-0cc3a4e02ef7"},{"name":"Reverse Assembly","id":"baff8383-0f8a-47c6-a6d6-7394a90df59c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"quantity\": 2,\n    \"source_location_id\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//reverse-assembly","description":"<p>Reverses a previously completed assembly for a finished inventory item: deducts the finished SKU at the source location and returns the component stock back to that same location, based on the item's active bill-of-materials (inventory-to-inventory) links.</p>\n<p>Note the path is under <code>/inventory/{inventory_id}</code> — it operates on the finished inventory item, not on an assembly record.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Number of finished units to reverse. Must be greater than zero.</td>\n</tr>\n<tr>\n<td><code>source_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Location holding the finished stock; the components are returned here.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The inventory item must have active BOM links.</li>\n<li>Sufficient finished-SKU stock must exist at <code>source_location_id</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"SUCCESS\",\n  \"inventory_id\": &lt;int&gt;,\n  \"quantity_reversed\": &lt;int&gt;,\n  \"components_returned\": [\n    { \"inventory_id\": &lt;int&gt;, \"sku\": \"...\", \"quantity\": &lt;int&gt; }\n  ]\n}\n</code></pre><p>Requires <strong>Supervisor</strong> level or above.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","reverse-assembly"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"77de6206-1408-4ca9-9507-bd76ae4757c1","name":"200 — assembly reversed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"quantity\": 2,\n    \"source_location_id\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//reverse-assembly","description":"Reverses a previously completed assembly for a finished inventory item: deducts the finished SKU at the source location and returns the component stock back to that same location, based on the item's active bill-of-materials (inventory-to-inventory) links.\n\nNote the path is under `/inventory/{inventory_id}` — it operates on the finished inventory item, not on an assembly record.\n\n### Body fields\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `quantity` | int | yes | Number of finished units to reverse. Must be greater than zero. |\n| `source_location_id` | int | yes | Location holding the finished stock; the components are returned here. |\n\n### Constraints\n- The inventory item must have active BOM links.\n- Sufficient finished-SKU stock must exist at `source_location_id`.\n\n### Response\n```\n{\n  \"status\": \"SUCCESS\",\n  \"inventory_id\": <int>,\n  \"quantity_reversed\": <int>,\n  \"components_returned\": [\n    { \"inventory_id\": <int>, \"sku\": \"...\", \"quantity\": <int> }\n  ]\n}\n```\n\nRequires **Supervisor** level or above.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"SUCCESS\",\n  \"inventory_id\": 1,\n  \"quantity_reversed\": 2,\n  \"components_returned\": [\n    {\n      \"inventory_id\": 2,\n      \"sku\": \"component_a\",\n      \"quantity\": 4\n    },\n    {\n      \"inventory_id\": 3,\n      \"sku\": \"component_b\",\n      \"quantity\": 2\n    }\n  ]\n}"}],"_postman_id":"baff8383-0f8a-47c6-a6d6-7394a90df59c"}],"id":"fbd7c10e-e450-4ca7-a88f-54dbc24e5b8c","description":"<p>Assembly (kit / formula build) endpoints. An <strong>assembly</strong> consumes component stock per a product's bill-of-materials links and produces a finished SKU at a target location.</p>\n<p>Listing, viewing and confirming are available to <strong>Warehouse Operative</strong> level and above (the scan-led operator workflow). Cancelling and reversing are <strong>Supervisor</strong>-only decisions.</p>\n<p>Set the <code>assembly_id</code> collection variable before calling the detail / confirm / cancel requests. <strong>Reverse Assembly</strong> is keyed on the finished item and uses <code>inventory_id</code> instead.</p>\n","_postman_id":"fbd7c10e-e450-4ca7-a88f-54dbc24e5b8c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"List Inventory","id":"97196286-777c-4661-a4e8-f997e07bca8b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory?page=1&per_page=20","description":"<p>Returns a paginated list of inventory items with their per-location stock figures embedded.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Build a SKU lookup table for an order-creation UI.</li>\n<li>Sync product data into a marketplace or analytics tool.</li>\n<li>Find items below their stock-warn level (combine with <code>sort=stockwarn_hl</code>).</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users only see their own SKUs.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting).</p>\n<h3 id=\"sort-options\">Sort options</h3>\n<p><code>name_az</code> / <code>_za</code>, <code>sku_az</code> / <code>_za</code>, <code>stock_level_available_hl</code> / <code>_lh</code>, <code>stock_level_open_hl</code> / <code>_lh</code>, <code>stockwarn_hl</code> / <code>_lh</code>, <code>syncstock_yn</code> / <code>_ny</code>, <code>productweight_hl</code> / <code>_lh</code>, <code>updated_at_pr</code> / <code>_rp</code>. <code>_hl</code> = high→low, <code>_lh</code> = low→high, <code>_pr</code> = past→recent (ASC), <code>_rp</code> = recent→past (DESC), <code>_yn</code> = enabled→disabled.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[sku]</code></td>\n<td>string or array</td>\n<td>Exact SKU match (one or several).</td>\n</tr>\n<tr>\n<td><code>filters[multiple_sku]</code></td>\n<td>string</td>\n<td>Several exact SKUs in one value separated by `</td>\n</tr>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on name, SKU or any of the five barcodes. Use `</td>\n</tr>\n<tr>\n<td><code>filters[product_type]</code></td>\n<td>int</td>\n<td>Single inventory <code>type</code> (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[product_types][]</code></td>\n<td>int</td>\n<td>Several inventory types.</td>\n</tr>\n<tr>\n<td><code>filters[location][]</code></td>\n<td>int</td>\n<td>Only items with a stock record at these location IDs.</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_clients][]</code></td>\n<td>int</td>\n<td>Only items belonging to these fulfilment clients. Items of archived clients are hidden unless their client is named here.</td>\n</tr>\n<tr>\n<td><code>filters[ghost_asset][]</code></td>\n<td>int</td>\n<td><code>1</code> = items that have never held stock, <code>0</code> = items that have.</td>\n</tr>\n<tr>\n<td><code>filters[show_archived]</code></td>\n<td>bool</td>\n<td><code>1</code> / <code>true</code> / <code>yes</code> returns live and archived products together.</td>\n</tr>\n<tr>\n<td><code>filters[archived_only]</code></td>\n<td>bool</td>\n<td><code>1</code> / <code>true</code> / <code>yes</code> returns archived products only.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"archived-products\">Archived products</h3>\n<p>Archived products are left out of this list unless you send <code>filters[show_archived]=1</code> (live and archived together) or <code>filters[archived_only]=1</code> (archived only). Both accept <code>1</code>, <code>true</code>, <code>yes</code>, <code>y</code> or <code>on</code>; <code>0</code>, <code>false</code> or an empty value has no effect. The array form (<code>filters[show_archived][]=1</code>) is also accepted. The archive filters combine with every other filter, so <code>filters[sku]</code> for an archived SKU returns nothing unless one of them is sent. Every item carries <code>is_archived</code> (<code>0</code> or <code>1</code>) so the two can be told apart. <strong>Get Inventory Detail</strong> returns an archived product without any extra filter.</p>\n<p>Default sort is newest first (<code>created_at</code> descending). <code>per_page</code> is capped at <code>1000</code>.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is the full inventory record with:</p>\n<ul>\n<li><code>locations[]</code> — every warehouse location the SKU is stocked at, with <code>stock_level</code>, <code>stock_level_available</code>, etc.</li>\n<li><code>image</code> / <code>images[]</code> — thumbnail and gallery URLs.</li>\n<li><code>accounting_options[]</code> — assigned accounting codes, if any.</li>\n<li><code>custom_fields</code> — object.</li>\n<li><code>is_archived</code> — <code>0</code> for a live product, <code>1</code> for an archived one.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Records per page. Default is the tenant's <em>Items per page</em> setting.</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code> | <code>sku_az</code> | <code>sku_za</code> | <code>stock_level_available_hl</code> | <code>stock_level_available_lh</code> | <code>stock_level_open_hl</code> | <code>stock_level_open_lh</code> | <code>stockwarn_hl</code> | <code>stockwarn_lh</code> | <code>syncstock_yn</code> | <code>syncstock_ny</code> | <code>productweight_hl</code> | <code>productweight_lh</code> | <code>updated_at_pr</code> | <code>updated_at_rp</code>. Default: <code>updated_at</code> descending.</p>\n","type":"text/plain"},"key":"sort","value":"updated_at_rp"},{"disabled":true,"description":{"content":"<p>LIKE-search on name, SKU, and the five barcode fields. Use a single pipe <code>|</code> between terms to OR them.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Exact-match SKU. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[sku][]","value":""},{"disabled":true,"description":{"content":"<p>Bulk SKU filter using a <em>literal <code>||</code> separator inside the value</em>. Useful when the SKU list is too long for the array-bracket form.</p>\n","type":"text/plain"},"key":"filters[multiple_sku]","value":"SKU-A||SKU-B||SKU-C"},{"disabled":true,"description":{"content":"<p>Single inventory <code>type</code> ID. See folder description for values.</p>\n","type":"text/plain"},"key":"filters[product_type]","value":"1"},{"disabled":true,"description":{"content":"<p>Multi-value version of <code>product_type</code>. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[product_types][]","value":"1"},{"disabled":true,"description":{"content":"<p>Warehouse location ID. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[location][]","value":"1"},{"disabled":true,"description":{"content":"<p>Fulfilment client ID. Send multiple times for OR. Visible to back-office users only.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients][]","value":""},{"disabled":true,"description":{"content":"<p>Filter by ghost-asset flag (<code>0</code> = real, <code>1</code> = ghost). Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[ghost_asset][]","value":"0"},{"disabled":true,"description":{"content":"<p><code>1</code> to include archived products alongside live ones. By default archived products are excluded.</p>\n","type":"text/plain"},"key":"filters[show_archived]","value":"1"},{"disabled":true,"description":{"content":"<p><code>1</code> to return archived products only.</p>\n","type":"text/plain"},"key":"filters[archived_only]","value":"1"}],"variable":[]}},"response":[{"id":"9e2af09f-0197-4eb1-9e61-9ebba0fda2e7","name":"200 — page of inventory","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/inventory?per_page=2","host":["https://your-company.myhelm.app/public-api"],"path":["inventory"],"query":[{"key":"per_page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 742,\n    \"per_page\": \"2\",\n    \"current_page\": 1,\n    \"last_page\": 371,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/inventory?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 2,\n    \"data\": [\n        {\n            \"id\": \"594\",\n            \"type\": \"1\",\n            \"batching_type\": \"0\",\n            \"sku\": \"PLUGIN-TEST-SKU-0587\",\n            \"name\": \"Plugin Test 587\",\n            \"unit_price\": \"10.0000\",\n            \"product_weight\": \"2.000\",\n            \"stock_level\": \"10000000\",\n            \"stock_level_available\": \"10000000\",\n            \"stock_warn_level\": \"0\",\n            \"locations\": [\n                {\n                    \"id\": 611,\n                    \"location_name\": \"Default\",\n                    \"warehouse_id\": 6,\n                    \"location_id\": 1,\n                    \"stock_level\": 10000000,\n                    \"stock_level_available\": 10000000\n                }\n            ],\n            \"images\": [],\n            \"accounting_options\": []\n        }\n    ]\n}"},{"id":"f4e9e9e9-46d0-4520-b61b-b994a9dd0b70","name":"200 — archived products only","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/inventory?per_page=1&filters[archived_only]=1","host":["https://your-company.myhelm.app/public-api"],"path":["inventory"],"query":[{"key":"per_page","value":"1"},{"key":"filters[archived_only]","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 1,\n    \"per_page\": 1,\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"next_page_url\": null,\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 1,\n    \"data\": [\n        {\n            \"id\": 612,\n            \"legacy_id\": null,\n            \"type\": 1,\n            \"batching_type\": 0,\n            \"is_serial_numbered\": 0,\n            \"service_id\": null,\n            \"dropshipping_type\": 0,\n            \"sync_stock\": 1,\n            \"include_component_stock_level\": 0,\n            \"fulfilment_client_id\": 3,\n            \"sku\": \"BOX-RETIRED-01\",\n            \"secondary_sku\": \"\",\n            \"sku_hash\": \"5f0c2a8e4b7d1c93a6e2f4b8d0c17e55\",\n            \"vendor_sku\": null,\n            \"chapi_id\": \"8b3e6f2a-41c7-4d9e-a2b5-6c0f9e1d7a34\",\n            \"stock_level\": 0,\n            \"stock_level_open\": 0,\n            \"stock_level_global_available\": 0,\n            \"stock_level_available\": 0,\n            \"stock_warn_level\": 0,\n            \"item_barcode\": null,\n            \"item_barcode_2\": null,\n            \"item_barcode_3\": null,\n            \"item_barcode_4\": null,\n            \"item_barcode_5\": null,\n            \"thumbnail_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n            \"single_parcel_per_item\": 0,\n            \"name\": \"Gift Box (retired)\",\n            \"product_weight\": \"2.000\",\n            \"product_height\": \"1.0\",\n            \"product_width\": \"1.0\",\n            \"product_length\": \"1.0\",\n            \"product_box_type\": 1,\n            \"product_box_quantity\": 1,\n            \"picking_by_packaging\": 0,\n            \"default_packaging_id\": 0,\n            \"description\": null,\n            \"country_of_origin\": \"GB\",\n            \"hs_code\": null,\n            \"customs_description\": null,\n            \"unit_price\": \"0.0000\",\n            \"cost_price\": null,\n            \"shipping_service_id\": 0,\n            \"zone\": \"\",\n            \"multiplier\": 1,\n            \"include_po_stock\": 0,\n            \"custom_fields\": {},\n            \"dynamic_components_type\": 0,\n            \"is_archived\": 1,\n            \"archived_sync_stock\": null,\n            \"temp_image_url\": null,\n            \"ghost_asset\": 0,\n            \"master_dropshipping\": 0,\n            \"include_po_level\": 0,\n            \"fabric_content\": null,\n            \"low_stock_email_sent_time\": 0,\n            \"vat_rate_percentage\": \"20.0000\",\n            \"stock_update_scheduled_at\": null,\n            \"created_at\": \"2026-02-27 13:46:27\",\n            \"updated_at\": \"2026-09-30 10:15:02\",\n            \"dont_sync_until\": null,\n            \"assembly_notes\": null,\n            \"customs_value\": null,\n            \"mid_id\": null,\n            \"cpsc_certifier_id\": null,\n            \"locations\": [],\n            \"image\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n            \"images\": [],\n            \"supplier_links\": [],\n            \"accounting_options\": []\n        }\n    ]\n}"}],"_postman_id":"97196286-777c-4661-a4e8-f997e07bca8b"},{"name":"Get Inventory Detail","id":"18338d2b-33ce-4095-b901-fe93fdfc9185","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory/","description":"<p>Returns the full record for a single inventory item, including every location's stock figures, suppliers, batches/serials, package configurations, inventory links, and assigned categories.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — internal inventory ID.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>Full inventory record. The shape mirrors <strong>List Inventory</strong> plus deeper relations (suppliers, links, batches if applicable). <code>manufacturer_id</code> and <code>manufacturer</code> (the full manufacturer record, same shape as <strong>Get Manufacturer Detail</strong>) are included; both are <code>null</code> when the item has no manufacturer. Returns <code>404</code> if the inventory doesn't exist or has been deleted.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"741caadf-2532-4edd-9d53-15a80d97c053","name":"200 — inventory detail","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory/1"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 1,\n    \"type\": 1,\n    \"batching_type\": 0,\n    \"is_serial_numbered\": 0,\n    \"sku\": \"ha_product_test_1\",\n    \"name\": \"HA Product Test - 1\",\n    \"item_barcode\": \"1234567898765\",\n    \"unit_price\": \"1.0000\",\n    \"product_weight\": \"1.000\",\n    \"hs_code\": \"HSTest1\",\n    \"country_of_origin\": \"GB\",\n    \"stock_level\": 10091,\n    \"stock_level_open\": 415,\n    \"stock_level_available\": 9685,\n    \"stock_warn_level\": 0,\n    \"vat_rate_percentage\": \"20.0000\",\n    \"locations\": [\n        {\n            \"id\": 1,\n            \"location_name\": \"Default\",\n            \"warehouse_id\": 6,\n            \"location_id\": 1,\n            \"stock_level\": 9888,\n            \"stock_level_available\": 9515\n        },\n        {\n            \"id\": 7,\n            \"location_name\": \"A-101-200\",\n            \"warehouse_id\": 6,\n            \"location_id\": 12,\n            \"stock_level\": 0\n        }\n    ],\n    \"custom_fields\": {},\n    \"accounting_options\": []\n}"}],"_postman_id":"18338d2b-33ce-4095-b901-fe93fdfc9185"},{"name":"Create Inventory Item","id":"753b7b4f-db29-45ab-af20-ca351973f924","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    // ----- Identity -----\n    \"name\":               \"Example Product\",   // REQUIRED\n    \"sku\":                \"EXAMPLE-001\",       // SKU code; validated against tenant SKU rules\n    \"secondary_sku\":      \"\",\n\n    // ----- Type & batching -----\n    \"type\":               1,                    // 1=Inventory, 2=Component, 3=Group, 4=Packaging, 5=Auxiliary Packaging\n    \"batching_type\":      0,                    // 0=No batching, 1=Serial Number, 2=Batch Number. Forced to 0 if type=3 (Group)\n    \"is_serial_numbered\": 0,                    // bool; forced to 0 unless type=3\n\n    // ----- Pricing -----\n    \"cost_price\":         5.00,                 // default 0\n    \"unit_price\":         9.99,                 // default 0\n\n    // ----- Descriptions -----\n    \"description\":         \"Optional product description\",\n    \"customs_description\": \"\",\n    \"customs_value\":       \"\",\n    \"mid_id\":              \"\",                  // manufacturer ID (US customs)\n    \"cpsc_certifier_id\":   \"\",                  // CPSC certifier ID, max 128 characters\n    \"manufacturer_sku\":    \"\",                  // manufacturer's own code, max 128 characters\n    \"cpsc_product_version\":          \"\",       // max 128 characters\n    \"cpsc_registry_product_id\":      \"\",       // CPSC registry product ID (certificate reference)\n    \"cpsc_intended_use_code\":        \"\",       // max 128 characters\n    \"cpsc_intended_use_description\": \"\",       // max 255 characters\n    \"cpsc_disclaim_code\":            \"\",       // for products that do not need a certificate\n    \"cpsc_disclaim_reason\":          \"\",       // max 255 characters\n    \"manufacturer_id\":     null,                // inventory manufacturer ID, null for none\n\n    // ----- Barcodes (5 slots) -----\n    \"item_barcode\":   \"5012345678901\",\n    \"item_barcode_2\": \"\",\n    // \"item_barcode_3\": \"\",  \"item_barcode_4\": \"\",  \"item_barcode_5\": \"\",\n\n    // ----- Dimensions (defaults from tenant settings if omitted) -----\n    \"product_weight\": 0.5,\n    \"product_height\": 5,\n    \"product_width\":  10,\n    \"product_length\": 15,\n\n    // ----- Customs -----\n    \"hs_code\":            \"\",                  // single HS/tariff code\n    \"country_of_origin\":  \"GB\",                // ISO country code\n    \"hs_codes\":           [],                  // array of country-specific codes: [{ iso, hs_code }]\n\n    // ----- Other -----\n    \"zone\":                 \"\",\n    \"default_packaging_id\": 0,                  // must reference a Packaging (type 4) inventory or be 0\n    \"dropshipping_type\":    0,\n    \"include_po_level\":     0,\n\n    \"custom_fields\":        {},                 // validated against inventory custom-field schema\n    \"images\":               []                  // array of image URLs to download and attach\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory/create","description":"<p>Creates a new inventory item (SKU). Stock at locations is added separately via <strong>Stock Locations → Create Inventory Location</strong> (or via batches).</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users have <code>fulfilment_client_id</code> auto-set to their own client.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>SKU code. Validated against the tenant's SKU format rules.</td>\n</tr>\n<tr>\n<td><code>secondary_sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>Alternate SKU code.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Inventory type — see folder description.</td>\n</tr>\n<tr>\n<td><code>batching_type</code></td>\n<td>int</td>\n<td>no</td>\n<td><code>0</code> = none, <code>1</code> = serial, <code>2</code> = batch. Forced to <code>0</code> if <code>type == 3</code> (Group).</td>\n</tr>\n<tr>\n<td><code>is_serial_numbered</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. Forced to <code>0</code> if not type Group.</td>\n</tr>\n<tr>\n<td><code>cost_price</code> / <code>unit_price</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>zone</code></td>\n<td>string</td>\n<td>no</td>\n<td>Warehouse zone identifier.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text description.</td>\n</tr>\n<tr>\n<td><code>customs_description</code> / <code>customs_value</code></td>\n<td>string</td>\n<td>no</td>\n<td>Customs metadata.</td>\n</tr>\n<tr>\n<td><code>mid_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Manufacturer identification (MID) code, used on US customs declarations.</td>\n</tr>\n<tr>\n<td><code>cpsc_certifier_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>CPSC certifier ID for US consumer-product compliance, up to 128 characters. Passed to the courier with the item on shipments that support it.</td>\n</tr>\n<tr>\n<td><code>manufacturer_sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>The manufacturer's own code for the item, up to 128 characters. Passed to the courier with the item on shipments that support it.</td>\n</tr>\n<tr>\n<td><code>cpsc_product_version</code></td>\n<td>string</td>\n<td>no</td>\n<td>CPSC product version, up to 128 characters.</td>\n</tr>\n<tr>\n<td><code>cpsc_registry_product_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Product ID in the CPSC product registry (the certificate reference), up to 128 characters.</td>\n</tr>\n<tr>\n<td><code>cpsc_intended_use_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>CPSC intended-use code, up to 128 characters.</td>\n</tr>\n<tr>\n<td><code>cpsc_intended_use_description</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text description of the intended use, up to 255 characters.</td>\n</tr>\n<tr>\n<td><code>cpsc_disclaim_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>CPSC disclaim code, for products that do not need a certificate. Up to 128 characters.</td>\n</tr>\n<tr>\n<td><code>cpsc_disclaim_reason</code></td>\n<td>string</td>\n<td>no</td>\n<td>Reason for the disclaim, up to 255 characters.</td>\n</tr>\n<tr>\n<td><code>manufacturer_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>ID of an inventory manufacturer (see <strong>Inventory Manufacturers</strong>). Its address is passed to the courier as the item's manufacturer address; without one the primary supplier's address is used. The manufacturer must belong to the same account as the item (the same fulfilment client, or the warehouse itself for items with no fulfilment client), otherwise <code>422</code> <code>Manufacturer (ID: &lt;id&gt;) cannot be found for this inventory item's account.</code></td>\n</tr>\n<tr>\n<td><code>item_barcode</code> / <code>item_barcode_2</code> … <code>_5</code></td>\n<td>string</td>\n<td>no</td>\n<td>Up to five barcodes.</td>\n</tr>\n<tr>\n<td><code>product_weight</code> / <code>product_height</code> / <code>product_width</code> / <code>product_length</code></td>\n<td>number</td>\n<td>no</td>\n<td>Defaults inherited from tenant settings.</td>\n</tr>\n<tr>\n<td><code>hs_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>Single HS/tariff code.</td>\n</tr>\n<tr>\n<td><code>hs_codes</code></td>\n<td>array</td>\n<td>no</td>\n<td>Country-specific HS codes — array of <code>{ iso, hs_code }</code>.</td>\n</tr>\n<tr>\n<td><code>country_of_origin</code></td>\n<td>string</td>\n<td>no</td>\n<td>ISO country code.</td>\n</tr>\n<tr>\n<td><code>default_packaging_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Inventory ID of the packaging item to use by default. Cannot be a Group/Packaging/Auxiliary item.</td>\n</tr>\n<tr>\n<td><code>dropshipping_type</code></td>\n<td>int</td>\n<td>no</td>\n<td>Dropshipping mode.</td>\n</tr>\n<tr>\n<td><code>service_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Courier service ID for shipping configuration.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Auto-set if the API user is a fulfilment-client user.</td>\n</tr>\n<tr>\n<td><code>include_po_level</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Include PO-level cost in calculations.</td>\n</tr>\n<tr>\n<td><code>fabric_content</code></td>\n<td>string</td>\n<td>no</td>\n<td>Optional fabric metadata.</td>\n</tr>\n<tr>\n<td><code>accounting_options</code></td>\n<td>object</td>\n<td>no</td>\n<td>Validated/upserted via the accounting subsystem.</td>\n</tr>\n<tr>\n<td><code>custom_fields</code></td>\n<td>object</td>\n<td>no</td>\n<td>Validated against the inventory custom-field schema.</td>\n</tr>\n<tr>\n<td><code>images</code></td>\n<td>array of strings</td>\n<td>no</td>\n<td>Image URLs to download and attach.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li><code>mid_id</code>, <code>manufacturer_sku</code> and the <code>cpsc_*</code> fields are saved with leading and trailing spaces removed. A blank value (<code>null</code>, <code>\"\"</code> or only spaces) is saved as empty and returned as <code>null</code>. All of them are sent to the courier with the item when filled in, on shipments that support them.</li>\n<li>Setting <code>type = 3</code> (Group) and <code>batching_type</code> together is not allowed — <code>batching_type</code> is forced to <code>0</code> and <code>is_serial_numbered</code> to <code>0</code>.</li>\n<li><code>default_packaging_id</code>, if set, must reference a valid <code>Packaging</code> (type 4) inventory item; otherwise it's reset to <code>0</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The full created inventory record (same shape as <strong>Get Inventory Detail</strong>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"bf2c2be1-b9b2-40cc-b5ec-5bef2e8c4e88","name":"200 — created","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"name\":\"API Test Product\",\"sku\":\"API-TEST-001\",\"type\":1,\"unit_price\":9.99,\"cost_price\":5.00,\"product_weight\":0.5,\"country_of_origin\":\"GB\",\"item_barcode\":\"5012345678901\"}"},"url":"https://your-company.myhelm.app/public-api/inventory/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 744,\n    \"type\": 1,\n    \"batching_type\": 0,\n    \"is_serial_numbered\": 0,\n    \"sku\": \"API-TEST-001\",\n    \"sku_hash\": \"111737164e1baae0654fb56c888944c5\",\n    \"vendor_sku\": null,\n    \"stock_level\": 0,\n    \"stock_level_open\": 0,\n    \"stock_level_global_available\": 0,\n    \"stock_level_available\": 0,\n    \"stock_warn_level\": 0,\n    \"item_barcode\": \"5012345678901\",\n    \"name\": \"API Test Product\",\n    \"product_weight\": \"0.500\",\n    \"product_height\": \"5.0\",\n    \"product_width\": \"10.0\",\n    \"product_length\": \"15.0\",\n    \"product_box_type\": 5,\n    \"product_box_quantity\": 1,\n    \"default_packaging_id\": 0,\n    \"description\": \"Created via API for testing\",\n    \"country_of_origin\": \"GB\",\n    \"hs_code\": \"\",\n    \"unit_price\": \"9.9900\",\n    \"cost_price\": \"5.0000\",\n    \"shipping_service_id\": 0,\n    \"vat_rate_percentage\": \"20.0000\",\n    \"custom_fields\": {},\n    \"is_archived\": 0,\n    \"created_at\": \"2026-04-30 11:50:19\",\n    \"updated_at\": \"2026-04-30 11:50:19\",\n    \"accounting_options\": [],\n    \"images\": [],\n    \"hs_codes\": []\n}"}],"_postman_id":"753b7b4f-db29-45ab-af20-ca351973f924"},{"name":"Update Inventory Item","id":"8ad9bab7-e12d-4f72-8dd7-d71adc3d43a4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Updated name\",\n    \"unit_price\": 12.99,\n    \"cost_price\": 6.00,\n    \"description\": \"Updated description\",\n    \"product_weight\": 0.6,\n    \"hs_code\": \"\",\n    \"country_of_origin\": \"GB\",\n    \"stock_warn_level\": 10,\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update","description":"<p>Updates editable fields on an existing inventory item. Send only the fields you want to change.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>All optional. Mostly the same set as <strong>Create Inventory Item</strong>, plus:</p>\n<ul>\n<li><code>stock_warn_level</code> — global low-stock threshold for this SKU.</li>\n<li><code>manufacturer_id</code> - links the item to an inventory manufacturer of the same account. Send <code>0</code> to remove the link. An ID from another account returns <code>422</code>.</li>\n</ul>\n<h3 id=\"clearing-customs-and-cpsc-values\">Clearing customs and CPSC values</h3>\n<p><code>mid_id</code>, <code>cpsc_certifier_id</code>, <code>manufacturer_sku</code>, <code>cpsc_product_version</code>, <code>cpsc_registry_product_id</code>, <code>cpsc_intended_use_code</code>, <code>cpsc_intended_use_description</code>, <code>cpsc_disclaim_code</code> and <code>cpsc_disclaim_reason</code> follow these rules:</p>\n<ul>\n<li>Leave a field out of the body to keep its current value.</li>\n<li>Send <code>null</code>, <code>\"\"</code> or a value made only of spaces to clear it. A cleared field comes back as <code>null</code>.</li>\n<li>Any other value is saved with leading and trailing spaces removed.</li>\n<li>Each field takes a single text value. An array or object returns <code>422</code> with <code>&lt;field&gt; must be a single value</code>, and nothing on the item is changed.</li>\n</ul>\n<p>Each field is cleared on its own, so one request can remove the certificate references and set a disclaim code, or remove the disclaim code and set the certificate references. See the <strong>Clear CPSC certificate, set disclaim code</strong> example.</p>\n<h3 id=\"important-constraints\">Important constraints</h3>\n<ul>\n<li><code>type</code> cannot be changed if the item has any active stock or location records — <code>422</code> with \"The inventory type field cannot be changed.\".</li>\n<li><code>batching_type</code> cannot be changed for Group items — <code>422</code> with \"Batching type cannot be changed for group products.\".</li>\n<li>Changing <code>batching_type</code> or <code>is_serial_numbered</code> while the item has active stock returns <code>422</code> with \"Cannot process this request due to active stock/locations. To proceed all stock and and locations must be removed.\".</li>\n<li>Custom-field values are validated against the tenant's inventory custom-field schema.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated inventory record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"639e4288-db45-42c6-a308-e0a23de600fb","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Updated name\",\n    \"unit_price\": 12.99,\n    \"cost_price\": 6.00,\n    \"description\": \"Updated description\",\n    \"product_weight\": 0.6,\n    \"hs_code\": \"\",\n    \"country_of_origin\": \"GB\",\n    \"stock_warn_level\": 10,\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update","description":"Updates editable fields on an existing inventory item. Send only the fields you want to change.\n\n### Body fields\nAll optional. Mostly the same set as **Create Inventory Item**, plus:\n- `stock_warn_level` — global low-stock threshold for this SKU.\n- `manufacturer_id` - links the item to an inventory manufacturer of the same account. Send `0` to remove the link. An ID from another account returns `422`.\n\n### Clearing customs and CPSC values\n`mid_id`, `cpsc_certifier_id`, `manufacturer_sku`, `cpsc_product_version`, `cpsc_registry_product_id`, `cpsc_intended_use_code`, `cpsc_intended_use_description`, `cpsc_disclaim_code` and `cpsc_disclaim_reason` follow these rules:\n- Leave a field out of the body to keep its current value.\n- Send `null`, `\"\"` or a value made only of spaces to clear it. A cleared field comes back as `null`.\n- Any other value is saved with leading and trailing spaces removed.\n- Each field takes a single text value. An array or object returns `422` with `<field> must be a single value`, and nothing on the item is changed.\n\nEach field is cleared on its own, so one request can remove the certificate references and set a disclaim code, or remove the disclaim code and set the certificate references. See the **Clear CPSC certificate, set disclaim code** example.\n\n### Important constraints\n- `type` cannot be changed if the item has any active stock or location records — `422` with \"The inventory type field cannot be changed.\".\n- `batching_type` cannot be changed for Group items — `422` with \"Batching type cannot be changed for group products.\".\n- Changing `batching_type` or `is_serial_numbered` while the item has active stock returns `422` with \"Cannot process this request due to active stock/locations. To proceed all stock and and locations must be removed.\".\n- Custom-field values are validated against the tenant's inventory custom-field schema.\n\n### Response\nThe updated inventory record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 745,\n  \"legacy_id\": null,\n  \"type\": 1,\n  \"batching_type\": 0,\n  \"is_serial_numbered\": 0,\n  \"service_id\": 0,\n  \"dropshipping_type\": 0,\n  \"sync_stock\": 1,\n  \"include_component_stock_level\": 0,\n  \"fulfilment_client_id\": null,\n  \"sku\": \"POSTMAN-G2-TEST\",\n  \"secondary_sku\": \"\",\n  \"sku_hash\": \"d89a7ef1f8d2fbd57f65b89e36647428\",\n  \"vendor_sku\": null,\n  \"chapi_id\": null,\n  \"stock_level\": 0,\n  \"stock_level_open\": 0,\n  \"stock_level_global_available\": 0,\n  \"stock_level_available\": 0,\n  \"stock_warn_level\": 10,\n  \"item_barcode\": \"\",\n  \"item_barcode_2\": \"\",\n  \"item_barcode_3\": \"\",\n  \"item_barcode_4\": \"\",\n  \"item_barcode_5\": \"\",\n  \"thumbnail_url\": null,\n  \"single_parcel_per_item\": 0,\n  \"name\": \"Updated Postman G2 Test Item\",\n  \"product_weight\": \"0.600\",\n  \"product_height\": \"5.0\",\n  \"product_width\": \"10.0\",\n  \"product_length\": \"15.0\",\n  \"product_box_type\": 5,\n  \"product_box_quantity\": 1,\n  \"picking_by_packaging\": 0,\n  \"default_packaging_id\": 0,\n  \"description\": \"Updated description from Postman test\",\n  \"country_of_origin\": \"GB\",\n  \"hs_code\": \"\",\n  \"customs_description\": \"\",\n  \"unit_price\": \"12.9900\",\n  \"cost_price\": \"6.0000\",\n  \"shipping_service_id\": 0,\n  \"zone\": \"\",\n  \"multiplier\": 1,\n  \"include_po_stock\": 0,\n  \"custom_fields\": {},\n  \"dynamic_components_type\": 0,\n  \"is_archived\": 0,\n  \"archived_sync_stock\": null,\n  \"temp_image_url\": null,\n  \"ghost_asset\": 0,\n  \"master_dropshipping\": 0,\n  \"include_po_level\": 0,\n  \"fabric_content\": \"\",\n  \"low_stock_email_sent_time\": 0,\n  \"vat_rate_percentage\": \"20.0000\",\n  \"stock_update_scheduled_at\": \"2026-04-30 13:12:47\",\n  \"created_at\": \"2026-04-30 13:12:42\",\n  \"updated_at\": \"2026-04-30 12:12:47\",\n  \"dont_sync_until\": null,\n  \"assembly_notes\": null,\n  \"customs_value\": null,\n  \"accounting_options\": [],\n  \"images\": [],\n  \"hs_codes\": []\n}"},{"id":"197695e1-9e01-4908-b15c-177bca39ecff","name":"Clear CPSC certificate, set disclaim code","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"cpsc_registry_product_id\": null,\n    \"cpsc_product_version\": null,\n    \"cpsc_certifier_id\": \"\",\n    \"cpsc_intended_use_code\": null,\n    \"cpsc_intended_use_description\": null,\n    \"cpsc_disclaim_code\": \"DC-01\",\n    \"cpsc_disclaim_reason\": \"Not a children's product\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update","description":"Updates editable fields on an existing inventory item. Send only the fields you want to change.\n\n### Body fields\nAll optional. Mostly the same set as **Create Inventory Item**, plus:\n- `stock_warn_level` — global low-stock threshold for this SKU.\n- `manufacturer_id` - links the item to an inventory manufacturer of the same account. Send `0` to remove the link. An ID from another account returns `422`.\n\n### Clearing customs and CPSC values\n`mid_id`, `cpsc_certifier_id`, `manufacturer_sku`, `cpsc_product_version`, `cpsc_registry_product_id`, `cpsc_intended_use_code`, `cpsc_intended_use_description`, `cpsc_disclaim_code` and `cpsc_disclaim_reason` follow these rules:\n- Leave a field out of the body to keep its current value.\n- Send `null`, `\"\"` or a value made only of spaces to clear it. A cleared field comes back as `null`.\n- Any other value is saved with leading and trailing spaces removed.\n- Each field takes a single text value. An array or object returns `422` with `<field> must be a single value`, and nothing on the item is changed.\n\nEach field is cleared on its own, so one request can remove the certificate references and set a disclaim code, or remove the disclaim code and set the certificate references. See the **Clear CPSC certificate, set disclaim code** example.\n\n### Important constraints\n- `type` cannot be changed if the item has any active stock or location records — `422` with \"The inventory type field cannot be changed.\".\n- `batching_type` cannot be changed for Group items — `422` with \"Batching type cannot be changed for group products.\".\n- Changing `batching_type` or `is_serial_numbered` while the item has active stock returns `422` with \"Cannot process this request due to active stock/locations. To proceed all stock and and locations must be removed.\".\n- Custom-field values are validated against the tenant's inventory custom-field schema.\n\n### Response\nThe updated inventory record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 745,\n  \"legacy_id\": null,\n  \"type\": 1,\n  \"batching_type\": 0,\n  \"is_serial_numbered\": 0,\n  \"service_id\": 0,\n  \"dropshipping_type\": 0,\n  \"sync_stock\": 1,\n  \"include_component_stock_level\": 0,\n  \"fulfilment_client_id\": null,\n  \"sku\": \"EXAMPLE-001\",\n  \"secondary_sku\": \"\",\n  \"sku_hash\": \"00f766c6f907201d047695dfc36b54de\",\n  \"vendor_sku\": null,\n  \"chapi_id\": null,\n  \"stock_level\": 0,\n  \"stock_level_open\": 0,\n  \"stock_level_global_available\": 0,\n  \"stock_level_available\": 0,\n  \"stock_warn_level\": 0,\n  \"item_barcode\": \"\",\n  \"item_barcode_2\": \"\",\n  \"item_barcode_3\": \"\",\n  \"item_barcode_4\": \"\",\n  \"item_barcode_5\": \"\",\n  \"thumbnail_url\": null,\n  \"single_parcel_per_item\": 0,\n  \"name\": \"Example Product\",\n  \"product_weight\": \"2.000\",\n  \"product_height\": \"1.0\",\n  \"product_width\": \"1.0\",\n  \"product_length\": \"1.0\",\n  \"product_box_type\": 5,\n  \"product_box_quantity\": 1,\n  \"picking_by_packaging\": 0,\n  \"default_packaging_id\": 0,\n  \"description\": \"\",\n  \"country_of_origin\": \"\",\n  \"hs_code\": \"\",\n  \"customs_description\": \"\",\n  \"unit_price\": \"0.0000\",\n  \"cost_price\": \"0.0000\",\n  \"shipping_service_id\": 0,\n  \"zone\": \"\",\n  \"multiplier\": 1,\n  \"include_po_stock\": 0,\n  \"custom_fields\": {},\n  \"dynamic_components_type\": 0,\n  \"is_archived\": 0,\n  \"archived_sync_stock\": null,\n  \"temp_image_url\": null,\n  \"ghost_asset\": 0,\n  \"master_dropshipping\": 0,\n  \"include_po_level\": 0,\n  \"fabric_content\": \"\",\n  \"low_stock_email_sent_time\": 0,\n  \"vat_rate_percentage\": \"20.0000\",\n  \"stock_update_scheduled_at\": \"2026-10-22 11:10:22\",\n  \"created_at\": \"2026-10-22 11:09:39\",\n  \"updated_at\": \"2026-10-22 10:10:22\",\n  \"dont_sync_until\": null,\n  \"assembly_notes\": null,\n  \"customs_value\": \"0.0000\",\n  \"mid_id\": null,\n  \"cpsc_certifier_id\": null,\n  \"manufacturer_id\": null,\n  \"manufacturer_sku\": null,\n  \"cpsc_product_version\": null,\n  \"cpsc_registry_product_id\": null,\n  \"cpsc_intended_use_code\": null,\n  \"cpsc_intended_use_description\": null,\n  \"cpsc_disclaim_code\": \"DC-01\",\n  \"cpsc_disclaim_reason\": \"Not a children's product\",\n  \"is_dangerous_goods\": 0,\n  \"dg_un_number\": null,\n  \"dg_proper_shipping_name\": null,\n  \"dg_class_division\": null,\n  \"dg_packing_group\": null,\n  \"dg_hazard_labels\": null,\n  \"dg_quantity\": null,\n  \"dg_quantity_uom\": null,\n  \"accounting_options\": [],\n  \"images\": [],\n  \"hs_codes\": []\n}"},{"id":"f29b7988-13b0-4625-bdfa-3250a1db1ba3","name":"Field sent as a list","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"cpsc_disclaim_code\": [\n        \"DC-01\"\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory//update","description":"Updates editable fields on an existing inventory item. Send only the fields you want to change.\n\n### Body fields\nAll optional. Mostly the same set as **Create Inventory Item**, plus:\n- `stock_warn_level` — global low-stock threshold for this SKU.\n- `manufacturer_id` - links the item to an inventory manufacturer of the same account. Send `0` to remove the link. An ID from another account returns `422`.\n\n### Clearing customs and CPSC values\n`mid_id`, `cpsc_certifier_id`, `manufacturer_sku`, `cpsc_product_version`, `cpsc_registry_product_id`, `cpsc_intended_use_code`, `cpsc_intended_use_description`, `cpsc_disclaim_code` and `cpsc_disclaim_reason` follow these rules:\n- Leave a field out of the body to keep its current value.\n- Send `null`, `\"\"` or a value made only of spaces to clear it. A cleared field comes back as `null`.\n- Any other value is saved with leading and trailing spaces removed.\n- Each field takes a single text value. An array or object returns `422` with `<field> must be a single value`, and nothing on the item is changed.\n\nEach field is cleared on its own, so one request can remove the certificate references and set a disclaim code, or remove the disclaim code and set the certificate references. See the **Clear CPSC certificate, set disclaim code** example.\n\n### Important constraints\n- `type` cannot be changed if the item has any active stock or location records — `422` with \"The inventory type field cannot be changed.\".\n- `batching_type` cannot be changed for Group items — `422` with \"Batching type cannot be changed for group products.\".\n- Changing `batching_type` or `is_serial_numbered` while the item has active stock returns `422` with \"Cannot process this request due to active stock/locations. To proceed all stock and and locations must be removed.\".\n- Custom-field values are validated against the tenant's inventory custom-field schema.\n\n### Response\nThe updated inventory record.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"cpsc_disclaim_code must be a single value\"\n}"}],"_postman_id":"8ad9bab7-e12d-4f72-8dd7-d71adc3d43a4"},{"name":"Delete Inventory Item","id":"b5159e08-5617-4f10-a3e4-e3eccd2cac4c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory//delete","description":"<p>Soft-deletes an inventory item. The record stays in the database for audit but is filtered out of all listing endpoints.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Fulfilment-client users can only delete their own SKUs.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;inventory_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"f1416f04-78ce-407c-ae58-bf605fd5acd8","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory//delete","description":"Soft-deletes an inventory item. The record stays in the database for audit but is filtered out of all listing endpoints.\n\n### Constraints\n- Fulfilment-client users can only delete their own SKUs.\n\n### Response\n```\n{ \"id\": <inventory_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 745\n}"}],"_postman_id":"b5159e08-5617-4f10-a3e4-e3eccd2cac4c"}],"id":"cd998f2d-4c27-465c-b868-f39e2c30ff74","description":"<p>Endpoints for managing inventory (SKUs) and everything attached to them — stock at locations, suppliers, inventory-to-inventory links, batches/serial numbers, package configurations, and category assignments.</p>\n<h3 id=\"inventory-type-reference\">Inventory <code>type</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Type</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Inventory</td>\n<td>A normal sellable SKU.</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Component</td>\n<td>A part used by Group/Inventory items via inventory links.</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Group</td>\n<td>A bundle/kit. Cannot be batch-tracked itself; cannot have a default packaging; cannot be the child of a link.</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Packaging</td>\n<td>A box/wrapper. Cannot have its own packaging configuration as a default.</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Auxiliary Packaging</td>\n<td>Secondary packaging (filler, etc.). Cannot be the default packaging of another item.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"batching_type-reference\"><code>batching_type</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Meaning</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>No batching</td>\n<td>Default. Stock is a single number per location.</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Serial Number</td>\n<td>Each unit has a unique serial; serials are validated for uniqueness.</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Batch Number</td>\n<td>Many units can share a batch + expiry; uniqueness scoped to (batch + location + expiry).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"filter-syntax-recap\">Filter syntax recap</h3>\n<p>See the collection-level description for <code>filters[...]</code> syntax. The inventory-list filter <code>multiple_sku</code> uses a <em>literal <code>||</code> separator inside a single value</em>, e.g. <code>filters[multiple_sku]=SKU-A||SKU-B||SKU-C</code>. Other multi-value filters use the standard array form <code>filters[&lt;key&gt;][]=</code>.</p>\n","_postman_id":"cd998f2d-4c27-465c-b868-f39e2c30ff74","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Inventory Categories","item":[{"name":"List Categories","id":"78c50c2c-2e3a-4130-8dbf-7f555927b47f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/categories?page=1","description":"<p>Returns a paginated list of inventory categories. Categories support a <code>parent_category_id</code> for tree structures.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by tenant settings.</p>\n<h3 id=\"filters\">Filters</h3>\n<ul>\n<li><code>filters[search]</code> - partial match on the category name.</li>\n</ul>\n<h3 id=\"sort\">Sort</h3>\n<p>Fixed: <code>id</code> ascending. There is no <code>sort</code> parameter.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a category record. When there are no categories, <code>data</code> is <code>null</code> (not <code>[]</code>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["categories"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>LIKE-search on <code>category_name</code>.</p>\n","type":"text/plain"},"key":"filters[search]","value":""}],"variable":[]}},"response":[{"id":"db53fe67-b5f0-4ebb-89f4-f3c4a684af4a","name":"200 — empty list","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/categories"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 0,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 0,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/inventory-categories?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": null\n}"}],"_postman_id":"78c50c2c-2e3a-4130-8dbf-7f555927b47f"},{"name":"Get Category Detail","id":"2f4dd2e2-8f1f-4f2c-914c-98f3e3f47de1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/category/","description":"<p>Returns a single category. If the category has a <code>parent_category_id</code>, the parent record is embedded as <code>parent</code> (recursive).</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"id\":                 &lt;int&gt;,\n  \"category_name\":      \"&lt;string&gt;\",\n  \"parent_category_id\": &lt;int|null&gt;,\n  \"parent\":             { ... } // present only when parent_category_id is set\n}\n</code></pre><p>Returns <code>404</code> if the category doesn't exist or has been deleted.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["category",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"598a41f3-b74d-4e89-a653-b8ee1fded03e","name":"200 — category found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/category/","description":"Returns a single category. If the category has a `parent_category_id`, the parent record is embedded as `parent` (recursive).\n\n### Response\n```\n{\n  \"id\":                 <int>,\n  \"category_name\":      \"<string>\",\n  \"parent_category_id\": <int|null>,\n  \"parent\":             { ... } // present only when parent_category_id is set\n}\n```\n\nReturns `404` if the category doesn't exist or has been deleted.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5,\n  \"parent_category_id\": null,\n  \"fulfilment_client_id\": null,\n  \"category_name\": \"Postman G8 Detail Test\",\n  \"deleted\": 0,\n  \"created_at\": \"2026-04-30 13:58:40\",\n  \"updated_at\": \"2026-04-30 13:58:40\"\n}"}],"_postman_id":"2f4dd2e2-8f1f-4f2c-914c-98f3e3f47de1"},{"name":"Create Category","id":"5777038e-39cf-4347-96d2-cd202f06521f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"category_name\":      \"Apparel\",   // REQUIRED\n    \"parent_category_id\": null         // optional, for nested categories. null/omit for a root category.\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/category/create","description":"<p>Creates a new inventory category.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>category_name</code> (string, required).</li>\n<li><code>parent_category_id</code> (int, optional) — for nested categories. Send <code>null</code> (or omit) for a root category.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created category record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["category","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"359d1d9e-8c51-4c95-9c8f-686105da4c0b","name":"200 — created","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"category_name\":\"API Test Category\"}"},"url":"https://your-company.myhelm.app/public-api/category/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 1,\n    \"parent_category_id\": null,\n    \"fulfilment_client_id\": null,\n    \"category_name\": \"API Test Category\",\n    \"deleted\": 0,\n    \"created_at\": \"2026-04-30 11:47:58\",\n    \"updated_at\": \"2026-04-30 11:47:58\"\n}"}],"_postman_id":"5777038e-39cf-4347-96d2-cd202f06521f"},{"name":"Update Category","id":"efe20f3d-00e8-46c9-a679-5e3fb50ccedf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"category_name\": \"Womenswear\",\n    \"parent_category_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/category//update","description":"<p>Updates a category. Send only the fields you want to change — fields with empty values are ignored.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>category_name</code> (string, optional).</li>\n<li><code>parent_category_id</code> (int, optional).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated category record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["category","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"c8705853-e38b-4868-b016-f3908d288576","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"category_name\": \"Womenswear\",\n    \"parent_category_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/category//update","description":"Updates a category. Send only the fields you want to change — fields with empty values are ignored.\n\n### Body fields\n- `category_name` (string, optional).\n- `parent_category_id` (int, optional).\n\n### Response\nThe updated category record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4,\n  \"parent_category_id\": null,\n  \"fulfilment_client_id\": null,\n  \"category_name\": \"Postman G2 Updated Category\",\n  \"deleted\": 0,\n  \"created_at\": \"2026-04-30 13:14:40\",\n  \"updated_at\": \"2026-04-30 13:14:41\"\n}"}],"_postman_id":"efe20f3d-00e8-46c9-a679-5e3fb50ccedf"},{"name":"Delete Category","id":"cae061a1-72df-41b9-8a95-e10f9395e9ea","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/category//delete","description":"<p>Soft-deletes a category. Inventory items previously assigned to it are no longer linked.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;category_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["category","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"f7a67755-387c-4146-bcc3-fa6467790128","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/category//delete","description":"Soft-deletes a category. Inventory items previously assigned to it are no longer linked.\n\n### Response\n```\n{ \"id\": <category_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4\n}"}],"_postman_id":"cae061a1-72df-41b9-8a95-e10f9395e9ea"}],"id":"06851f7a-f586-4474-98a1-5af259c2bd72","description":"<p>Manage the <em>categories</em> themselves (create / rename / delete). To assign a category to an inventory item, see <strong>Inventory → Categories</strong>.</p>\n","_postman_id":"06851f7a-f586-4474-98a1-5af259c2bd72","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Inventory Scrapping Reasons","item":[{"name":"List Reasons","id":"48d1776e-43b4-47c1-8060-cfffae98327a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons?page=1","description":"<p>Returns a paginated list of scrapping reasons.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by tenant settings.</p>\n<h3 id=\"filters\">Filters</h3>\n<ul>\n<li><code>filters[search]</code> - partial match on the reason text.</li>\n</ul>\n<h3 id=\"sort\">Sort</h3>\n<p>Fixed: <code>id</code> ascending.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is <code>{ id, reason, ... }</code>. When there are no reasons, <code>data</code> is <code>null</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_scrapping_reasons"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>LIKE-search on <code>reason</code>.</p>\n","type":"text/plain"},"key":"filters[search]","value":""}],"variable":[]}},"response":[{"id":"4e1d6f42-50a7-42db-8eca-59611db7a69e","name":"200 — empty list","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 0,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 0,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/inventory-scrapping-reasons?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": null\n}"}],"_postman_id":"48d1776e-43b4-47c1-8060-cfffae98327a"},{"name":"Get Reason Detail","id":"45b49bce-1fc1-4f06-b65d-c3769dccd27a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons/","description":"<p>Returns a single scrapping reason. <code>404</code> if it doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_scrapping_reasons",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b036699f-5294-4c4d-a8a2-b308343afc2f","name":"200 — reason found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons/","description":"Returns a single scrapping reason. `404` if it doesn't exist.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4,\n  \"reason\": \"Postman G8 reason\",\n  \"created_at\": \"2026-04-30 13:58:40\",\n  \"updated_at\": \"2026-04-30 13:58:41\"\n}"}],"_postman_id":"45b49bce-1fc1-4f06-b65d-c3769dccd27a"},{"name":"Create Reason","id":"5b3853b0-90a6-458d-bab6-33f7a5be6490","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"Damaged in transit\"   // string, required\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons/create","description":"<p>Creates a new scrapping reason.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>reason</code> (string, required).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created record. The created record is returned.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_scrapping_reasons","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"c1f576fc-9fd0-4a46-adf3-b55319d30150","name":"200 — created","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"reason\":\"Damaged in transit\"}"},"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 1,\n    \"reason\": \"\",\n    \"created_at\": \"2026-04-30 11:47:59\",\n    \"updated_at\": \"2026-04-30 11:47:59\"\n}"}],"_postman_id":"5b3853b0-90a6-458d-bab6-33f7a5be6490"},{"name":"Update Reason","id":"7956010b-f729-4320-9a53-b9075e606ffc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"Damaged on receipt\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons//update","description":"<p>Updates a scrapping reason. Empty values are ignored.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>reason</code> (string, optional).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_scrapping_reasons","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"7eec301d-134e-4097-9f81-ead1f698b659","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"Damaged on receipt\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons//update","description":"Updates a scrapping reason. Empty values are ignored.\n\n### Body field\n- `reason` (string, optional).\n\n### Response\nThe updated record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3,\n  \"reason\": \"Damaged on receipt - updated\",\n  \"created_at\": \"2026-04-30 13:13:02\",\n  \"updated_at\": \"2026-04-30 13:13:09\"\n}"}],"_postman_id":"7956010b-f729-4320-9a53-b9075e606ffc"},{"name":"Delete Reason","id":"2f1611d6-7bc8-4b00-87da-46f295037cc8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons//delete","description":"<p>Soft-deletes a scrapping reason.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;reason_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_scrapping_reasons","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"5a12f6dc-6807-43cb-aca8-a0da1e16c817","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_scrapping_reasons//delete","description":"Soft-deletes a scrapping reason.\n\n### Response\n```\n{ \"id\": <reason_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3\n}"}],"_postman_id":"2f1611d6-7bc8-4b00-87da-46f295037cc8"}],"id":"f280a9ee-5437-48b5-ad66-e522121f1470","description":"<p>A short list of reasons users can pick from when scrapping stock (for example: <code>Damaged</code>, <code>Expired</code>, <code>Quality control reject</code>). Use <strong>Inventory → Stock Locations → Scrap Stock</strong> to actually scrap stock against a reason.</p>\n","_postman_id":"f280a9ee-5437-48b5-ad66-e522121f1470","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Inventory Manufacturers","item":[{"name":"List Manufacturers","id":"cc26297c-8b64-4bd6-84b3-f27aaaf91457","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers?page=1","description":"<p>Returns the account's inventory manufacturers, oldest first.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users only see their own manufacturers; other users see every manufacturer on the account, the warehouse's own and every fulfilment client's.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). The page size is the tenant's <em>Items per page</em> setting.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on <code>name</code> or <code>company_name</code>.</td>\n</tr>\n<tr>\n<td><code>filters[name]</code></td>\n<td>string</td>\n<td>Exact <code>name</code>.</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_clients][]</code></td>\n<td>int</td>\n<td>Only manufacturers of these fulfilment clients.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>Paginated list. <code>fulfilment_client_id</code> is <code>null</code> for the warehouse's own manufacturers.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_manufacturers"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number. Default 1.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Partial match on name or company name.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Exact name.</p>\n","type":"text/plain"},"key":"filters[name]","value":""},{"disabled":true,"description":{"content":"<p>Only manufacturers of these fulfilment clients. Back-office users only.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients][]","value":""}],"variable":[]}},"response":[{"id":"92c7db6d-f324-47e7-969f-0f0938e29009","name":"200 - manufacturers","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/inventory_manufacturers?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["inventory_manufacturers"],"query":[{"key":"page","value":"1","description":"1-based page number. Default 1."},{"key":"filters[search]","value":"","description":"Partial match on name or company name.","disabled":true},{"key":"filters[name]","value":"","description":"Exact name.","disabled":true},{"key":"filters[fulfilment_clients][]","value":"","description":"Only manufacturers of these fulfilment clients. Back-office users only.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 1,\n  \"per_page\": 20,\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 1,\n  \"data\": [\n    {\n      \"id\": 3,\n      \"fulfilment_client_id\": null,\n      \"name\": \"Acme Textiles\",\n      \"company_name\": \"Acme Textiles Ltd\",\n      \"address_1\": \"Unit 4, Riverside Park\",\n      \"address_2\": \"Mill Lane\",\n      \"address_3\": null,\n      \"city\": \"Leeds\",\n      \"county\": \"West Yorkshire\",\n      \"postcode\": \"LS1 4AB\",\n      \"country_iso\": \"GB\",\n      \"created_at\": \"2026-10-08 10:15:02\",\n      \"updated_at\": \"2026-10-08 10:15:02\"\n    }\n  ]\n}"}],"_postman_id":"cc26297c-8b64-4bd6-84b3-f27aaaf91457"},{"name":"Get Manufacturer Detail","id":"7a9f8efd-ccb2-4de5-9c3a-04d8559db747","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/","description":"<p>Returns one inventory manufacturer.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). A fulfilment-client user asking for another account's manufacturer gets <code>404</code>.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - inventory manufacturer ID.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_manufacturers",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"a26335ed-4fc7-4c73-86a4-7ad3f368b8af","name":"200 - manufacturer","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3,\n  \"fulfilment_client_id\": null,\n  \"name\": \"Acme Textiles\",\n  \"company_name\": \"Acme Textiles Ltd\",\n  \"address_1\": \"Unit 4, Riverside Park\",\n  \"address_2\": \"Mill Lane\",\n  \"address_3\": null,\n  \"city\": \"Leeds\",\n  \"county\": \"West Yorkshire\",\n  \"postcode\": \"LS1 4AB\",\n  \"country_iso\": \"GB\",\n  \"created_at\": \"2026-10-08 10:15:02\",\n  \"updated_at\": \"2026-10-08 10:15:02\"\n}"},{"id":"e90ee3cb-855f-4e66-8cbe-685cbcf746d0","name":"404 - not found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Inventory Manufacturer Not Found\"\n}"}],"_postman_id":"7a9f8efd-ccb2-4de5-9c3a-04d8559db747"},{"name":"Create Manufacturer","id":"36d1ae1a-b87b-4f57-9e1a-74580f1bdec7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":         \"Acme Textiles\",          // REQUIRED, unique within the account\n    \"company_name\": \"Acme Textiles Ltd\",\n    \"address_1\":    \"Unit 4, Riverside Park\",\n    \"address_2\":    \"Mill Lane\",\n    \"city\":         \"Leeds\",\n    \"county\":       \"West Yorkshire\",\n    \"postcode\":     \"LS1 4AB\",\n    \"country_iso\":  \"GB\",                      // ISO2, ISO3 or country name\n    \"fulfilment_client_id\": null               // back-office users only: owner fulfilment client\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/create","description":"<p>Creates an inventory manufacturer. Link it to inventory items with <code>manufacturer_id</code> on <strong>Create Inventory Item</strong> / <strong>Update Inventory Item</strong>; its address is then sent to the courier as the item's manufacturer address.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). A manufacturer created by a fulfilment-client user always belongs to that client.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Name shown in Helm. Must be unique within the owning account.</td>\n</tr>\n<tr>\n<td><code>company_name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Company name on the address. When empty, <code>name</code> is used on the courier address.</td>\n</tr>\n<tr>\n<td><code>address_1</code> / <code>address_2</code> / <code>address_3</code></td>\n<td>string</td>\n<td>no</td>\n<td>Address lines.</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>county</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>postcode</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>country_iso</code></td>\n<td>string</td>\n<td>no</td>\n<td>Country as a two-letter ISO code, a three-letter ISO code or the country name; stored as the two-letter code. An unknown country returns <code>422</code> <code>Country (&lt;value&gt;) is not a valid country.</code></td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Back-office users only, when fulfilment is enabled: the fulfilment client that owns the manufacturer. Leave it out for the warehouse's own. Only items of the same owner can be linked to it. Cannot be changed later. An unknown ID returns <code>422</code> <code>Fulfilment client cannot be found.</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Blank values are stored as <code>null</code>. A name already used by another manufacturer of the same owner returns <code>422</code>.</p>\n<h3 id=\"response\">Response</h3>\n<p>The created manufacturer.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_manufacturers","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"32a265af-9949-494d-8b87-d6af113fd953","name":"200 - created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":         \"Acme Textiles\",          // REQUIRED, unique within the account\n    \"company_name\": \"Acme Textiles Ltd\",\n    \"address_1\":    \"Unit 4, Riverside Park\",\n    \"address_2\":    \"Mill Lane\",\n    \"city\":         \"Leeds\",\n    \"county\":       \"West Yorkshire\",\n    \"postcode\":     \"LS1 4AB\",\n    \"country_iso\":  \"GB\",                      // ISO2, ISO3 or country name\n    \"fulfilment_client_id\": null               // back-office users only: owner fulfilment client\n}"},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3,\n  \"fulfilment_client_id\": null,\n  \"name\": \"Acme Textiles\",\n  \"company_name\": \"Acme Textiles Ltd\",\n  \"address_1\": \"Unit 4, Riverside Park\",\n  \"address_2\": \"Mill Lane\",\n  \"address_3\": null,\n  \"city\": \"Leeds\",\n  \"county\": \"West Yorkshire\",\n  \"postcode\": \"LS1 4AB\",\n  \"country_iso\": \"GB\",\n  \"created_at\": \"2026-10-08 10:15:02\",\n  \"updated_at\": \"2026-10-08 10:15:02\"\n}"},{"id":"6acc40c5-5b2b-4055-8db4-eb063d6cb5ab","name":"422 - duplicate name","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":         \"Acme Textiles\",          // REQUIRED, unique within the account\n    \"company_name\": \"Acme Textiles Ltd\",\n    \"address_1\":    \"Unit 4, Riverside Park\",\n    \"address_2\":    \"Mill Lane\",\n    \"city\":         \"Leeds\",\n    \"county\":       \"West Yorkshire\",\n    \"postcode\":     \"LS1 4AB\",\n    \"country_iso\":  \"GB\",                      // ISO2, ISO3 or country name\n    \"fulfilment_client_id\": null               // back-office users only: owner fulfilment client\n}"},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/create"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"A manufacturer named \\\"Acme Textiles\\\" already exists.\"\n}"},{"id":"809b6e89-ffe0-441d-9a18-3e9678cdf3be","name":"422 - name missing","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\"company_name\": \"Acme Textiles Ltd\"}"},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers/create"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"name field is required.\"\n}"}],"_postman_id":"36d1ae1a-b87b-4f57-9e1a-74580f1bdec7"},{"name":"Update Manufacturer","id":"994e1ca8-1e46-4014-ab16-bd42eb7a3fdb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"address_2\": \"\",          // empty clears the field\n    \"postcode\":  \"LS2 7EY\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers//update","description":"<p>Updates an inventory manufacturer. Only the fields present in the body are changed; send an empty value to clear a field. Items linked to the manufacturer use the new address on their next label.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). A fulfilment-client user can only update their own manufacturers (<code>404</code> otherwise).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - inventory manufacturer ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>Any field from <strong>Create Manufacturer</strong> except <code>fulfilment_client_id</code>, which cannot be changed. <code>name</code> cannot be cleared (<code>422</code> <code>name field is required.</code>) and must stay unique within the owner.</p>\n<h3 id=\"response\">Response</h3>\n<p>The updated manufacturer.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_manufacturers","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"cbd145c2-8849-4e25-bb94-b214ccf3d2aa","name":"200 - updated","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"address_2\": \"\",          // empty clears the field\n    \"postcode\":  \"LS2 7EY\"\n}"},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers//update"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3,\n  \"fulfilment_client_id\": null,\n  \"name\": \"Acme Textiles\",\n  \"company_name\": \"Acme Textiles Ltd\",\n  \"address_1\": \"Unit 4, Riverside Park\",\n  \"address_2\": null,\n  \"address_3\": null,\n  \"city\": \"Leeds\",\n  \"county\": \"West Yorkshire\",\n  \"postcode\": \"LS2 7EY\",\n  \"country_iso\": \"GB\",\n  \"created_at\": \"2026-10-08 10:15:02\",\n  \"updated_at\": \"2026-10-08 10:21:40\"\n}"},{"id":"3773b437-e6be-4708-aaac-025f5430d79c","name":"404 - not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"address_2\": \"\",          // empty clears the field\n    \"postcode\":  \"LS2 7EY\"\n}"},"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers//update"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Inventory Manufacturer Not Found\"\n}"}],"_postman_id":"994e1ca8-1e46-4014-ab16-bd42eb7a3fdb"},{"name":"Delete Manufacturer","id":"0f54d1c3-9343-41c1-809a-1648f0f64fc3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers//delete","description":"<p>Deletes an inventory manufacturer. Every inventory item linked to it is unlinked (<code>manufacturer_id</code> becomes <code>null</code>) and from then on sends its primary supplier's address to the courier instead. This cannot be undone.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). A fulfilment-client user can only delete their own manufacturers (<code>404</code> otherwise).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - inventory manufacturer ID.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p><code>{ \"id\": &lt;deleted id&gt; }</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["inventory_manufacturers","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b61ec29c-7ec3-479c-b7d1-47e0a0dc062f","name":"200 - deleted","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers//delete"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3\n}"},{"id":"ac23a1a2-3dd7-4751-9453-ebc2d1f42fcd","name":"404 - not found","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/inventory_manufacturers//delete"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Inventory Manufacturer Not Found\"\n}"}],"_postman_id":"0f54d1c3-9343-41c1-809a-1648f0f64fc3"}],"id":"1ad39a2a-217e-4c60-b2f5-82399e25e7df","description":"<p>Manufacturer addresses for inventory items. Couriers that need a manufacturer address for an item (for example for customs) receive the address of the manufacturer linked to the item through <code>manufacturer_id</code>, or the primary supplier's address when the item has none.</p>\n<p>A manufacturer belongs to one owner: the warehouse itself, or one fulfilment client. An item can only be linked to a manufacturer of its own owner.</p>\n<p>Set the <code>manufacturer_id</code> collection variable before calling the detail / update / delete requests.</p>\n","_postman_id":"1ad39a2a-217e-4c60-b2f5-82399e25e7df","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Contacts","item":[{"name":"List Customers","id":"620438b0-ee7e-47c9-975b-7fb68541a1e6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/customers?page=1","description":"<p>Returns a paginated list of customers.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by tenant settings.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on shipping name, shipping company, invoice name, invoice company or email. Use `</td>\n</tr>\n<tr>\n<td><code>filters[email]</code></td>\n<td>string</td>\n<td>Exact email match.</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_clients][]</code></td>\n<td>int</td>\n<td>Contacts of these fulfilment clients.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort-options\">Sort options</h3>\n<p><code>sort</code> = <code>name_az</code> / <code>name_za</code> (alphabetical), <code>updated_at_pr</code> / <code>updated_at_rp</code> (least recently updated first / most recently updated first). Default: newest first.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a <code>contact</code> record with full address, compliance numbers (VAT/EORI/IOSS/UKIMS), payment metadata, and <code>custom_fields</code> decoded into an object.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["customers"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code> | <code>updated_at_pr</code> | <code>updated_at_rp</code>. Default: <code>created_at</code> descending.</p>\n","type":"text/plain"},"key":"sort","value":"name_az"},{"disabled":true,"description":{"content":"<p>LIKE-search on <code>shipping_name</code>, <code>shipping_name_company</code>, <code>invoice_name</code>, <code>invoice_name_company</code>, and <code>email</code>. Single pipe <code>|</code> between terms ORs them.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Exact match on <code>email</code>.</p>\n","type":"text/plain"},"key":"filters[email]","value":""},{"disabled":true,"description":{"content":"<p>Fulfilment client ID. Send multiple times for OR. Visible to back-office users only.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients][]","value":""}],"variable":[]}},"response":[{"id":"a5eb7793-684c-49a5-8cdd-936cdb58a177","name":"200 — page of customers","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/customers"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 11,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"next_page_url\": null,\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": [\n        {\n            \"id\": 5789,\n            \"contact_type\": 1,\n            \"is_archived\": 0,\n            \"fulfilment_client_id\": null,\n            \"shipping_name\": \"Customer Name\",\n            \"shipping_address_line_one\": \"1 Example Street\",\n            \"shipping_address_city\": \"Test City\",\n            \"shipping_address_country\": \"United Kingdom\",\n            \"shipping_address_postcode\": \"YO25 9FQ\",\n            \"shipping_address_iso\": \"GB\",\n            \"invoice_name\": \"Customer Name\",\n            \"email\": \"customer@example.com\",\n            \"custom_fields\": {}\n        }\n    ]\n}"}],"_postman_id":"620438b0-ee7e-47c9-975b-7fb68541a1e6"},{"name":"List Suppliers","id":"c834b71b-c020-4483-91ed-1d41f969c102","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/suppliers?page=1","description":"<p>Returns a paginated list of suppliers. Same filter set, sort options, and response shape as <strong>List Customers</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["suppliers"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code> | <code>updated_at_pr</code> | <code>updated_at_rp</code>. Default: <code>created_at</code> descending.</p>\n","type":"text/plain"},"key":"sort","value":"name_az"},{"disabled":true,"description":{"content":"<p>LIKE-search on shipping/invoice name+company and email. Single pipe <code>|</code> between terms ORs them.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Exact match on <code>email</code>.</p>\n","type":"text/plain"},"key":"filters[email]","value":""},{"disabled":true,"description":{"content":"<p>Fulfilment client ID. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients][]","value":""}],"variable":[]}},"response":[{"id":"aad377f6-ab23-4a1c-9f00-a5d6e9991dc6","name":"200 — page of suppliers","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/suppliers?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["suppliers"],"query":[{"key":"page","value":"1","description":"1-based page number."},{"key":"sort","value":"name_az","description":"One of: `name_az` | `name_za` | `updated_at_pr` | `updated_at_rp`. Default: `created_at` descending.","disabled":true},{"key":"filters[search]","value":"","description":"LIKE-search on shipping/invoice name+company and email. Single pipe `|` between terms ORs them.","disabled":true},{"key":"filters[email]","value":"","description":"Exact match on `email`.","disabled":true},{"key":"filters[fulfilment_clients][]","value":"","description":"Fulfilment client ID. Send multiple times for OR.","disabled":true}]},"description":"Returns a paginated list of suppliers. Same filter set, sort options, and response shape as **List Customers**.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 1,\n  \"per_page\": \"100\",\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 100,\n  \"data\": [\n    {\n      \"id\": 5779,\n      \"contact_type\": 2,\n      \"is_archived\": 0,\n      \"fulfilment_client_id\": null,\n      \"shipping_name_company\": \"Hidayet Arasan\",\n      \"shipping_name\": \"Hidayet Arasan\",\n      \"shipping_address_line_one\": \"1 Sandwash Business Park\",\n      \"shipping_address_line_two\": \"Sandwash Close Rainford\",\n      \"shipping_address_city\": \"St. Helens\",\n      \"shipping_address_county\": \"\",\n      \"shipping_address_country\": \"United Kingdom\",\n      \"shipping_address_postcode\": \"WA11 8SZ\",\n      \"shipping_address_iso\": \"\",\n      \"invoice_name_company\": \"Hidayet Arasan\",\n      \"invoice_name\": \"Hidayet Arasan\",\n      \"invoice_address_line_one\": \"1 Sandwash Business Park\",\n      \"invoice_address_line_two\": \"Sandwash Close Rainford\",\n      \"invoice_address_city\": \"St. Helens\",\n      \"invoice_address_county\": \"\",\n      \"invoice_address_country\": \"United Kingdom\",\n      \"invoice_address_postcode\": \"WA11 8SZ\",\n      \"invoice_address_iso\": \"\",\n      \"trade_terms\": 0,\n      \"email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n      \"email_shipping\": null,\n      \"email_cc_1\": \"Hidayet.Arasan@thedespatchcompany.com\",\n      \"email_cc_2\": \"Hidayet.Arasan@thedespatchcompany.com\",\n      \"phone_one\": \"05555555555\",\n      \"phone_two\": null,\n      \"notes\": null,\n      \"custom_fields\": {},\n      \"vat_number\": null,\n      \"eori_number\": null,\n      \"ioss_number\": null,\n      \"ukims_number\": null,\n      \"account_number\": null,\n      \"tax_id\": null,\n      \"accounts_id\": null,\n      \"payment_currency\": \"GBP\",\n      \"default_delivery_instructions\": null,\n      \"created_at\": \"2026-02-25 13:51:31\",\n      \"updated_at\": \"2026-02-25 13:51:47\"\n    }\n  ]\n}"}],"_postman_id":"c834b71b-c020-4483-91ed-1d41f969c102"},{"name":"Get Contact Detail","id":"43ddc951-da4e-44de-b7e3-071e0bf07edf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/contact/","description":"<p>Returns the full record for a single contact (customer or supplier).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — numeric contact ID.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The full <code>contact</code> record with <code>custom_fields</code> decoded into an object. Returns <code>404</code> if not found, <code>401</code> if a fulfilment-client user requests another client's contact.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["contact",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"0c0865b6-5f24-489f-b01a-5abac978855b","name":"200 — contact found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/contact/","description":"Returns the full record for a single contact (customer or supplier).\n\n### Path parameter\n- `` — numeric contact ID.\n\n### Response\nThe full `contact` record with `custom_fields` decoded into an object. Returns `404` if not found, `401` if a fulfilment-client user requests another client's contact.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5779,\n  \"contact_type\": 2,\n  \"is_archived\": 0,\n  \"fulfilment_client_id\": null,\n  \"shipping_name_company\": \"Hidayet Arasan\",\n  \"shipping_name\": \"Hidayet Arasan\",\n  \"shipping_address_line_one\": \"1 Sandwash Business Park\",\n  \"shipping_address_line_two\": \"Sandwash Close Rainford\",\n  \"shipping_address_city\": \"St. Helens\",\n  \"shipping_address_county\": \"\",\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"WA11 8SZ\",\n  \"shipping_address_iso\": \"\",\n  \"invoice_name_company\": \"Hidayet Arasan\",\n  \"invoice_name\": \"Hidayet Arasan\",\n  \"invoice_address_line_one\": \"1 Sandwash Business Park\",\n  \"invoice_address_line_two\": \"Sandwash Close Rainford\",\n  \"invoice_address_city\": \"St. Helens\",\n  \"invoice_address_county\": \"\",\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"WA11 8SZ\",\n  \"invoice_address_iso\": \"\",\n  \"trade_terms\": 0,\n  \"email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"email_shipping\": null,\n  \"email_cc_1\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"email_cc_2\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"phone_one\": \"05555555555\",\n  \"phone_two\": null,\n  \"notes\": null,\n  \"custom_fields\": {},\n  \"vat_number\": null,\n  \"eori_number\": null,\n  \"ioss_number\": null,\n  \"ukims_number\": null,\n  \"account_number\": null,\n  \"tax_id\": null,\n  \"accounts_id\": null,\n  \"payment_currency\": \"GBP\",\n  \"default_delivery_instructions\": null,\n  \"created_at\": \"2026-02-25 13:51:31\",\n  \"updated_at\": \"2026-02-25 13:51:47\"\n}"}],"_postman_id":"43ddc951-da4e-44de-b7e3-071e0bf07edf"},{"name":"Create Customer","id":"df86d5d9-9aa7-410c-ad91-75d646c39520","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    // ----- Identity -----\n    \"email\":      \"customer@example.com\",   // REQUIRED\n    \"email_cc_1\": \"\",\n    \"email_cc_2\": \"\",\n    \"phone_one\":  \"+44 1234 567890\",\n    \"phone_two\":  \"\",\n\n    // ----- Shipping address -----\n    \"shipping_name\":              \"Customer Name\",\n    \"shipping_name_company\":      \"\",\n    \"shipping_address_line_one\":  \"1 Example Street\",\n    \"shipping_address_line_two\":  \"\",\n    \"shipping_address_city\":      \"London\",\n    \"shipping_address_county\":    \"\",\n    \"shipping_address_country\":   \"United Kingdom\",\n    \"shipping_address_postcode\":  \"SW1A 1AA\",\n    \"shipping_address_iso\":       \"GB\",            // ISO 3166-1 alpha-2\n\n    // ----- Invoice address (same shape) -----\n    \"invoice_name\":               \"Customer Name\",\n    \"invoice_address_line_one\":   \"1 Example Street\",\n    \"invoice_address_city\":       \"London\",\n    \"invoice_address_country\":    \"United Kingdom\",\n    \"invoice_address_postcode\":   \"SW1A 1AA\",\n    \"invoice_address_iso\":        \"GB\",\n\n    // ----- Compliance / business -----\n    \"vat_number\":         \"\",\n    \"eori_number\":        \"\",\n    \"tax_id\":             \"\",\n    \"ioss_number\":        \"\",\n    \"ukims_number\":       \"\",\n    \"account_number\":     \"\",                // free-text account reference\n    \"notes\":              \"\",\n    \"payment_currency\":   \"GBP\",              // REQUIRED — 3-letter ISO currency code\n\n    \"custom_fields\":      {}                 // validated against contact custom-field schema\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/customers/create","description":"<p>Creates a new customer contact (<code>contact_type = 1</code>).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Primary email.</td>\n</tr>\n<tr>\n<td><code>email_cc_1</code> / <code>email_cc_2</code></td>\n<td>string</td>\n<td>no</td>\n<td>CC emails for notifications.</td>\n</tr>\n<tr>\n<td><code>phone_one</code> / <code>phone_two</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n<tr>\n<td><code>payment_currency</code></td>\n<td>string</td>\n<td>no</td>\n<td>Default <code>GBP</code>. ISO currency code.</td>\n</tr>\n<tr>\n<td><code>shipping_*</code> (name, name_company, address line one/two, city, county, country, postcode, iso)</td>\n<td>string</td>\n<td>most are required for usable orders</td>\n<td>Shipping address.</td>\n</tr>\n<tr>\n<td><code>invoice_*</code> (same fields as shipping)</td>\n<td>string</td>\n<td>most are required for usable orders</td>\n<td>Invoice address.</td>\n</tr>\n<tr>\n<td><code>vat_number</code> / <code>eori_number</code> / <code>tax_id</code> / <code>ioss_number</code> / <code>ukims_number</code></td>\n<td>string</td>\n<td>no</td>\n<td>Compliance numbers.</td>\n</tr>\n<tr>\n<td><code>account_number</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text account reference.</td>\n</tr>\n<tr>\n<td><code>notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text notes.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Auto-set if API user is a fulfilment-client user.</td>\n</tr>\n<tr>\n<td><code>custom_fields</code></td>\n<td>object</td>\n<td>no</td>\n<td>Validated against the contact custom-field schema.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>The created contact record with <code>custom_fields</code> decoded. Includes a few extra fields not shown in the request: <code>trade_terms</code>, <code>accounts_id</code>, <code>default_delivery_instructions</code>, <code>email_shipping</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["customers","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"28e02638-725e-425c-b4ce-bf27a35b0b3f","name":"200 — created customer","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"email\":\"api.customer@example.com\",\"phone_one\":\"+44 1234 567890\",\"payment_currency\":\"GBP\",\"shipping_name\":\"API Customer\",\"shipping_address_line_one\":\"1 Example Street\",\"shipping_address_city\":\"London\",\"shipping_address_country\":\"United Kingdom\",\"shipping_address_postcode\":\"SW1A 1AA\",\"shipping_address_iso\":\"GB\",\"invoice_name\":\"API Customer\",\"invoice_address_line_one\":\"1 Example Street\",\"invoice_address_city\":\"London\",\"invoice_address_country\":\"United Kingdom\",\"invoice_address_postcode\":\"SW1A 1AA\",\"invoice_address_iso\":\"GB\",\"vat_number\":\"GB123456789\"}"},"url":"https://your-company.myhelm.app/public-api/customers/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 5790,\n    \"contact_type\": 1,\n    \"is_archived\": 0,\n    \"fulfilment_client_id\": null,\n    \"shipping_name_company\": \"\",\n    \"shipping_name\": \"API Customer\",\n    \"shipping_address_line_one\": \"1 Example Street\",\n    \"shipping_address_line_two\": \"\",\n    \"shipping_address_city\": \"London\",\n    \"shipping_address_county\": \"\",\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"SW1A 1AA\",\n    \"shipping_address_iso\": \"GB\",\n    \"invoice_name_company\": \"\",\n    \"invoice_name\": \"API Customer\",\n    \"invoice_address_line_one\": \"1 Example Street\",\n    \"invoice_address_city\": \"London\",\n    \"invoice_address_country\": \"United Kingdom\",\n    \"invoice_address_postcode\": \"SW1A 1AA\",\n    \"invoice_address_iso\": \"GB\",\n    \"trade_terms\": 0,\n    \"email\": \"api.customer@example.com\",\n    \"email_shipping\": null,\n    \"email_cc_1\": \"\",\n    \"email_cc_2\": \"\",\n    \"phone_one\": \"+44 1234 567890\",\n    \"phone_two\": \"\",\n    \"notes\": \"\",\n    \"custom_fields\": {},\n    \"vat_number\": \"GB123456789\",\n    \"eori_number\": \"\",\n    \"ioss_number\": \"\",\n    \"ukims_number\": \"\",\n    \"account_number\": \"\",\n    \"tax_id\": \"\",\n    \"accounts_id\": null,\n    \"payment_currency\": \"GBP\",\n    \"default_delivery_instructions\": null,\n    \"created_at\": \"2026-04-30 11:50:00\",\n    \"updated_at\": \"2026-04-30 11:50:00\"\n}"}],"_postman_id":"df86d5d9-9aa7-410c-ad91-75d646c39520"},{"name":"Create Supplier","id":"f297350d-bf0a-47e9-813b-313906c9b0c3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"supplier@example.com\",\n    \"phone_one\": \"+44 1234 567890\",\n\n    \"shipping_name_company\": \"Acme Supplies Ltd\",\n    \"shipping_name\": \"Sales Contact\",\n    \"shipping_address_line_one\": \"5 Industrial Estate\",\n    \"shipping_address_city\": \"Manchester\",\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"M1 1AA\",\n    \"shipping_address_iso\": \"GB\",\n\n    \"invoice_name_company\": \"Acme Supplies Ltd\",\n    \"invoice_name\": \"Accounts\",\n    \"invoice_address_line_one\": \"5 Industrial Estate\",\n    \"invoice_address_city\": \"Manchester\",\n    \"invoice_address_country\": \"United Kingdom\",\n    \"invoice_address_postcode\": \"M1 1AA\",\n    \"invoice_address_iso\": \"GB\",\n\n    \"vat_number\": \"\",\n    \"account_number\": \"SUP-001\",\n    \"notes\": \"\",\n    \"payment_currency\": \"GBP\",\n\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/suppliers/create","description":"<p>Creates a new supplier contact (<code>contact_type = 2</code>).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>Same set as <strong>Create Customer</strong>. The only difference is the resulting record is flagged as a supplier and becomes selectable when creating purchase orders or linking suppliers to inventory.</p>\n<h3 id=\"response\">Response</h3>\n<p>The created contact record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["suppliers","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"db2cfc20-fe93-4df3-92c9-f985df3da3ce","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"supplier@example.com\",\n    \"phone_one\": \"+44 1234 567890\",\n\n    \"shipping_name_company\": \"Acme Supplies Ltd\",\n    \"shipping_name\": \"Sales Contact\",\n    \"shipping_address_line_one\": \"5 Industrial Estate\",\n    \"shipping_address_city\": \"Manchester\",\n    \"shipping_address_country\": \"United Kingdom\",\n    \"shipping_address_postcode\": \"M1 1AA\",\n    \"shipping_address_iso\": \"GB\",\n\n    \"invoice_name_company\": \"Acme Supplies Ltd\",\n    \"invoice_name\": \"Accounts\",\n    \"invoice_address_line_one\": \"5 Industrial Estate\",\n    \"invoice_address_city\": \"Manchester\",\n    \"invoice_address_country\": \"United Kingdom\",\n    \"invoice_address_postcode\": \"M1 1AA\",\n    \"invoice_address_iso\": \"GB\",\n\n    \"vat_number\": \"\",\n    \"account_number\": \"SUP-001\",\n    \"notes\": \"\",\n    \"payment_currency\": \"GBP\",\n\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/suppliers/create","description":"Creates a new supplier contact (`contact_type = 2`).\n\n### Body fields\nSame set as **Create Customer**. The only difference is the resulting record is flagged as a supplier and becomes selectable when creating purchase orders or linking suppliers to inventory.\n\n### Response\nThe created contact record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5795,\n  \"contact_type\": 2,\n  \"is_archived\": 0,\n  \"fulfilment_client_id\": null,\n  \"shipping_name_company\": \"Postman Test Supplies Ltd\",\n  \"shipping_name\": \"Sales Contact\",\n  \"shipping_address_line_one\": \"5 Industrial Estate\",\n  \"shipping_address_line_two\": \"\",\n  \"shipping_address_city\": \"Manchester\",\n  \"shipping_address_county\": \"\",\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"M1 1AA\",\n  \"shipping_address_iso\": \"GB\",\n  \"invoice_name_company\": \"Postman Test Supplies Ltd\",\n  \"invoice_name\": \"Accounts\",\n  \"invoice_address_line_one\": \"5 Industrial Estate\",\n  \"invoice_address_line_two\": \"\",\n  \"invoice_address_city\": \"Manchester\",\n  \"invoice_address_county\": \"\",\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"M1 1AA\",\n  \"invoice_address_iso\": \"GB\",\n  \"trade_terms\": 0,\n  \"email\": \"postman-supplier@example.com\",\n  \"email_shipping\": null,\n  \"email_cc_1\": \"\",\n  \"email_cc_2\": \"\",\n  \"phone_one\": \"+44 1234 567890\",\n  \"phone_two\": \"\",\n  \"notes\": \"\",\n  \"custom_fields\": {},\n  \"vat_number\": \"\",\n  \"eori_number\": \"\",\n  \"ioss_number\": \"\",\n  \"ukims_number\": \"\",\n  \"account_number\": \"POSTMAN-SUP-001\",\n  \"tax_id\": \"\",\n  \"accounts_id\": null,\n  \"payment_currency\": \"GBP\",\n  \"default_delivery_instructions\": null,\n  \"created_at\": \"2026-04-30 13:15:51\",\n  \"updated_at\": \"2026-04-30 13:15:51\"\n}"}],"_postman_id":"f297350d-bf0a-47e9-813b-313906c9b0c3"},{"name":"Update Contact","id":"26d1205d-e424-4777-95fc-828989915a06","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"updated@example.com\",\n    \"phone_one\": \"+44 1234 999999\",\n    \"shipping_address_line_one\": \"New Address\",\n    \"vat_number\": \"GB123456789\",\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/contact//update","description":"<p>Updates an existing contact (works for both customers and suppliers — type is not changeable).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>All optional. Send only the fields you want to change. Same set as <strong>Create Customer</strong> <em>minus</em> <code>contact_type</code> and <code>fulfilment_client_id</code>.</p>\n<h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Empty values are ignored — to clear a field, send a single space or follow up with another approach.</li>\n<li>Custom fields are validated against the contact custom-field schema.</li>\n<li>Fulfilment-client users can only update their own contacts; otherwise <code>401</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated contact record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["contact","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"bc484390-bac9-4f31-934b-1a989871f389","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"email\": \"updated@example.com\",\n    \"phone_one\": \"+44 1234 999999\",\n    \"shipping_address_line_one\": \"New Address\",\n    \"vat_number\": \"GB123456789\",\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/contact//update","description":"Updates an existing contact (works for both customers and suppliers — type is not changeable).\n\n### Body fields\nAll optional. Send only the fields you want to change. Same set as **Create Customer** *minus* `contact_type` and `fulfilment_client_id`.\n\n### Notes\n- Empty values are ignored — to clear a field, send a single space or follow up with another approach.\n- Custom fields are validated against the contact custom-field schema.\n- Fulfilment-client users can only update their own contacts; otherwise `401`.\n\n### Response\nThe updated contact record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5795,\n  \"contact_type\": 2,\n  \"is_archived\": 0,\n  \"fulfilment_client_id\": null,\n  \"shipping_name_company\": \"Postman Test Supplies Ltd\",\n  \"shipping_name\": \"Sales Contact\",\n  \"shipping_address_line_one\": \"New Address Line\",\n  \"shipping_address_line_two\": \"\",\n  \"shipping_address_city\": \"Manchester\",\n  \"shipping_address_county\": \"\",\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"M1 1AA\",\n  \"shipping_address_iso\": \"GB\",\n  \"invoice_name_company\": \"Postman Test Supplies Ltd\",\n  \"invoice_name\": \"Accounts\",\n  \"invoice_address_line_one\": \"5 Industrial Estate\",\n  \"invoice_address_line_two\": \"\",\n  \"invoice_address_city\": \"Manchester\",\n  \"invoice_address_county\": \"\",\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"M1 1AA\",\n  \"invoice_address_iso\": \"GB\",\n  \"trade_terms\": 0,\n  \"email\": \"updated-postman-supplier@example.com\",\n  \"email_shipping\": null,\n  \"email_cc_1\": \"\",\n  \"email_cc_2\": \"\",\n  \"phone_one\": \"+44 1234 999999\",\n  \"phone_two\": \"\",\n  \"notes\": \"\",\n  \"custom_fields\": {},\n  \"vat_number\": \"GB123456789\",\n  \"eori_number\": \"\",\n  \"ioss_number\": \"\",\n  \"ukims_number\": \"\",\n  \"account_number\": \"POSTMAN-SUP-001\",\n  \"tax_id\": \"\",\n  \"accounts_id\": null,\n  \"payment_currency\": \"GBP\",\n  \"default_delivery_instructions\": null,\n  \"created_at\": \"2026-04-30 13:15:51\",\n  \"updated_at\": \"2026-04-30 13:15:51\"\n}"}],"_postman_id":"26d1205d-e424-4777-95fc-828989915a06"},{"name":"Delete Contact","id":"02f313d0-469d-41ca-bc57-67d641e013e5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/contact//delete","description":"<p>Soft-deletes a contact.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Fulfilment-client users can only delete their own contacts.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;contact_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["contact","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"2cbb1e9c-881a-42dd-be66-7f07413b3edb","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/contact//delete","description":"Soft-deletes a contact.\n\n### Constraints\n- Fulfilment-client users can only delete their own contacts.\n\n### Response\n```\n{ \"id\": <contact_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5795\n}"}],"_postman_id":"02f313d0-469d-41ca-bc57-67d641e013e5"}],"id":"56634ee8-ff9f-4fcd-b81a-057830a9bf30","description":"<p>Contacts cover both <strong>customers</strong> (people who place orders) and <strong>suppliers</strong> (companies that supply purchase orders). The two share the same record type and the same detail/update/delete endpoints — only the list and create endpoints split by type.</p>\n<ul>\n<li><code>contact_type = 1</code> → Customer</li>\n<li><code>contact_type = 2</code> → Supplier</li>\n</ul>\n<p>Fulfilment-client users only see contacts that belong to their own client.</p>\n","_postman_id":"56634ee8-ff9f-4fcd-b81a-057830a9bf30","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Locations","item":[{"name":"List Locations","id":"b9fe86fc-6dac-4603-9027-6778a2b36aa2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/locations?page=1&per_page=20","description":"<p>Returns a paginated list of warehouse locations.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting).</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on location name or barcode.</td>\n</tr>\n<tr>\n<td><code>filters[warehouse_id]</code></td>\n<td>int</td>\n<td>Locations inside this warehouse.</td>\n</tr>\n<tr>\n<td><code>filters[type]</code></td>\n<td>int</td>\n<td>Location <code>type_id</code> (see folder description).</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>per_page</code> is capped at <code>1000</code>.</p>\n<h3 id=\"sort\">Sort</h3>\n<p>Fixed: <code>id</code> ascending. There is no <code>sort</code> parameter.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Fulfilment-client users only see locations linked to their client.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a <code>location</code> record with <code>location_name</code>, <code>barcode</code>, <code>warehouse_id</code>, <code>parent_location_id</code>, <code>type_id</code>, <code>priority</code>, <code>pickable</code>, etc.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["locations"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>1-based page number.</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Records per page. Default tenant setting.</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>LIKE-search on <code>location_name</code> and <code>barcode</code>.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Filter by parent warehouse ID. Returns only bins/shelves inside that warehouse.</p>\n","type":"text/plain"},"key":"filters[warehouse_id]","value":""},{"disabled":true,"description":{"content":"<p>Filter by <code>type_id</code> (location type — warehouse / bin / shelf / etc.).</p>\n","type":"text/plain"},"key":"filters[type]","value":""}],"variable":[]}},"response":[{"id":"e698190f-89de-4a58-9742-430b45dac9ae","name":"200 — page of locations","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/locations?per_page=1","host":["https://your-company.myhelm.app/public-api"],"path":["locations"],"query":[{"key":"per_page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 62,\n    \"per_page\": \"1\",\n    \"current_page\": 1,\n    \"last_page\": 62,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/locations?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 1,\n    \"data\": [\n        {\n            \"id\": 1,\n            \"type_id\": null,\n            \"parent_location_id\": null,\n            \"location_name\": \"Default\",\n            \"priority\": 1000,\n            \"pickable\": 1,\n            \"allow_negative\": 0,\n            \"on_hand_stock\": 1,\n            \"warehouse_id\": 6,\n            \"barcode\": \"Default\"\n        }\n    ]\n}"}],"_postman_id":"b9fe86fc-6dac-4603-9027-6778a2b36aa2"},{"name":"Get Location Detail","id":"5e4663d7-dabb-43b3-9fcb-6d9c97c37cdd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/location/","description":"<p>Returns a single location with its address(es) and (recursively) its parent location.</p>\n<h3 id=\"response\">Response</h3>\n<p>The <code>location</code> record plus:</p>\n<ul>\n<li><code>address</code> — array of <code>address</code> records linked to this location (shipment + invoice).</li>\n<li><code>parent</code> — the parent location, recursively (only present if <code>parent_location_id</code> is set).</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Fulfilment-client users can only fetch locations their client is linked to.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["location",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"7a2c51f5-e518-432d-8427-ec94590cd36c","name":"200 — location found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/location/","description":"Returns a single location with its address(es) and (recursively) its parent location.\n\n### Response\nThe `location` record plus:\n- `address` — array of `address` records linked to this location (shipment + invoice).\n- `parent` — the parent location, recursively (only present if `parent_location_id` is set).\n\n### Permissions\nFulfilment-client users can only fetch locations their client is linked to.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1,\n  \"type_id\": null,\n  \"parent_location_id\": null,\n  \"legacy_id\": null,\n  \"location_name\": \"Default\",\n  \"priority\": 1000,\n  \"pickable\": 1,\n  \"allow_box_splitting\": 1,\n  \"allow_negative\": 0,\n  \"on_hand_stock\": 1,\n  \"warehouse_id\": 6,\n  \"deleted\": 0,\n  \"deleted_at\": null,\n  \"pm_plugin_capacity_type\": 2,\n  \"pm_plugin_capacity_value\": 1,\n  \"pm_plugin_current_capacity\": 0,\n  \"pm_plugin_allow_mixed_products\": 1,\n  \"pm_plugin_not_in_use\": 0,\n  \"pm_plugin_has_mixed_product\": 0,\n  \"created_at\": \"0000-00-00 00:00:00\",\n  \"updated_at\": \"2026-02-25 12:00:20\",\n  \"iso_countries\": \"\",\n  \"barcode\": \"Default\",\n  \"address\": false\n}"}],"_postman_id":"5e4663d7-dabb-43b3-9fcb-6d9c97c37cdd"},{"name":"Create Location","id":"ec14681f-9c9a-43bd-a539-9ca85c3c9bc3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    // ----- For a CHILD location (bin / shelf inside a warehouse) -----\n    \"warehouse_id\":       6,             // the parent warehouse's location ID — REQUIRED for children\n    \"type_id\":            5,             // location type ID (5 = Pallet; see the folder description)\n    \"parent_location_id\": 1,             // optional direct parent for hierarchical layouts\n    \"location_name\":      \"A-101-200\",   // REQUIRED display name\n    \"barcode\":            \"A-101-200\",   // optional scannable barcode\n    \"allow_negative\":     false,         // bool, default false\n    \"pickable\":           true,          // bool, default true\n    \"on_hand_stock\":      true,          // bool, default true\n    \"priority\":           1000,          // int, default 1\n\n    // ----- Optional address blocks (creates address records linked to the location) -----\n    \"shipment_address\": {\n        \"company_name\":   \"\",\n        \"line_one\":       \"\",\n        \"line_two\":       \"\",\n        \"city\":           \"\",\n        \"county\":         \"\",\n        \"country\":        \"\",\n        \"postcode\":       \"\",\n        \"iso\":            \"\",\n        \"email\":          \"\",\n        \"phone_number\":   \"\",\n        \"vat_number\":     \"\",\n        \"company_number\": \"\",\n        \"eori_number\":    \"\",\n        \"xeori_number\":   \"\"\n    },\n    \"invoice_address\": null              // same shape as shipment_address; or null to skip\n\n    // ----- For a ROOT WAREHOUSE -----\n    // Omit warehouse_id (or send null), set type_id to the warehouse type ID, and supply a unique location_name.\n    // Example: { \"type_id\": 4, \"location_name\": \"Branch Warehouse\", \"barcode\": \"WH-2\", \"priority\": 1, \"pickable\": true, \"on_hand_stock\": true }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/locations/create","description":"<p>Creates a new location. Use this for both root warehouses and child bins/shelves.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Location type ID.</td>\n</tr>\n<tr>\n<td><code>warehouse_id</code></td>\n<td>int</td>\n<td>conditional</td>\n<td>Required when creating a non-warehouse child. Must be <code>null</code>/omitted when creating a root warehouse (<code>type_id</code> <code>4</code>).</td>\n</tr>\n<tr>\n<td><code>parent_location_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Direct parent location for hierarchical layouts.</td>\n</tr>\n<tr>\n<td><code>location_name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Display name. For warehouses, the name must be unique.</td>\n</tr>\n<tr>\n<td><code>barcode</code></td>\n<td>string</td>\n<td>no</td>\n<td>Scannable barcode for the location.</td>\n</tr>\n<tr>\n<td><code>allow_negative</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>pickable</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>true</code>.</td>\n</tr>\n<tr>\n<td><code>on_hand_stock</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>true</code>.</td>\n</tr>\n<tr>\n<td><code>priority</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Higher = preferred.</td>\n</tr>\n<tr>\n<td><code>shipment_address</code></td>\n<td>object</td>\n<td>no</td>\n<td>If provided, creates a shipping address linked to this location. Fields: <code>company_name</code>, <code>line_one/two</code>, <code>city</code>, <code>county</code>, <code>country</code>, <code>postcode</code>, <code>iso</code>, <code>email</code>, <code>phone_number</code>, plus optional compliance fields (<code>vat_number</code>, <code>eori_number</code>, <code>xeori_number</code>, <code>company_number</code>).</td>\n</tr>\n<tr>\n<td><code>invoice_address</code></td>\n<td>object</td>\n<td>no</td>\n<td>Same shape as <code>shipment_address</code>; creates an invoice address.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li><code>type_id</code> must be a valid location type — invalid IDs return <code>422</code>.</li>\n<li>A warehouse cannot itself be parented under another warehouse.</li>\n<li>Two warehouses cannot share the same <code>location_name</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created <code>location</code> record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["locations","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"bdb59980-3c46-493a-87e2-89254436620c","name":"200 — created bin","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"warehouse_id\":6,\"type_id\":5,\"location_name\":\"API-BIN-001\",\"barcode\":\"API-BIN-001\",\"priority\":1000,\"pickable\":true,\"on_hand_stock\":true}"},"url":"https://your-company.myhelm.app/public-api/locations/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 79,\n    \"type_id\": 5,\n    \"parent_location_id\": null,\n    \"location_name\": \"API-BIN-001\",\n    \"priority\": 1000,\n    \"pickable\": 1,\n    \"allow_negative\": 0,\n    \"on_hand_stock\": 1,\n    \"warehouse_id\": 6,\n    \"deleted\": 0,\n    \"barcode\": \"API-BIN-001\",\n    \"iso_countries\": \"\",\n    \"created_at\": \"2026-04-30 11:51:12\",\n    \"updated_at\": \"2026-04-30 11:51:12\"\n}"},{"id":"26570ea8-2260-45d1-b249-140d1dcff7f1","name":"200 — created warehouse","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"type_id\":4,\"location_name\":\"API Test Warehouse\",\"barcode\":\"API-WH\",\"priority\":1,\"pickable\":true,\"on_hand_stock\":true}"},"url":"https://your-company.myhelm.app/public-api/locations/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 78,\n    \"type_id\": 4,\n    \"parent_location_id\": null,\n    \"location_name\": \"API Test Warehouse\",\n    \"priority\": 1,\n    \"pickable\": 1,\n    \"allow_negative\": 0,\n    \"on_hand_stock\": 1,\n    \"warehouse_id\": null,\n    \"deleted\": 0,\n    \"barcode\": \"API-WH\",\n    \"iso_countries\": \"\",\n    \"created_at\": \"2026-04-30 11:51:12\",\n    \"updated_at\": \"2026-04-30 11:51:12\"\n}"}],"_postman_id":"ec14681f-9c9a-43bd-a539-9ca85c3c9bc3"},{"name":"Update Location","id":"5a74e138-632e-4740-94a7-a5e3dfbc7efb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_name\": \"A-101-200 (renamed)\",\n    \"barcode\": \"A-101-200\",\n    \"priority\": 900,\n    \"pickable\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/location//update","description":"<p>Updates an existing location. Send only the fields you want to change.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>All optional. Same set as <strong>Create Location</strong> (minus the address blocks). Empty values are ignored.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Cannot move a warehouse under another warehouse.</li>\n<li>The new <code>warehouse_id</code> must reference a warehouse location (<code>type_id</code> <code>4</code>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated location record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["location","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"72bf6355-82f4-4116-88b9-ec6f02c23a87","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"location_name\": \"A-101-200 (renamed)\",\n    \"barcode\": \"A-101-200\",\n    \"priority\": 900,\n    \"pickable\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/location//update","description":"Updates an existing location. Send only the fields you want to change.\n\n### Permissions\nNot available to fulfilment-client users.\n\n### Body fields\nAll optional. Same set as **Create Location** (minus the address blocks). Empty values are ignored.\n\n### Constraints\n- Cannot move a warehouse under another warehouse.\n- The new `warehouse_id` must reference a warehouse location (`type_id` `4`).\n\n### Response\nThe updated location record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 80,\n  \"type_id\": 5,\n  \"parent_location_id\": 1,\n  \"legacy_id\": null,\n  \"location_name\": \"POSTMAN-G3-BIN-UPDATED\",\n  \"priority\": 900,\n  \"pickable\": true,\n  \"allow_box_splitting\": 1,\n  \"allow_negative\": 0,\n  \"on_hand_stock\": 1,\n  \"warehouse_id\": 6,\n  \"deleted\": 0,\n  \"deleted_at\": null,\n  \"pm_plugin_capacity_type\": 2,\n  \"pm_plugin_capacity_value\": 1,\n  \"pm_plugin_current_capacity\": 0,\n  \"pm_plugin_allow_mixed_products\": 1,\n  \"pm_plugin_not_in_use\": 0,\n  \"pm_plugin_has_mixed_product\": 0,\n  \"created_at\": \"2026-04-30 13:15:59\",\n  \"updated_at\": \"2026-04-30 13:16:00\",\n  \"iso_countries\": \"\",\n  \"barcode\": \"POSTMAN-G3-BIN-V2\"\n}"}],"_postman_id":"5a74e138-632e-4740-94a7-a5e3dfbc7efb"},{"name":"Delete Location","id":"f99f10b7-1b2e-4b5c-9491-5ce5942d32cd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/location//delete","description":"<p>Soft-deletes a location.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The location must not be in the system's read-only set.</li>\n<li>The location must have zero remaining <code>stock_level_available</code> across inventory; otherwise an error is returned.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;location_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["location","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"6c59e503-72cb-4c2f-8a47-26b189c6951c","name":"Internal Server Error","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/location//delete","description":"Soft-deletes a location.\n\n### Permissions\nNot available to fulfilment-client users.\n\n### Constraints\n- The location must not be in the system's read-only set.\n- The location must have zero remaining `stock_level_available` across inventory; otherwise an error is returned.\n\n### Response\n```\n{ \"id\": <location_id> }\n```\n"},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Internal Server Error\"\n}"}],"_postman_id":"f99f10b7-1b2e-4b5c-9491-5ce5942d32cd"}],"id":"3bb49e8b-e6ed-458c-8412-1ff656f93a7d","description":"<p>Manage warehouse locations — both root warehouses and bins/shelves inside them. Locations form a tree via <code>parent_location_id</code>; the root of each tree is a warehouse location (<code>type_id</code> <code>4</code>).</p>\n<p>The location-create / -update / -delete endpoints are not available to fulfilment-client users (<code>Not available to fulfilment-client users</code>). The list and detail endpoints are available, but for fulfilment-client users they're auto-scoped to locations the client is linked to.</p>\n<h3 id=\"type_id-reference\"><code>type_id</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Tote</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Shelf</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Warehouse</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Pallet</td>\n</tr>\n<tr>\n<td>6</td>\n<td>Box</td>\n</tr>\n<tr>\n<td>7</td>\n<td>Assembly</td>\n</tr>\n<tr>\n<td>99</td>\n<td>Pre Sort</td>\n</tr>\n<tr>\n<td>100</td>\n<td>Zone</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"3bb49e8b-e6ed-458c-8412-1ff656f93a7d","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Purchase Orders","item":[{"name":"List Purchase Orders","id":"a3f53a7e-63ff-46d8-a0aa-da5c2221371a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_orders?page=1","description":"<p>Returns a paginated list of purchase orders.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by tenant settings.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on PO number, supplier name/company/email/postcode, invoice name/company/postcode, shipping name/company/postcode. Use `</td>\n</tr>\n<tr>\n<td><code>filters[date_range]</code></td>\n<td>string</td>\n<td><code>start,end</code> as Unix timestamps, applied to the creation date; the end day is included in full.</td>\n</tr>\n<tr>\n<td><code>filters[status]</code></td>\n<td>int or array</td>\n<td>PO <code>status_id</code> (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[order_tags][]</code></td>\n<td>string</td>\n<td>Tag name(s) attached to the PO.</td>\n</tr>\n<tr>\n<td><code>filters[inventory_id]</code></td>\n<td>int</td>\n<td>POs containing this inventory item.</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_clients][]</code></td>\n<td>int</td>\n<td>POs of these fulfilment clients.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort-options\">Sort options</h3>\n<p><code>sort</code> = <code>name_az</code> / <code>name_za</code> (alphabetical), <code>totalpaid_hl</code> / <code>totalpaid_lh</code> (total paid high to low / low to high), <code>createdat_pr</code> (oldest first). Default: newest first.</p>\n<p>Fulfilment-client users only see their own purchase orders. Each item also carries <code>status_description</code>, the status name.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a PO summary with supplier metadata, totals, status, and <code>custom_fields</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_orders"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code> | <code>totalpaid_hl</code> | <code>totalpaid_lh</code> | <code>createdat_pr</code>. Default: <code>created_at</code> descending.</p>\n","type":"text/plain"},"key":"sort","value":"createdat_pr"},{"disabled":true,"description":{"content":"<p>LIKE-search on PO ID, supplier name/email, and shipping/invoice postcodes.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Two unix timestamps joined by a comma. Filters on <code>created_at</code>.</p>\n","type":"text/plain"},"key":"filters[date_range]","value":"1746000000,1746999999"},{"disabled":true,"description":{"content":"<p>PO status ID. See folder description.</p>\n","type":"text/plain"},"key":"filters[status][]","value":"13"},{"disabled":true,"description":{"content":"<p>PO tag name. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[order_tags][]","value":""},{"disabled":true,"description":{"content":"<p>Return only POs containing this inventory ID.</p>\n","type":"text/plain"},"key":"filters[inventory_id]","value":""},{"disabled":true,"description":{"content":"<p>Fulfilment client ID.</p>\n","type":"text/plain"},"key":"filters[fulfilment_clients][]","value":""}],"variable":[]}},"response":[{"id":"08316b79-6884-4ec7-8033-850ef44c232f","name":"200 — page of POs","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_orders"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 2,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"data\": [\n        {\n            \"id\": 2,\n            \"location_id\": 6,\n            \"purchase_order_id\": \"PO-28939\",\n            \"status_id\": 11,\n            \"supplier_id\": 5779,\n            \"shipping_name_company\": \"Supplier Company\",\n            \"shipping_address_postcode\": \"AB15 4DL\",\n            \"shipping_address_iso\": \"GB\",\n            \"invoice_name_company\": \"Supplier Invoice Company\",\n            \"custom_fields\": {}\n        }\n    ]\n}"}],"_postman_id":"a3f53a7e-63ff-46d8-a0aa-da5c2221371a"},{"name":"Get Purchase Order Detail","id":"ff7874ab-7215-4d98-8a1f-5372690c4cbd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order/","description":"<p>Returns the full PO record including line items (<code>inventory[]</code>) and <code>custom_fields</code>. Returns <code>404</code> if the PO doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"ebb4d188-b310-480b-8438-23e8e6ab5fe1","name":"200 — PO with inventory","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order/","description":"Returns the full PO record including line items (`inventory[]`) and `custom_fields`. Returns `404` if the PO doesn't exist.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6,\n  \"location_id\": 6,\n  \"purchase_order_id\": \"POSTMAN-G8-PO\",\n  \"description\": null,\n  \"status_id\": 14,\n  \"supplier_id\": 5779,\n  \"dropship_order_id\": null,\n  \"dropship_tracking_code\": null,\n  \"dropship_tracking_url\": null,\n  \"fulfilment\": 0,\n  \"fulfilment_client_id\": null,\n  \"shipping_name_company\": \"Hidayet&#39;s Shipment Company\",\n  \"shipping_name\": \"\",\n  \"shipping_address_line_one\": \"Flat 11\",\n  \"shipping_address_line_two\": \"22 King&#39;s Gate\",\n  \"shipping_address_city\": \"Aberdeen\",\n  \"shipping_address_county\": \"\\u0130zmir\",\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"AB15 4DL\",\n  \"shipping_address_iso\": \"GB\",\n  \"shipping_phone_number\": \"05555555555\",\n  \"invoice_name_company\": \"Hidayet&#39;s Invoice Company\",\n  \"invoice_name\": \"\",\n  \"invoice_address_line_one\": \"Apartment 11\",\n  \"invoice_address_line_two\": \"22 Legge Lane\",\n  \"invoice_address_city\": \"Birmingham\",\n  \"invoice_address_county\": \"\\u0130zmir\",\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"B1 3LW\",\n  \"invoice_address_iso\": \"GB\",\n  \"invoice_phone_number\": \"05555555555\",\n  \"supplier_email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"supplier_email_cc_1\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"supplier_email_cc_2\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"supplier_name\": \"Hidayet Arasan\",\n  \"supplier_name_company\": \"Hidayet Arasan\",\n  \"supplier_address_line_one\": \"1 Sandwash Business Park\",\n  \"supplier_address_line_two\": \"Sandwash Close Rainford\",\n  \"supplier_address_city\": \"St. Helens\",\n  \"supplier_address_county\": \"\",\n  \"supplier_address_country\": \"United Kingdom\",\n  \"supplier_address_postcode\": \"WA11 8SZ\",\n  \"supplier_address_iso\": \"\",\n  \"phone_one\": \"05555555555\",\n  \"phone_two\": null,\n  \"deleted\": 0,\n  \"tax_paid\": \"0.0000\",\n  \"total_paid\": \"5.0000\",\n  \"payment_currency\": \"GBP\",\n  \"account_number\": null,\n  \"po_notes\": null,\n  \"delivery_instructions\": null,\n  \"user_id\": 4,\n  \"custom_fields\": {},\n  \"expected_delivery_date\": \"2026-06-01\",\n  \"submitted_at\": \"2026-04-30 13:59:09\",\n  \"completed_at\": null,\n  \"average_delivery_date\": \"2026-04-30\",\n  \"overall_deviation\": 1,\n  \"is_printed\": 0,\n  \"sent_to_supplier_by\": null,\n  \"is_bopis\": 0,\n  \"is_processing\": 0,\n  \"created_at\": \"2026-04-30 13:58:42\",\n  \"updated_at\": \"2026-04-30 13:59:10\",\n  \"po_completed_email_status\": 0,\n  \"inventory\": [\n    {\n      \"id\": 8,\n      \"purchase_order_summary_id\": 6,\n      \"inventory_id\": 1,\n      \"is_delivered\": 0,\n      \"quantity\": 10,\n      \"delivered_quantity\": 3,\n      \"remaining_quantity\": 7,\n      \"unit_price\": \"0.5000\",\n      \"price\": \"5.0000\",\n      \"discount\": \"0.0000\",\n      \"line_total_discount\": \"0.0000\",\n      \"sku\": \"ha_product_test_1\",\n      \"name\": \"HA Product\",\n      \"vendor_sku\": null,\n      \"notes\": null,\n      \"expected_delivery_date\": null,\n      \"delivered_at\": \"2026-04-30\",\n      \"created_at\": \"2026-04-30 13:58:42\",\n      \"updated_at\": \"2026-04-30 12:59:10\"\n    }\n  ],\n  \"status_description\": \"Partially Completed\"\n}"}],"_postman_id":"ff7874ab-7215-4d98-8a1f-5372690c4cbd"},{"name":"Create Purchase Order","id":"7ec17467-5d02-4f33-94d8-7ba07096b503","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"supplier_id\":            5779,                // REQUIRED — contact_type=2 (Supplier)\n    \"location_id\":            6,                   // REQUIRED — warehouse location ID\n    \"purchase_order_id\":      \"PO-INTERNAL-001\",   // optional internal reference (free text)\n    \"expected_delivery_date\": \"2026-05-15\",        // optional date string\n    \"custom_fields\":          {}                   // optional, validated against PO custom-field schema\n    // \"fulfilment_client_id\": null                // auto-set if the API user is a fulfilment-client user\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_orders/create","description":"<p>Creates a new purchase order in <strong>Draft</strong> status (<code>status_id = 11</code>).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>supplier_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Contact ID of an existing supplier.</td>\n</tr>\n<tr>\n<td><code>location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Warehouse location ID. Must be a warehouse location (<code>type_id</code> <code>4</code>) and the user must have access to it.</td>\n</tr>\n<tr>\n<td><code>purchase_order_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Internal reference number (free text).</td>\n</tr>\n<tr>\n<td><code>expected_delivery_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>When the goods are expected. Free-format date string.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Auto-set if the API user is a fulfilment-client user.</td>\n</tr>\n<tr>\n<td><code>custom_fields</code></td>\n<td>object</td>\n<td>no</td>\n<td>Validated against the PO custom-field schema.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"behaviour\">Behaviour</h3>\n<ul>\n<li>The shipping address, invoice address, and supplier details are auto-copied from the supplier and warehouse contact records.</li>\n<li><code>payment_currency</code> is taken from the supplier or the tenant default.</li>\n<li>The PO opens in Draft status.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created PO record with <code>status_description</code> and <code>custom_fields</code>. Address blocks (shipping/invoice/supplier) are pre-filled from the supplier contact and the warehouse record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_orders","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"45adacdb-748a-4606-8217-d36126fd0078","name":"200 — created PO (addresses auto-populated)","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"supplier_id\":5779,\"location_id\":6,\"purchase_order_id\":\"API-PO-001\",\"expected_delivery_date\":\"2026-05-15\"}"},"url":"https://your-company.myhelm.app/public-api/purchase_orders/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 3,\n    \"location_id\": 6,\n    \"purchase_order_id\": \"API-PO-001\",\n    \"description\": null,\n    \"status_id\": 11,\n    \"supplier_id\": 5779,\n    \"fulfilment\": 0,\n    \"fulfilment_client_id\": null,\n    \"shipping_name_company\": \"Warehouse Company\",\n    \"shipping_address_line_one\": \"Warehouse Address Line 1\",\n    \"shipping_address_city\": \"Aberdeen\",\n    \"shipping_address_postcode\": \"AB15 4DL\",\n    \"shipping_address_iso\": \"GB\",\n    \"invoice_name_company\": \"Warehouse Invoice Company\",\n    \"invoice_address_line_one\": \"Invoice Address Line 1\",\n    \"invoice_address_city\": \"Birmingham\",\n    \"invoice_address_postcode\": \"B1 3LW\",\n    \"invoice_address_iso\": \"GB\",\n    \"supplier_email\": \"supplier@example.com\",\n    \"supplier_name\": \"Supplier Name\",\n    \"supplier_address_line_one\": \"Supplier Address Line 1\",\n    \"supplier_address_city\": \"St. Helens\",\n    \"supplier_address_postcode\": \"WA11 8SZ\",\n    \"status_description\": \"Draft\",\n    \"custom_fields\": {}\n}"}],"_postman_id":"7ec17467-5d02-4f33-94d8-7ba07096b503"},{"name":"Update Purchase Order","id":"053ceba0-63a0-4a4e-ae10-8d550829edcb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"status_id\": 13,\n    \"description\": \"\",\n    \"expected_delivery_date\": \"2026-05-20\",\n    \"supplier_email\": \"sales@supplier.com\",\n    \"phone_one\": \"\",\n    \"phone_two\": \"\",\n\n    \"shipping_address_line_one\": \"\",\n    \"shipping_address_postcode\": \"\",\n\n    \"invoice_address_line_one\": \"\",\n    \"invoice_address_postcode\": \"\",\n\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//update","description":"<p>Updates a purchase order. Send only the fields you want to change.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>All optional:</p>\n<ul>\n<li><code>status_id</code> — see PO status enum in folder description.</li>\n<li><code>location_id</code> — must be a valid warehouse location (<code>type_id</code> <code>4</code>).</li>\n<li><code>payment_currency</code>, <code>description</code>, <code>expected_delivery_date</code>.</li>\n<li><code>supplier_email</code>, <code>supplier_email_cc_1</code>, <code>supplier_email_cc_2</code>, <code>phone_one</code>, <code>phone_two</code>.</li>\n<li>Supplier contact info: company / name fields.</li>\n<li>Shipping address fields: <code>shipping_address_line_one/two</code>, <code>shipping_address_city</code>, <code>shipping_address_county</code>, <code>shipping_address_country</code>, <code>shipping_address_postcode</code>, <code>shipping_address_iso</code>.</li>\n<li>Invoice address fields: same shape as shipping.</li>\n<li><code>custom_fields</code> — object.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li><code>location_id</code>, if sent, must be a non-null valid warehouse the user has access to. <code>null</code> is rejected.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated PO record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"854cff9a-e861-43ff-9899-f2f397c37af3","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"status_id\": 13,\n    \"description\": \"\",\n    \"expected_delivery_date\": \"2026-05-20\",\n    \"supplier_email\": \"sales@supplier.com\",\n    \"phone_one\": \"\",\n    \"phone_two\": \"\",\n\n    \"shipping_address_line_one\": \"\",\n    \"shipping_address_postcode\": \"\",\n\n    \"invoice_address_line_one\": \"\",\n    \"invoice_address_postcode\": \"\",\n\n    \"custom_fields\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//update","description":"Updates a purchase order. Send only the fields you want to change.\n\n### Body fields\nAll optional:\n- `status_id` — see PO status enum in folder description.\n- `location_id` — must be a valid warehouse location (`type_id` `4`).\n- `payment_currency`, `description`, `expected_delivery_date`.\n- `supplier_email`, `supplier_email_cc_1`, `supplier_email_cc_2`, `phone_one`, `phone_two`.\n- Supplier contact info: company / name fields.\n- Shipping address fields: `shipping_address_line_one/two`, `shipping_address_city`, `shipping_address_county`, `shipping_address_country`, `shipping_address_postcode`, `shipping_address_iso`.\n- Invoice address fields: same shape as shipping.\n- `custom_fields` — object.\n\n### Constraints\n- `location_id`, if sent, must be a non-null valid warehouse the user has access to. `null` is rejected.\n\n### Response\nThe updated PO record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4,\n  \"location_id\": 6,\n  \"purchase_order_id\": \"POSTMAN-G4-PO-TEST\",\n  \"description\": \"Updated PO description from Postman test\",\n  \"status_id\": 13,\n  \"supplier_id\": 5779,\n  \"dropship_order_id\": null,\n  \"dropship_tracking_code\": null,\n  \"dropship_tracking_url\": null,\n  \"fulfilment\": 0,\n  \"fulfilment_client_id\": null,\n  \"shipping_name_company\": \"Hidayet&#39;s Shipment Company\",\n  \"shipping_name\": \"\",\n  \"shipping_address_line_one\": \"Flat 11\",\n  \"shipping_address_line_two\": \"22 King&#39;s Gate\",\n  \"shipping_address_city\": \"Aberdeen\",\n  \"shipping_address_county\": \"\\u0130zmir\",\n  \"shipping_address_country\": \"United Kingdom\",\n  \"shipping_address_postcode\": \"AB15 4DL\",\n  \"shipping_address_iso\": \"GB\",\n  \"shipping_phone_number\": \"05555555555\",\n  \"invoice_name_company\": \"Hidayet&#39;s Invoice Company\",\n  \"invoice_name\": \"\",\n  \"invoice_address_line_one\": \"Apartment 11\",\n  \"invoice_address_line_two\": \"22 Legge Lane\",\n  \"invoice_address_city\": \"Birmingham\",\n  \"invoice_address_county\": \"\\u0130zmir\",\n  \"invoice_address_country\": \"United Kingdom\",\n  \"invoice_address_postcode\": \"B1 3LW\",\n  \"invoice_address_iso\": \"GB\",\n  \"invoice_phone_number\": \"05555555555\",\n  \"supplier_email\": \"updated-supplier@example.com\",\n  \"supplier_email_cc_1\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"supplier_email_cc_2\": \"Hidayet.Arasan@thedespatchcompany.com\",\n  \"supplier_name\": \"Hidayet Arasan\",\n  \"supplier_name_company\": \"Hidayet Arasan\",\n  \"supplier_address_line_one\": \"1 Sandwash Business Park\",\n  \"supplier_address_line_two\": \"Sandwash Close Rainford\",\n  \"supplier_address_city\": \"St. Helens\",\n  \"supplier_address_county\": \"\",\n  \"supplier_address_country\": \"United Kingdom\",\n  \"supplier_address_postcode\": \"WA11 8SZ\",\n  \"supplier_address_iso\": \"\",\n  \"phone_one\": \"+44 99 999 9999\",\n  \"phone_two\": null,\n  \"deleted\": 0,\n  \"tax_paid\": \"0.0000\",\n  \"total_paid\": \"97.5000\",\n  \"payment_currency\": \"GBP\",\n  \"account_number\": null,\n  \"po_notes\": null,\n  \"delivery_instructions\": null,\n  \"user_id\": 4,\n  \"custom_fields\": {},\n  \"expected_delivery_date\": \"2026-05-25\",\n  \"submitted_at\": \"2026-04-30 13:18:57\",\n  \"completed_at\": null,\n  \"average_delivery_date\": null,\n  \"overall_deviation\": 1,\n  \"is_printed\": 0,\n  \"sent_to_supplier_by\": null,\n  \"is_bopis\": 0,\n  \"is_processing\": 0,\n  \"created_at\": \"2026-04-30 13:18:32\",\n  \"updated_at\": \"2026-04-30 13:18:57\",\n  \"po_completed_email_status\": 0,\n  \"status_description\": \"Submitted\"\n}"}],"_postman_id":"053ceba0-63a0-4a4e-ae10-8d550829edcb"},{"name":"Delete Purchase Order","id":"afdc5586-e811-4ccc-8aa2-ce71c6e9f619","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//delete","description":"<p>Soft-deletes a purchase order.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Cannot delete POs in <strong>Completed</strong> (<code>15</code>) or <strong>Partially Completed</strong> (<code>14</code>) status — <code>422</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;po_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"8cf1f619-6ecc-4f60-803e-def345219ead","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//delete","description":"Soft-deletes a purchase order.\n\n### Constraints\n- Cannot delete POs in **Completed** (`15`) or **Partially Completed** (`14`) status — `422`.\n\n### Response\n```\n{ \"id\": <po_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5\n}"},{"id":"8f28297f-9160-43a9-87d7-970dc8060dbf","name":"Validation Error - Has Deliveries","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//delete","description":"Soft-deletes a purchase order.\n\n### Constraints\n- Cannot delete POs in **Completed** (`15`) or **Partially Completed** (`14`) status — `422`.\n\n### Response\n```\n{ \"id\": <po_id> }\n```\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"Completed and Partially Completed Purchase Orders cannot be deleted\"\n}"}],"_postman_id":"afdc5586-e811-4ccc-8aa2-ce71c6e9f619"},{"name":"Add Inventory to PO","id":"1a0721b9-8edc-46f4-9568-556dedb14db4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"inventory_id\":           1,                       // existing inventory record (optional, but required to validate supplier link below)\n            \"sku\":                    \"ha_product_test_1\",     // SKU code\n            \"name\":                   \"HA Product Test - 1\",   // display name on the line\n            \"quantity\":               100,                     // quantity ordered\n            \"unit_price\":             0.50,                    // cost per unit\n            \"line_total_discount\":    0.00,                    // default 0\n            \"vendor_sku\":             \"\",                      // supplier's SKU reference\n            \"notes\":                  \"\",\n            \"expected_delivery_date\": \"2026-05-15\"             // per-line expected date\n        }\n        // ...add more items in the same shape\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//add_inventory","description":"<p>Adds one or more line items to a purchase order.</p>\n<h3 id=\"prerequisite--supplier-link\">Prerequisite — supplier link</h3>\n<p>Each inventory item must be linked to the same supplier as the purchase order before it can be added. If a SKU is not linked to the PO's supplier, the response is <code>partial_success</code> with a per-item error: <em>\"You cannot add a product to a purchase order that is not supplied by the same supplier as the product.\"</em></p>\n<p>Use <strong>Inventory → Suppliers → Add Supplier</strong> on the SKU first (passing the PO's <code>supplier_id</code>), then retry the add.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least one item.</td>\n</tr>\n<tr>\n<td><code>items[].inventory_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Existing inventory record.</td>\n</tr>\n<tr>\n<td><code>items[].name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>items[].sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>SKU code.</td>\n</tr>\n<tr>\n<td><code>items[].vendor_sku</code></td>\n<td>string</td>\n<td>no</td>\n<td>Supplier's SKU code.</td>\n</tr>\n<tr>\n<td><code>items[].quantity</code></td>\n<td>number</td>\n<td>no</td>\n<td>Quantity ordered.</td>\n</tr>\n<tr>\n<td><code>items[].unit_price</code></td>\n<td>number</td>\n<td>no</td>\n<td>Cost per unit.</td>\n</tr>\n<tr>\n<td><code>items[].line_total_discount</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>items[].notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-line note.</td>\n</tr>\n<tr>\n<td><code>items[].expected_delivery_date</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-line expected date.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\": \"success\" | \"partial_success\" | \"fail\",\n  \"result\": {\n    \"items\": [ ...created lines... ],\n    \"errors\": [ { \"input\": {...}, \"error\": \"...\" } ]\n  }\n}\n</code></pre><p>PO totals are recalculated automatically.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","add_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"7af3b5ab-8985-457b-a252-8b2824958ccf","name":"200 — partial_success","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"items\":[{\"inventory_id\":744,\"sku\":\"API-TEST-001\",\"name\":\"API Test Product\",\"quantity\":100,\"unit_price\":5.00}]}"},"url":"https://your-company.myhelm.app/public-api/purchase_order/3/add_inventory"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"partial_success\",\n    \"result\": {\n        \"items\": [],\n        \"errors\": [\n            {\n                \"input\": {\n                    \"inventory_id\": 744,\n                    \"sku\": \"API-TEST-001\",\n                    \"name\": \"API Test Product\",\n                    \"quantity\": 100,\n                    \"unit_price\": 5\n                },\n                \"error\": \"You cannot add a product to a purchase order that is not supplied by the same supplier as the product.\"\n            }\n        ]\n    }\n}"}],"_postman_id":"1a0721b9-8edc-46f4-9568-556dedb14db4"},{"name":"Update PO Inventory Item","id":"c2fde7f3-1d46-4cae-b49d-7c1b4c7b394b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": 100,\n    \"quantity\": 150,\n    \"unit_price\": 0.45,\n    \"line_total_discount\": 0.00,\n    \"notes\": \"Updated\",\n    \"expected_delivery_date\": \"2026-05-20\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//update_inventory","description":"<p>Updates a single PO line item.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>purchase_order_inventory_id</code> (int, required).</li>\n<li><code>inventory_id</code>, <code>name</code>, <code>sku</code>, <code>vendor_sku</code>, <code>quantity</code>, <code>unit_price</code>, <code>line_total_discount</code>, <code>notes</code>, <code>expected_delivery_date</code> (all optional).</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The line cannot be updated once it has been delivered (<code>is_delivered = 1</code>) — <code>422</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated line item record. PO totals are recalculated.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","update_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"77cc9a54-b4c6-4ca0-adaa-f1c83efb5b2f","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": 100,\n    \"quantity\": 150,\n    \"unit_price\": 0.45,\n    \"line_total_discount\": 0.00,\n    \"notes\": \"Updated\",\n    \"expected_delivery_date\": \"2026-05-20\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//update_inventory","description":"Updates a single PO line item.\n\n### Body fields\n- `purchase_order_inventory_id` (int, required).\n- `inventory_id`, `name`, `sku`, `vendor_sku`, `quantity`, `unit_price`, `line_total_discount`, `notes`, `expected_delivery_date` (all optional).\n\n### Constraints\n- The line cannot be updated once it has been delivered (`is_delivered = 1`) — `422`.\n\n### Response\nThe updated line item record. PO totals are recalculated.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5,\n  \"purchase_order_summary_id\": 4,\n  \"inventory_id\": 1,\n  \"is_delivered\": 0,\n  \"quantity\": 200,\n  \"delivered_quantity\": 0,\n  \"remaining_quantity\": 150,\n  \"unit_price\": 0.45,\n  \"price\": 90,\n  \"discount\": \"0.0000\",\n  \"line_total_discount\": 0.5,\n  \"sku\": \"ha_product_test_1\",\n  \"name\": \"HA Product Test - 1 - line 2\",\n  \"vendor_sku\": null,\n  \"notes\": \"Updated by Postman\",\n  \"expected_delivery_date\": \"2026-05-25\",\n  \"delivered_at\": null,\n  \"created_at\": \"2026-04-30 13:18:33\",\n  \"updated_at\": \"2026-04-30 12:18:33\"\n}"}],"_postman_id":"c2fde7f3-1d46-4cae-b49d-7c1b4c7b394b"},{"name":"Remove PO Inventory Item","id":"a392b30f-628c-42f0-abb7-d3bd6ab15174","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": 100\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//remove_inventory","description":"<p>Removes a PO line item.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>purchase_order_inventory_id</code> (int, required).</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Cannot remove a delivered line — <code>422</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;line_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","remove_inventory"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"1f52b585-d6c2-43c6-94da-1fba0ca2ff19","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": 100\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//remove_inventory","description":"Removes a PO line item.\n\n### Body field\n- `purchase_order_inventory_id` (int, required).\n\n### Constraints\n- Cannot remove a delivered line — `422`.\n\n### Response\n```\n{ \"id\": <line_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 6\n}"}],"_postman_id":"a392b30f-628c-42f0-abb7-d3bd6ab15174"},{"name":"Create PO Delivery (Goods-In)","id":"f6e45bd7-00b8-4aef-a4ee-a0fb7b261ca0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": [101, 102],         // PO line IDs to receive against\n    \"quantity\":                    [50, 25],            // received qty per line (parallel array)\n    \"location_id\":                 [1, 1],              // REQUIRED — destination location per line (parallel array)\n    \"delivered_at\":                [\"2026-04-30\", \"2026-04-30\"],   // optional per-line delivery dates\n    \"reference\":                   \"GRN-2026-001\",\n    \"delivered_at_all\":            \"2026-04-30\",        // applied to delivery row's delivered_at when no per-line value\n    \"batch_data\": {}                                    // for batch SKUs: keyed by line index → {batch_values, expire_dates, quantities}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//create_delivery","description":"<p>Records a goods-in delivery against a PO. Increments stock at the receiving location, creates stock-transaction logs, and updates the PO's delivery progress (transitions to <code>Partially Completed</code> or <code>Completed</code>).</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The PO status must be <strong>Submitted</strong> (<code>13</code>) or <strong>Partially Completed</strong> (<code>14</code>).</li>\n<li>The user must have warehouse access for every location used.</li>\n<li>For batch-numbered SKUs, <code>batch_data</code> is required with <code>batch_values[]</code>.</li>\n<li>For serial-numbered SKUs, the per-serial quantity is forced to <code>1</code>.</li>\n<li>A line sent with a <code>quantity</code> of <code>0</code> is ignored: it is not added to the delivery and does not touch stock. If every line in the request has a quantity of <code>0</code>, nothing is recorded and the call returns <code>422</code>.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>purchase_order_inventory_id</code></td>\n<td>int or array of int</td>\n<td>yes</td>\n<td>The PO line(s) being received. Array form lets you receive multiple lines in one delivery.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>number or array of number</td>\n<td>yes</td>\n<td>Quantity(ies) received. Index-aligned with <code>purchase_order_inventory_id</code>. Lines with <code>0</code> are skipped.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text delivery reference / GRN.</td>\n</tr>\n<tr>\n<td><code>delivered_at</code></td>\n<td>string or array of string</td>\n<td>no</td>\n<td>Per-line delivery date. Falls back to <code>delivered_at_all</code>.</td>\n</tr>\n<tr>\n<td><code>delivered_at_all</code></td>\n<td>string</td>\n<td>no</td>\n<td>Fallback delivery date for every line. Defaults to today.</td>\n</tr>\n<tr>\n<td><code>location_id</code></td>\n<td>int or array of int</td>\n<td>no</td>\n<td>Per-line receiving location. Falls back to <code>location_id_all</code>.</td>\n</tr>\n<tr>\n<td><code>location_id_all</code></td>\n<td>int</td>\n<td>no</td>\n<td>Fallback receiving location for every line.</td>\n</tr>\n<tr>\n<td><code>batch_data</code></td>\n<td>object</td>\n<td>no</td>\n<td>For batch- / serial-tracked SKUs: per-line batch info <code>{ batch_values: [...], quantities: [...], expire_dates: [...] }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>The created delivery record. Only the lines with a quantity other than <code>0</code> are part of it.</p>\n<p>Returns <code>422</code> when every line has a quantity of <code>0</code>, or when none of the given PO lines can be found.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","create_delivery"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"05bd1cb7-51bb-4535-b2ce-3552a66471b0","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": [101, 102],\n    \"quantity\": [50, 25],\n    \"reference\": \"GRN-2026-001\",\n    \"delivered_at_all\": \"2026-04-30\",\n    \"location_id_all\": 1,\n    \"batch_data\": {}\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//create_delivery","description":"Records a goods-in delivery against a PO. Increments stock at the receiving location, creates stock-transaction logs, and updates the PO's delivery progress (transitions to `Partially Completed` or `Completed`).\n\n### Constraints\n- The PO status must be **Submitted** (`13`) or **Partially Completed** (`14`).\n- The user must have warehouse access for every location used.\n- For batch-numbered SKUs, `batch_data` is required with `batch_values[]`.\n- For serial-numbered SKUs, the per-serial quantity is forced to `1`.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `purchase_order_inventory_id` | int or array of int | yes | The PO line(s) being received. Array form lets you receive multiple lines in one delivery. |\n| `quantity` | number or array of number | yes | Quantity(ies) received. Index-aligned with `purchase_order_inventory_id`. |\n| `reference` | string | no | Free-text delivery reference / GRN. |\n| `delivered_at` | string or array of string | no | Per-line delivery date. Falls back to `delivered_at_all`. |\n| `delivered_at_all` | string | no | Fallback delivery date for every line. Defaults to today. |\n| `location_id` | int or array of int | no | Per-line receiving location. Falls back to `location_id_all`. |\n| `location_id_all` | int | no | Fallback receiving location for every line. |\n| `batch_data` | object | no | For batch- / serial-tracked SKUs: per-line batch info `{ batch_values: [...], quantities: [...], expire_dates: [...] }`. |\n\n### Response\nThe created delivery record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 27,\n  \"purchase_order_summary_id\": 4,\n  \"user_id\": \"4\",\n  \"delivery_reference\": \"POSTMAN-GRN-001\",\n  \"delivery_key\": null,\n  \"delivered_at\": \"2026-04-30\",\n  \"created_at\": \"2026-04-30 13:19:48\",\n  \"updated_at\": \"2026-04-30 13:19:48\",\n  \"delivery_uuid\": null\n}"},{"id":"0b530f80-11bc-4a8f-b022-df9a6d158658","name":"All quantities 0 (422)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_order_inventory_id\": [\n        101,\n        102\n    ],\n    \"quantity\": [\n        0,\n        0\n    ],\n    \"location_id\": [\n        1,\n        1\n    ],\n    \"reference\": \"GRN-2026-002\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//create_delivery","description":"Records a goods-in delivery against a PO. Increments stock at the receiving location, creates stock-transaction logs, and updates the PO's delivery progress (transitions to `Partially Completed` or `Completed`).\n\n### Constraints\n- The PO status must be **Submitted** (`13`) or **Partially Completed** (`14`).\n- The user must have warehouse access for every location used.\n- For batch-numbered SKUs, `batch_data` is required with `batch_values[]`.\n- For serial-numbered SKUs, the per-serial quantity is forced to `1`.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `purchase_order_inventory_id` | int or array of int | yes | The PO line(s) being received. Array form lets you receive multiple lines in one delivery. |\n| `quantity` | number or array of number | yes | Quantity(ies) received. Index-aligned with `purchase_order_inventory_id`. |\n| `reference` | string | no | Free-text delivery reference / GRN. |\n| `delivered_at` | string or array of string | no | Per-line delivery date. Falls back to `delivered_at_all`. |\n| `delivered_at_all` | string | no | Fallback delivery date for every line. Defaults to today. |\n| `location_id` | int or array of int | no | Per-line receiving location. Falls back to `location_id_all`. |\n| `location_id_all` | int | no | Fallback receiving location for every line. |\n| `batch_data` | object | no | For batch- / serial-tracked SKUs: per-line batch info `{ batch_values: [...], quantities: [...], expire_dates: [...] }`. |\n\n### Response\nThe created delivery record.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"Every delivered quantity is 0, so there is nothing to deliver. Send at least one product with a quantity above 0.\"\n}"}],"_postman_id":"f6e45bd7-00b8-4aef-a4ee-a0fb7b261ca0"},{"name":"Create Multiple PO Deliveries","id":"ca4efdb3-a1d6-4566-b970-c71c60dd0e9f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_orders\": {\n        \"41\": [\n            { \"product_id\": 1, \"quantity\": 50, \"location_id\": 1, \"batch_data\": [] },\n            { \"product_id\": 2, \"quantity\": 25, \"location_id\": 1,\n              \"batch_data\": [ { \"batch_number\": \"LOT-2026-09\", \"expiry_date\": \"2027-09-30\", \"quantity\": 25 } ] }\n        ],\n        \"42\": [\n            { \"product_id\": 1, \"quantity\": 30, \"location_id\": 1, \"batch_data\": [] }\n        ]\n    },\n    \"reference\":        \"GRN-2026-MULTI-001\",   // optional; generated if omitted\n    \"uuid\":             \"b7f1c2d4-0001\",        // optional; repeat calls with the same uuid are rejected\n    \"delivery_key\":     null,                   // optional; merges into an existing delivery with this key\n    \"delivery_charges\": {}                      // optional; per-fulfilment-client charge map\n}\n// Keys of purchase_orders are the internal PO ids. product_id is the inventory_id (not the PO line id).\n// batch_data is required for batch- or serial-tracked items; [] for everything else.","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order/create_deliveries","description":"<p>Records goods-in against one or more purchase orders in a single call. Lines are grouped by purchase order, keyed on the PO's internal <code>id</code> (the integer <code>id</code> field, not the PO number).</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>purchase_orders</code></td>\n<td>object</td>\n<td>yes</td>\n<td>Map of <code>\"&lt;purchase order id&gt;\": [ line, ... ]</code>. Unknown IDs are ignored; if none match, the call fails with <code>400</code>.</td>\n</tr>\n<tr>\n<td><code>purchase_orders.*[].product_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Inventory item ID (the <code>inventory_id</code> on the PO line, not the PO line's own <code>id</code>).</td>\n</tr>\n<tr>\n<td><code>purchase_orders.*[].quantity</code></td>\n<td>number</td>\n<td>yes</td>\n<td>Quantity received. It is spread across the PO's lines for that item in line order; anything above the outstanding quantity is still booked in as an over-delivery.</td>\n</tr>\n<tr>\n<td><code>purchase_orders.*[].location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Location the stock is booked into.</td>\n</tr>\n<tr>\n<td><code>purchase_orders.*[].batch_data</code></td>\n<td>array</td>\n<td>conditional</td>\n<td>Required for batch- or serial-tracked items; without it the line's stock is not booked in. Each entry is either a plain string (the batch value, quantity <code>1</code>, no expiry) or an object <code>{ \"batch_number\": \"...\", \"expiry_date\": \"YYYY-MM-DD\" or null, \"quantity\": n }</code>. Serial-numbered items always take quantity <code>1</code> per entry.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>no</td>\n<td>Delivery reference. Generated when omitted.</td>\n</tr>\n<tr>\n<td><code>uuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own unique ID for this delivery. A repeat call with the same <code>uuid</code> for a PO is rejected with <code>400</code>, which protects against duplicate goods-in on retries.</td>\n</tr>\n<tr>\n<td><code>delivery_key</code></td>\n<td>string</td>\n<td>no</td>\n<td>Groups lines into an existing delivery: when a delivery with this key already exists on the PO, the new lines are merged into it and quantities are added. Resending the same lines with the same key therefore books the stock in again.</td>\n</tr>\n<tr>\n<td><code>delivery_charges</code></td>\n<td>object</td>\n<td>no</td>\n<td>Charges to pass to client billing, keyed by fulfilment client ID: <code>{ \"&lt;client id&gt;\": [ { \"quantity\": n, ... } ] }</code>. Usually omitted.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"behaviour\">Behaviour</h3>\n<ul>\n<li>A single PO with up to 100 lines is processed immediately. More than one PO, or more than 100 lines for a PO, is processed in the background in blocks of 100 lines; the PO is flagged as processing until the last block finishes, and the call still returns <code>SUCCESS</code> straight away.</li>\n<li>The delivery date is the current date. Unlike <strong>Create PO Delivery</strong>, the PO status is not checked, so deliveries can be recorded against any PO.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p><code>{ \"status\": \"SUCCESS\", \"delivery_list\": [], \"warning_list\": [] }</code>. Read the resulting deliveries back with <strong>List PO Deliveries</strong> (filter on <code>create_date_range</code>) or <strong>Get Purchase Order Detail</strong>.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No purchase order in <code>purchase_orders</code> exists</td>\n<td><code>400</code> <code>{\"status\": \"ERROR\", \"message\": \"Purchase Orders cannot be found.\"}</code></td>\n</tr>\n<tr>\n<td><code>uuid</code> already used for that PO</td>\n<td><code>400</code> <code>{\"status\": \"ERROR\", \"message\": \"One or More Delivery Already Processed\"}</code> (or <code>\"... Already Queued\"</code> while a background block is pending)</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","create_deliveries"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"44eba543-31af-49fe-910f-d6e6be8d4782","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"purchase_orders\": {\n        \"41\": [\n            { \"product_id\": 1, \"quantity\": 50, \"location_id\": 1, \"batch_data\": [] },\n            { \"product_id\": 2, \"quantity\": 25, \"location_id\": 1,\n              \"batch_data\": [ { \"batch_number\": \"LOT-2026-09\", \"expiry_date\": \"2027-09-30\", \"quantity\": 25 } ] }\n        ],\n        \"42\": [\n            { \"product_id\": 1, \"quantity\": 30, \"location_id\": 1, \"batch_data\": [] }\n        ]\n    },\n    \"reference\":        \"GRN-2026-MULTI-001\",   // optional; generated if omitted\n    \"uuid\":             \"b7f1c2d4-0001\",        // optional; repeat calls with the same uuid are rejected\n    \"delivery_key\":     null,                   // optional; merges into an existing delivery with this key\n    \"delivery_charges\": {}                      // optional; per-fulfilment-client charge map\n}\n// Keys of purchase_orders are the internal PO ids. product_id is the inventory_id (not the PO line id).\n// batch_data is required for batch- or serial-tracked items; [] for everything else.","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order/create_deliveries","description":"Bulk variant of **Create PO Delivery** — receive across multiple POs in a single call. Each entry follows the same shape as the single-PO endpoint, with the addition of `purchase_order_id` to identify which PO each entry belongs to.\n\n### Response\nProcessed delivery results, per delivery.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"SUCCESS\",\n  \"delivery_list\": [],\n  \"warning_list\": []\n}"}],"_postman_id":"ca4efdb3-a1d6-4566-b970-c71c60dd0e9f"},{"name":"List PO Deliveries","id":"160cd408-95c2-4afd-bbaa-1b428d363d43","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_deliveries?page=1","description":"<p>Returns a paginated list of all PO deliveries (goods-in records) across all POs. Each entry embeds <code>delivery_inventory[]</code> with nested <code>inventory[]</code> references back to the source PO line items.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by the tenant <em>Items per page</em> setting.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on the PO number. Use `</td>\n</tr>\n<tr>\n<td><code>filters[date_range]</code></td>\n<td>string</td>\n<td><code>start,end</code> as Unix timestamps, applied to the delivery date.</td>\n</tr>\n<tr>\n<td><code>filters[create_date_range]</code></td>\n<td>string</td>\n<td><code>start,end</code> as Unix timestamps, applied to when the delivery record was created. Use this to pick up deliveries recorded by <strong>Create Multiple PO Deliveries</strong>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Sorted newest first. Fulfilment-client users only see deliveries of their own purchase orders.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_deliveries"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Search by parent PO ID.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Two unix timestamps comma-joined. Filters on <code>delivered_at</code>.</p>\n","type":"text/plain"},"key":"filters[date_range]","value":""},{"disabled":true,"description":{"content":"<p>Two unix timestamps comma-joined. Filters on <code>created_at</code>.</p>\n","type":"text/plain"},"key":"filters[create_date_range]","value":""}],"variable":[]}},"response":[{"id":"4a08dbf1-2c66-47eb-9149-5adc72da3f60","name":"200 — page of deliveries","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/purchase_order_deliveries?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["purchase_order_deliveries"],"query":[{"key":"page","value":"1"},{"key":"filters[search]","value":"","description":"Search by parent PO ID.","disabled":true},{"key":"filters[date_range]","value":"","description":"Two unix timestamps comma-joined. Filters on `delivered_at`.","disabled":true},{"key":"filters[create_date_range]","value":"","description":"Two unix timestamps comma-joined. Filters on `created_at`.","disabled":true}]},"description":"Returns a paginated list of all PO deliveries (goods-in records) across all POs. Each entry embeds `delivery_inventory[]` with nested `inventory[]` references back to the source PO line items.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 28,\n  \"per_page\": \"100\",\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 100,\n  \"data\": [\n    {\n      \"id\": \"29\",\n      \"purchase_order_summary_id\": \"5\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"POSTMAN-GRN-MULTI\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-04-30\",\n      \"created_at\": \"2026-04-30 13:21:10\",\n      \"updated_at\": \"2026-04-30 13:21:10\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 29,\n          \"purchase_order_delivery_id\": 29,\n          \"purchase_order_inventory_id\": 7,\n          \"location_id\": 1,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"ha_product_test_1\",\n          \"name\": \"HA Product Test - 1\",\n          \"quantity\": 5,\n          \"delivered_at\": \"2026-04-30\",\n          \"created_at\": \"2026-04-30 13:21:10\",\n          \"updated_at\": \"2026-04-30 13:21:10\",\n          \"inventory\": [\n            {\n              \"id\": 7,\n              \"purchase_order_summary_id\": 5,\n              \"inventory_id\": 1,\n              \"is_delivered\": 0,\n              \"quantity\": 30,\n              \"delivered_quantity\": 5,\n              \"remaining_quantity\": 25,\n              \"unit_price\": \"0.5000\",\n              \"price\": \"15.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"ha_product_test_1\",\n              \"name\": \"HA Product Test - 1\",\n              \"vendor_sku\": null,\n              \"notes\": null,\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-04-30\",\n              \"created_at\": \"2026-04-30 13:19:23\",\n              \"updated_at\": \"2026-04-30 12:21:10\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"28\",\n      \"purchase_order_summary_id\": \"4\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"POSTMAN-GRN-MULTI\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-04-30\",\n      \"created_at\": \"2026-04-30 13:21:10\",\n      \"updated_at\": \"2026-04-30 13:21:10\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 28,\n          \"purchase_order_delivery_id\": 28,\n          \"purchase_order_inventory_id\": 5,\n          \"location_id\": 1,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"ha_product_test_1\",\n          \"name\": \"HA Product Test - 1 - line 2\",\n          \"quantity\": 5,\n          \"delivered_at\": \"2026-04-30\",\n          \"created_at\": \"2026-04-30 13:21:10\",\n          \"updated_at\": \"2026-04-30 13:21:10\",\n          \"inventory\": [\n            {\n              \"id\": 5,\n              \"purchase_order_summary_id\": 4,\n              \"inventory_id\": 1,\n              \"is_delivered\": 0,\n              \"quantity\": 200,\n              \"delivered_quantity\": 30,\n              \"remaining_quantity\": 170,\n              \"unit_price\": \"0.4500\",\n              \"price\": \"90.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.5000\",\n              \"sku\": \"ha_product_test_1\",\n              \"name\": \"HA Product Test - 1 - line 2\",\n              \"vendor_sku\": null,\n              \"notes\": \"Updated by Postman\",\n              \"expected_delivery_date\": \"2026-05-25\",\n              \"delivered_at\": \"2026-04-30\",\n              \"created_at\": \"2026-04-30 13:18:33\",\n              \"updated_at\": \"2026-04-30 12:21:10\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"27\",\n      \"purchase_order_summary_id\": \"4\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"POSTMAN-GRN-001\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-04-30\",\n      \"created_at\": \"2026-04-30 13:19:48\",\n      \"updated_at\": \"2026-04-30 13:19:48\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 27,\n          \"purchase_order_delivery_id\": 27,\n          \"purchase_order_inventory_id\": 5,\n          \"location_id\": 1,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"ha_product_test_1\",\n          \"name\": \"HA Product Test - 1 - line 2\",\n          \"quantity\": 25,\n          \"delivered_at\": \"2026-04-30\",\n          \"created_at\": \"2026-04-30 13:19:48\",\n          \"updated_at\": \"2026-04-30 13:19:48\",\n          \"inventory\": [\n            {\n              \"id\": 5,\n              \"purchase_order_summary_id\": 4,\n              \"inventory_id\": 1,\n              \"is_delivered\": 0,\n              \"quantity\": 200,\n              \"delivered_quantity\": 30,\n              \"remaining_quantity\": 170,\n              \"unit_price\": \"0.4500\",\n              \"price\": \"90.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.5000\",\n              \"sku\": \"ha_product_test_1\",\n              \"name\": \"HA Product Test - 1 - line 2\",\n              \"vendor_sku\": null,\n              \"notes\": \"Updated by Postman\",\n              \"expected_delivery_date\": \"2026-05-25\",\n              \"delivered_at\": \"2026-04-30\",\n              \"created_at\": \"2026-04-30 13:18:33\",\n              \"updated_at\": \"2026-04-30 12:21:10\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"25\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/26\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:48:05\",\n      \"updated_at\": \"2026-03-11 14:48:05\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 26,\n          \"purchase_order_delivery_id\": 25,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 59,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:48:05\",\n          \"updated_at\": \"2026-03-11 14:48:05\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"24\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/25\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:47:49\",\n      \"updated_at\": \"2026-03-11 14:47:49\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 25,\n          \"purchase_order_delivery_id\": 24,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 58,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:47:49\",\n          \"updated_at\": \"2026-03-11 14:47:49\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"23\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/24\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:11:31\",\n      \"updated_at\": \"2026-03-11 14:11:31\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 24,\n          \"purchase_order_delivery_id\": 23,\n          \"purchase_order_inventory_id\": 2,\n          \"location_id\": 55,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test_2\",\n          \"name\": \"po_test_2\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:11:31\",\n          \"updated_at\": \"2026-03-11 14:11:31\",\n          \"inventory\": [\n            {\n              \"id\": 2,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 5,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 3,\n              \"remaining_quantity\": 97,\n              \"unit_price\": \"10.0000\",\n              \"price\": \"1000.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test_2\",\n              \"name\": \"po_test_2\",\n              \"vendor_sku\": \"po_test_2\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:29\",\n              \"updated_at\": \"2026-03-11 14:11:31\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"22\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/23\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:11:27\",\n      \"updated_at\": \"2026-03-11 14:11:27\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 23,\n          \"purchase_order_delivery_id\": 22,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 54,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:11:27\",\n          \"updated_at\": \"2026-03-11 14:11:27\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"21\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/22\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:11:11\",\n      \"updated_at\": \"2026-03-11 14:11:11\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 22,\n          \"purchase_order_delivery_id\": 21,\n          \"purchase_order_inventory_id\": 2,\n          \"location_id\": 53,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test_2\",\n          \"name\": \"po_test_2\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:11:11\",\n          \"updated_at\": \"2026-03-11 14:11:11\",\n          \"inventory\": [\n            {\n              \"id\": 2,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 5,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 3,\n              \"remaining_quantity\": 97,\n              \"unit_price\": \"10.0000\",\n              \"price\": \"1000.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test_2\",\n              \"name\": \"po_test_2\",\n              \"vendor_sku\": \"po_test_2\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:29\",\n              \"updated_at\": \"2026-03-11 14:11:31\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"20\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/21\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:10:59\",\n      \"updated_at\": \"2026-03-11 14:10:59\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 21,\n          \"purchase_order_delivery_id\": 20,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 52,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:10:59\",\n          \"updated_at\": \"2026-03-11 14:10:59\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"19\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/20\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:10:43\",\n      \"updated_at\": \"2026-03-11 14:10:43\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 20,\n          \"purchase_order_delivery_id\": 19,\n          \"purchase_order_inventory_id\": 2,\n          \"location_id\": 51,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test_2\",\n          \"name\": \"po_test_2\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:10:43\",\n          \"updated_at\": \"2026-03-11 14:10:43\",\n          \"inventory\": [\n            {\n              \"id\": 2,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 5,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 3,\n              \"remaining_quantity\": 97,\n              \"unit_price\": \"10.0000\",\n              \"price\": \"1000.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test_2\",\n              \"name\": \"po_test_2\",\n              \"vendor_sku\": \"po_test_2\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:29\",\n              \"updated_at\": \"2026-03-11 14:11:31\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"18\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/19\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:10:38\",\n      \"updated_at\": \"2026-03-11 14:10:38\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 19,\n          \"purchase_order_delivery_id\": 18,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 50,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:10:38\",\n          \"updated_at\": \"2026-03-11 14:10:38\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"17\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/18\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:08:51\",\n      \"updated_at\": \"2026-03-11 14:08:51\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 18,\n          \"purchase_order_delivery_id\": 17,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 49,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:08:51\",\n          \"updated_at\": \"2026-03-11 14:08:51\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"16\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/17\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:07:37\",\n      \"updated_at\": \"2026-03-11 14:07:37\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 17,\n          \"purchase_order_delivery_id\": 16,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 48,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:07:37\",\n          \"updated_at\": \"2026-03-11 14:07:37\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"15\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/16\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:04:37\",\n      \"updated_at\": \"2026-03-11 14:04:37\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 16,\n          \"purchase_order_delivery_id\": 15,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 47,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:04:37\",\n          \"updated_at\": \"2026-03-11 14:04:37\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"14\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/15\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:02:54\",\n      \"updated_at\": \"2026-03-11 14:02:54\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 15,\n          \"purchase_order_delivery_id\": 14,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 46,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:02:54\",\n          \"updated_at\": \"2026-03-11 14:02:54\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"13\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/14\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 14:01:28\",\n      \"updated_at\": \"2026-03-11 14:01:28\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 14,\n          \"purchase_order_delivery_id\": 13,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 45,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 14:01:28\",\n          \"updated_at\": \"2026-03-11 14:01:28\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"12\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/13\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:56:20\",\n      \"updated_at\": \"2026-03-11 13:56:20\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 13,\n          \"purchase_order_delivery_id\": 12,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 44,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:56:20\",\n          \"updated_at\": \"2026-03-11 13:56:20\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"11\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/12\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:54:20\",\n      \"updated_at\": \"2026-03-11 13:54:20\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 12,\n          \"purchase_order_delivery_id\": 11,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 43,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:54:20\",\n          \"updated_at\": \"2026-03-11 13:54:20\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"10\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/11\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:53:38\",\n      \"updated_at\": \"2026-03-11 13:53:38\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 11,\n          \"purchase_order_delivery_id\": 10,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 42,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:53:38\",\n          \"updated_at\": \"2026-03-11 13:53:38\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"9\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/10\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:49:12\",\n      \"updated_at\": \"2026-03-11 13:49:12\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 10,\n          \"purchase_order_delivery_id\": 9,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 41,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:49:12\",\n          \"updated_at\": \"2026-03-11 13:49:12\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"8\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/09\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:47:43\",\n      \"updated_at\": \"2026-03-11 13:47:43\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 9,\n          \"purchase_order_delivery_id\": 8,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 40,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:47:43\",\n          \"updated_at\": \"2026-03-11 13:47:43\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"7\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/08\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:46:21\",\n      \"updated_at\": \"2026-03-11 13:46:21\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 8,\n          \"purchase_order_delivery_id\": 7,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 39,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:46:21\",\n          \"updated_at\": \"2026-03-11 13:46:21\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"6\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/07\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:43:44\",\n      \"updated_at\": \"2026-03-11 13:43:44\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 7,\n          \"purchase_order_delivery_id\": 6,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 38,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:43:44\",\n          \"updated_at\": \"2026-03-11 13:43:44\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"5\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/06\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 13:00:16\",\n      \"updated_at\": \"2026-03-11 13:00:16\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 6,\n          \"purchase_order_delivery_id\": 5,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 37,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 13:00:16\",\n          \"updated_at\": \"2026-03-11 13:00:16\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"4\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/05\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 12:59:59\",\n      \"updated_at\": \"2026-03-11 12:59:59\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 5,\n          \"purchase_order_delivery_id\": 4,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 36,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 12:59:59\",\n          \"updated_at\": \"2026-03-11 12:59:59\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"3\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/04\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 12:27:05\",\n      \"updated_at\": \"2026-03-11 12:27:05\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 4,\n          \"purchase_order_delivery_id\": 3,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 35,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 12:27:05\",\n          \"updated_at\": \"2026-03-11 12:27:05\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"2\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/02, GI/PO-81296/03\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 12:26:35\",\n      \"updated_at\": \"2026-03-11 12:26:35\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 2,\n          \"purchase_order_delivery_id\": 2,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 33,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 12:26:35\",\n          \"updated_at\": \"2026-03-11 12:26:35\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        },\n        {\n          \"id\": 3,\n          \"purchase_order_delivery_id\": 2,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 34,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 1,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 12:26:35\",\n          \"updated_at\": \"2026-03-11 12:26:35\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"1\",\n      \"purchase_order_summary_id\": \"1\",\n      \"user_id\": \"4\",\n      \"delivery_reference\": \"Pallet Delivery - GI/PO-81296/01\",\n      \"delivery_key\": null,\n      \"delivered_at\": \"2026-03-11\",\n      \"created_at\": \"2026-03-11 12:03:41\",\n      \"updated_at\": \"2026-03-11 12:03:41\",\n      \"delivery_uuid\": null,\n      \"delivery_inventory\": [\n        {\n          \"id\": 1,\n          \"purchase_order_delivery_id\": 1,\n          \"purchase_order_inventory_id\": 1,\n          \"location_id\": 32,\n          \"warehouse_id\": 6,\n          \"address_id\": null,\n          \"sku\": \"po_test\",\n          \"name\": \"po_test\",\n          \"quantity\": 10,\n          \"delivered_at\": \"2026-03-11\",\n          \"created_at\": \"2026-03-11 12:03:41\",\n          \"updated_at\": \"2026-03-11 12:03:41\",\n          \"inventory\": [\n            {\n              \"id\": 1,\n              \"purchase_order_summary_id\": 1,\n              \"inventory_id\": 3,\n              \"is_delivered\": 0,\n              \"quantity\": 100,\n              \"delivered_quantity\": 32,\n              \"remaining_quantity\": 68,\n              \"unit_price\": \"2.0000\",\n              \"price\": \"200.0000\",\n              \"discount\": \"0.0000\",\n              \"line_total_discount\": \"0.0000\",\n              \"sku\": \"po_test\",\n              \"name\": \"po_test\",\n              \"vendor_sku\": \"po_test\",\n              \"notes\": \"\",\n              \"expected_delivery_date\": null,\n              \"delivered_at\": \"2026-03-11\",\n              \"created_at\": \"2026-03-11 12:02:22\",\n              \"updated_at\": \"2026-03-11 14:48:05\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"160cd408-95c2-4afd-bbaa-1b428d363d43"},{"name":"Get PO Delivery Detail","id":"7e7105f4-3227-45d1-a557-1a247e246d79","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_delivery/","description":"<p>Returns a single PO delivery with <code>delivery_inventory[]</code> and nested PO line item references.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_delivery",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b4545670-60ec-40c9-ad9e-d3671eb303b7","name":"200 — delivery found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_delivery/","description":"Returns a single PO delivery with `delivery_inventory[]` and nested PO line item references.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 30,\n  \"purchase_order_summary_id\": 6,\n  \"user_id\": \"4\",\n  \"delivery_reference\": \"POSTMAN-G8-GRN\",\n  \"delivery_key\": null,\n  \"delivered_at\": \"2026-04-30\",\n  \"created_at\": \"2026-04-30 13:59:09\",\n  \"updated_at\": \"2026-04-30 13:59:09\",\n  \"delivery_uuid\": null,\n  \"delivery_inventory\": [\n    {\n      \"id\": 30,\n      \"purchase_order_delivery_id\": 30,\n      \"purchase_order_inventory_id\": 8,\n      \"location_id\": 1,\n      \"warehouse_id\": 6,\n      \"address_id\": null,\n      \"sku\": \"ha_product_test_1\",\n      \"name\": \"HA Product\",\n      \"quantity\": 3,\n      \"delivered_at\": \"2026-04-30\",\n      \"created_at\": \"2026-04-30 13:59:09\",\n      \"updated_at\": \"2026-04-30 13:59:09\",\n      \"inventory\": [\n        {\n          \"id\": 8,\n          \"purchase_order_summary_id\": 6,\n          \"inventory_id\": 1,\n          \"is_delivered\": 0,\n          \"quantity\": 10,\n          \"delivered_quantity\": 3,\n          \"remaining_quantity\": 7,\n          \"unit_price\": \"0.5000\",\n          \"price\": \"5.0000\",\n          \"discount\": \"0.0000\",\n          \"line_total_discount\": \"0.0000\",\n          \"sku\": \"ha_product_test_1\",\n          \"name\": \"HA Product\",\n          \"vendor_sku\": null,\n          \"notes\": null,\n          \"expected_delivery_date\": null,\n          \"delivered_at\": \"2026-04-30\",\n          \"created_at\": \"2026-04-30 13:58:42\",\n          \"updated_at\": \"2026-04-30 12:59:10\"\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"7e7105f4-3227-45d1-a557-1a247e246d79"},{"name":"Get PO Delivery Batch Values","id":"6ab471c0-1d87-4fdb-ab78-1ce1ec9aaebb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/purchase_order_delivery//batch-values","description":"<p>Returns the batch numbers, serial numbers and expiry dates that a delivery booked into stock, one row per batch value per delivery line. Only lines for batch- or serial-tracked items produce rows.</p>\n<h3 id=\"use-cases\">Use cases</h3>\n<ul>\n<li>Reconcile goods-in batches against the supplier's delivery note.</li>\n<li>Capture the expiry dates recorded at goods-in for traceability reports.</li>\n</ul>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Any authenticated user (Supervisor+). Fulfilment-client users can only read deliveries of their own purchase orders (<code>401</code> otherwise).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - the delivery's <code>id</code>, as returned by <strong>List PO Deliveries</strong> or when the delivery was created.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>Array of objects: <code>purchase_order_delivery_inventory_id</code> (the delivery line), <code>batch_value</code> (batch or serial number), <code>expire_date</code> (<code>YYYY-MM-DD</code> or <code>null</code>), <code>quantity</code>, <code>location_id</code> (where the stock was booked in). Returns <code>[]</code> when the delivery has no batch-tracked lines.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Delivery not found</td>\n<td><code>404</code> <code>{\"error\": \"Purchase Order Delivery Not Found\"}</code></td>\n</tr>\n<tr>\n<td>Delivery's purchase order not found</td>\n<td><code>404</code> <code>{\"error\": \"Purchase Order Not Found\"}</code></td>\n</tr>\n<tr>\n<td>Not the caller's purchase order (fulfilment client)</td>\n<td><code>401</code> <code>{\"error\": \"Unauthorised\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_delivery","","batch-values"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"3749eab9-fa16-4dae-90c3-e3627fa349b4","name":"200 - two batches on one line","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/purchase_order_delivery/33/batch-values"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"purchase_order_delivery_inventory_id\": 33,\n    \"batch_value\": \"FIX-BATCH-A-1789736103\",\n    \"expire_date\": \"2029-03-01\",\n    \"quantity\": 5,\n    \"location_id\": 1\n  },\n  {\n    \"purchase_order_delivery_inventory_id\": 33,\n    \"batch_value\": \"FIX-BATCH-B-1789736103\",\n    \"expire_date\": null,\n    \"quantity\": 2,\n    \"location_id\": 1\n  }\n]"},{"id":"9175f845-0bbb-4f45-bcdb-2d745e6050af","name":"200 - no batch-tracked lines","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/purchase_order_delivery/31/batch-values"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[]"},{"id":"a53714e8-7bdb-4eda-994b-8ac0d1105df8","name":"404 - delivery not found","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/purchase_order_delivery/999999/batch-values"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Purchase Order Delivery Not Found\"\n}"}],"_postman_id":"6ab471c0-1d87-4fdb-ab78-1ce1ec9aaebb"},{"name":"List PO Notes","id":"26e998f8-4492-4017-84c4-8ff0ee6cdfbd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//notes","description":"<p>Returns every internal note attached to a PO.</p>\n<h3 id=\"response\">Response</h3>\n<p>Array of note records: <code>{ id, purchase_order_summary_id, note, user_id, created_at }</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","notes"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"d872ae89-2bdb-4250-bc7f-37d2c0ec2a6a","name":"200 — list of notes","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//notes","description":"Returns every internal note attached to a PO.\n\n### Response\nArray of note records: `{ id, purchase_order_summary_id, note, user_id, created_at }`.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 2,\n    \"purchase_order_summary_id\": 6,\n    \"user_id\": \"4\",\n    \"note\": \"Postman G8 test note\",\n    \"created_at\": \"2026-04-30 13:58:43\"\n  }\n]"}],"_postman_id":"26e998f8-4492-4017-84c4-8ff0ee6cdfbd"},{"name":"Add PO Note","id":"74a5dc09-86ed-41af-ab7d-d4dfbcdb5008","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"note\": \"Supplier confirmed shipment will arrive next week.\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//add_note","description":"<p>Adds an internal note to a PO.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>note</code> (string, required, non-empty).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created note record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","add_note"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"f71e71e8-7f24-4ac7-9c37-315f54c82b2b","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"note\": \"Supplier confirmed shipment will arrive next week.\"\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/purchase_order//add_note","description":"Adds an internal note to a PO.\n\n### Body field\n- `note` (string, required, non-empty).\n\n### Response\nThe created note record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1,\n  \"purchase_order_summary_id\": 4,\n  \"user_id\": \"4\",\n  \"note\": \"Supplier confirmed shipment will arrive next week.\",\n  \"created_at\": \"2026-04-30 13:19:09\"\n}"}],"_postman_id":"74a5dc09-86ed-41af-ab7d-d4dfbcdb5008"},{"name":"Delete PO Note","id":"26936f06-e280-4050-b9bc-809c78d8ee79","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//notes/{{note_id}}","description":"<p>Deletes a single PO note. The note must belong to the named PO; otherwise <code>422</code>.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;note_id&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order","","notes","{{note_id}}"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"da84064c-e400-45e2-bff7-496195aca705","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order//notes/{{note_id}}","description":"Deletes a single PO note. The note must belong to the named PO; otherwise `422`.\n\n### Response\n```\n{ \"id\": <note_id> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1\n}"}],"_postman_id":"26936f06-e280-4050-b9bc-809c78d8ee79"}],"id":"d5021889-533f-4ae6-9d6b-6b0fc82195fa","description":"<p>Manage purchase orders (POs) — supplier ordering documents that track inventory coming into the warehouse, plus the deliveries (goods-in records) that fulfil them.</p>\n<h3 id=\"po-status_id-reference\">PO <code>status_id</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>11</td>\n<td>Draft</td>\n</tr>\n<tr>\n<td>12</td>\n<td>On Hold</td>\n</tr>\n<tr>\n<td>13</td>\n<td>Submitted</td>\n</tr>\n<tr>\n<td>14</td>\n<td>Partially Completed</td>\n</tr>\n<tr>\n<td>15</td>\n<td>Completed</td>\n</tr>\n<tr>\n<td>16</td>\n<td>Cancelled</td>\n</tr>\n<tr>\n<td>25</td>\n<td>Archived</td>\n</tr>\n</tbody>\n</table>\n</div><p>Deliveries can only be recorded against POs in <strong>Submitted</strong> (13) or <strong>Partially Completed</strong> (14) status.</p>\n","_postman_id":"d5021889-533f-4ae6-9d6b-6b0fc82195fa","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Purchase Order Tags","item":[{"name":"List PO Tags","id":"ed4a31f3-c854-4353-818e-9d9eab4c3df5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags?page=1","description":"<p>Returns each distinct tag with its PO count.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by the tenant <em>Items per page</em> setting.</p>\n<h3 id=\"filters-and-sorting\">Filters and sorting</h3>\n<ul>\n<li><code>filters[search]</code> - partial match on the tag; use <code>|</code> to OR several terms.</li>\n<li><code>sort</code> = <code>name_az</code> / <code>name_za</code>. Default: tag A to Z.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is <code>{ tag, purchase_order_count }</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_tags"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>One of: <code>name_az</code> | <code>name_za</code>. Default: tag A→Z.</p>\n","type":"text/plain"},"key":"sort","value":"name_az"},{"disabled":true,"description":{"content":"<p>LIKE-search on tag name.</p>\n","type":"text/plain"},"key":"filters[search]","value":""}],"variable":[]}},"response":[{"id":"7edb1be4-f4d4-444d-a2be-67d2bd210c72","name":"200 — page of tags","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": \"1\",\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"data\": [\n        { \"tag\": \"Under Delivered\", \"purchase_order_count\": \"2\" }\n    ]\n}"}],"_postman_id":"ed4a31f3-c854-4353-818e-9d9eab4c3df5"},{"name":"Get PO Tag Detail","id":"51ec5a43-0a9f-4087-a6ab-20fb65fe96ea","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags/","description":"<p>Returns a single tag and the number of POs that carry it.</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> — the tag <em>name</em>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;int&gt;, \"tag\": \"&lt;name&gt;\", \"purchase_order_count\": &lt;int&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_tags",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"ec60e039-3afd-4ffa-9741-92941857d369","name":"200 — tag found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags/","description":"Returns a single tag and the number of POs that carry it.\n\n### Path parameter\n- `` — the tag *name*.\n\n### Response\n```\n{ \"id\": <int>, \"tag\": \"<name>\", \"purchase_order_count\": <int> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 8,\n  \"tag\": \"POSTMAN-G8-PO-TAG\",\n  \"purchase_order_count\": 1\n}"}],"_postman_id":"51ec5a43-0a9f-4087-a6ab-20fb65fe96ea"},{"name":"Attach Tag to PO","id":"0acac6a0-af82-4b05-b759-5622e96b6256","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags//attach/","description":"<p>Attaches a tag to a PO. Idempotent — returns the existing record if the tag is already attached.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Tag must be at least 3 alphanumeric characters.</li>\n<li>PO must exist.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The attachment record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_tags","","attach",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"395cf8bf-45c1-459f-8f40-63c75d1a2858","name":"Success","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags//attach/","description":"Attaches a tag to a PO. Idempotent — returns the existing record if the tag is already attached.\n\n### Constraints\n- Tag must be at least 3 alphanumeric characters.\n- PO must exist.\n\n### Response\nThe attachment record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4,\n  \"purchase_order_summary_id\": 4,\n  \"tag\": \"POSTMAN-PO-TEST-TAG\",\n  \"created_at\": \"2026-04-30 13:19:10\",\n  \"updated_at\": \"2026-04-30 13:19:10\"\n}"}],"_postman_id":"0acac6a0-af82-4b05-b759-5622e96b6256"},{"name":"Detach Tag from PO","id":"792f393e-71e9-4ee4-b476-d1dfad5aa1f3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags//detach/","description":"<p>Removes a tag attachment from a single PO.</p>\n<h3 id=\"response\">Response</h3>\n<p>The deleted attachment record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_tags","","detach",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"6a78ffd8-0e91-472d-a095-47c348104927","name":"Success","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags//detach/","description":"Removes a tag attachment from a single PO.\n\n### Response\nThe deleted attachment record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4,\n  \"purchase_order_summary_id\": 4,\n  \"tag\": \"POSTMAN-PO-TEST-TAG\",\n  \"created_at\": \"2026-04-30 13:19:10\",\n  \"updated_at\": \"2026-04-30 13:19:10\"\n}"}],"_postman_id":"792f393e-71e9-4ee4-b476-d1dfad5aa1f3"},{"name":"Delete PO Tag (Everywhere)","id":"100abb9c-49dc-4bae-87a9-eda5500a6ff5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags//delete","description":"<p>Removes the tag from every PO that carries it. Use with care — this is a global operation.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"tag\": &lt;tag object&gt; }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["purchase_order_tags","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"8bf4ba49-3e49-44f5-884a-e55ff1e678b2","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/purchase_order_tags//delete","description":"Removes the tag from every PO that carries it. Use with care — this is a global operation.\n\n### Response\n```\n{ \"tag\": <tag object> }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"tag\": {\n    \"id\": 5,\n    \"purchase_order_summary_id\": 4,\n    \"tag\": \"POSTMAN-PO-DEL-TAG\",\n    \"created_at\": \"2026-04-30 13:19:11\",\n    \"updated_at\": \"2026-04-30 13:19:11\"\n  }\n}"}],"_postman_id":"100abb9c-49dc-4bae-87a9-eda5500a6ff5"}],"id":"ae10156c-23a7-46ea-bd04-4bae6217b9f5","description":"<p>Free-text tags that group purchase orders. Same model as Order Tags — tags are derived from attachments, so they exist as long as at least one PO carries them. Tags must be at least 3 alphanumeric characters when attached.</p>\n","_postman_id":"ae10156c-23a7-46ea-bd04-4bae6217b9f5","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Shipments","item":[{"name":"List Shipments","id":"0c6cb73d-fb8b-4387-bb34-cf4b9864b20b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/shipments?page=1&per_page=20","description":"<p>Returns a paginated list of outbound shipping labels. Return labels are excluded — query the order detail to see return shipments.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Fulfilment-client users see only their own client's shipments.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting).</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match; use `</td>\n</tr>\n<tr>\n<td><code>filters[date_range]</code></td>\n<td>string</td>\n<td><code>start,end</code> as Unix timestamps on the shipment creation date; the end day is included in full.</td>\n</tr>\n<tr>\n<td><code>filters[last_updated_date_range]</code></td>\n<td>string</td>\n<td><code>start,end</code> as Unix timestamps on the last update; the end day is included in full.</td>\n</tr>\n<tr>\n<td><code>filters[cancelled]</code></td>\n<td>int</td>\n<td><code>1</code> cancelled shipments only, <code>0</code> live shipments only.</td>\n</tr>\n<tr>\n<td><code>filters[order_id]</code></td>\n<td>string</td>\n<td>Matches the internal order ID exactly or the channel order ID partially.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort-options\">Sort options</h3>\n<p><code>sort</code> = <code>total_value_hl</code> / <code>total_value_lh</code> (shipment value high to low / low to high), <code>created_at_pr</code> / <code>created_at_rp</code> (oldest first / newest first). Default: newest first.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope of <code>shipment</code> records with courier, tracking, weight, cost, status and label-fetch flags.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["shipments"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"description":{"content":"<p>Default tenant setting.</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>One of: <code>total_value_hl</code> | <code>total_value_lh</code> | <code>created_at_pr</code> | <code>created_at_rp</code> | <code>updated_at_pr</code> | <code>updated_at_rp</code>. Default: <code>created_at</code> descending.</p>\n","type":"text/plain"},"key":"sort","value":"created_at_rp"},{"disabled":true,"description":{"content":"<p>Free-text search. Pair with <code>filters[search_field]</code> to scope. Single pipe <code>|</code> between terms ORs them.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>One of: <code>auto</code> | <code>search_order_id</code> | <code>search_shipping_name</code> | <code>search_shipping_email</code> | <code>search_shipping_postcode</code> | <code>search_shipping_country</code> | <code>search_shipping_iso</code> | <code>search_shipping_tracking_code</code> | <code>search_shipping_courier</code> | <code>search_shipping_request_id</code> | <code>search_dc_code</code>.</p>\n","type":"text/plain"},"key":"filters[search_field]","value":"auto"},{"disabled":true,"description":{"content":"<p>Two unix timestamps comma-joined. Filters on <code>created_at</code>.</p>\n","type":"text/plain"},"key":"filters[date_range]","value":"1746000000,1746999999"},{"disabled":true,"description":{"content":"<p>Two unix timestamps comma-joined. Filters on <code>updated_at</code>.</p>\n","type":"text/plain"},"key":"filters[last_updated_date_range]","value":""},{"disabled":true,"description":{"content":"<p><code>0</code> = active labels only, <code>1</code> = cancelled labels only.</p>\n","type":"text/plain"},"key":"filters[cancelled]","value":"0"},{"disabled":true,"description":{"content":"<p>Match on the parent <code>channel_order_id</code> (LIKE) or internal order ID (exact).</p>\n","type":"text/plain"},"key":"filters[order_id]","value":""}],"variable":[]}},"response":[{"id":"a59a0364-e580-4815-96eb-0de97dc5da95","name":"200 — page of shipments","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/shipments?per_page=1","host":["https://your-company.myhelm.app/public-api"],"path":["shipments"],"query":[{"key":"per_page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 1795,\n    \"per_page\": \"1\",\n    \"current_page\": 1,\n    \"last_page\": 1795,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/shipments?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 1,\n    \"data\": [\n        {\n            \"id\": 4009,\n            \"order_print_process_id\": 3609,\n            \"request_id\": \"177685339862248299309\",\n            \"cancelled\": 0,\n            \"label_fetched\": 0,\n            \"manifested\": 0,\n            \"is_international\": 0,\n            \"sale_type\": \"b2c\",\n            \"courier_service_id\": 1,\n            \"courier_service_name\": \"CustomIntegrationTestAccountService\",\n            \"capi_courier\": \"Test\",\n            \"shipping_tracking_code\": \"DCT1776853399047\",\n            \"shipping_tracking_urls\": \"https://despatchcloud.com/\",\n            \"shipping_weight\": \"4.000\",\n            \"shipping_cost\": \"0.0000\",\n            \"shipment_total_cost\": \"0.0000\"\n        }\n    ]\n}"}],"_postman_id":"0c6cb73d-fb8b-4387-bb34-cf4b9864b20b"},{"name":"Get Shipment Detail","id":"6bac7543-0b41-41e3-86cd-57a31ab69a6a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/shipment/","description":"<p>Returns a single shipment with embedded order print-process metadata, parcel details, the user/fulfilment client info, and any related return-label shipments.</p>\n<h3 id=\"response\">Response</h3>\n<p>Full <code>shipment</code> record plus:</p>\n<ul>\n<li><code>order_print_process</code> — embedded with merge/split metadata.</li>\n<li><code>pd_options[]</code> — per-parcel detail (decoded from JSON), each containing the inventory packed in the parcel.</li>\n<li><code>user_name</code>, <code>user_id</code>, <code>fulfilment_client_name</code>, <code>fulfilment_client_id</code>.</li>\n<li><code>return_shipments[]</code> — any return labels generated against this shipment.</li>\n</ul>\n<p>Returns <code>404</code> if the shipment doesn't exist or the user is not authorised.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["shipment",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"0e81feb6-f0ae-47d2-a971-4700699c8f70","name":"200 — shipment found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/shipment/","description":"Returns a single shipment with embedded order print-process metadata, parcel details, the user/fulfilment client info, and any related return-label shipments.\n\n### Response\nFull `shipment` record plus:\n- `order_print_process` — embedded with merge/split metadata.\n- `pd_options[]` — per-parcel detail (decoded from JSON), each containing the inventory packed in the parcel.\n- `user_name`, `user_id`, `fulfilment_client_name`, `fulfilment_client_id`.\n- `return_shipments[]` — any return labels generated against this shipment.\n\nReturns `404` if the shipment doesn't exist or the user is not authorised.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4012,\n  \"order_print_process_id\": 3614,\n  \"alt_reference\": \"\",\n  \"request_id\": \"177755185063169199965\",\n  \"label_reference\": \"DC1777551850804\",\n  \"second_label_reference\": null,\n  \"dc_request_id\": 867976402,\n  \"invoiced\": 0,\n  \"cancelled\": 1,\n  \"label_fetched\": 0,\n  \"manifested\": 0,\n  \"is_international\": 0,\n  \"sale_type\": \"B2C\",\n  \"courier_service_id\": 1,\n  \"courier_service_name\": \"CustomIntegrationTestAccountService\",\n  \"capi_courier\": \"Test\",\n  \"shipping_tracking_code\": \"DCT1777551850427\",\n  \"shipping_tracking_urls\": \"https://despatchcloud.com/\",\n  \"shipping_weight\": \"1.000\",\n  \"shipping_cost\": \"2.0000\",\n  \"picking_cost\": \"0.0000\",\n  \"shipment_total_cost\": \"0.0000\",\n  \"parcel_rule_total_cost\": \"0.0000\",\n  \"total_value\": \"4.0000\",\n  \"shipping_label\": \"pdf_test_2Mxvn8Cp8KocZOWRW3tI_1.pdf\",\n  \"shipping_label_type\": \"key\",\n  \"commercial_label\": null,\n  \"commercial_label_type\": \"key\",\n  \"shipping_name_company\": \"\",\n  \"shipping_name\": \"Ship Test\",\n  \"shipping_address_line_one\": \"1 Test St\",\n  \"shipping_address_line_two\": \"\",\n  \"shipping_address_city\": \"London\",\n  \"shipping_address_county\": \"Greater London\",\n  \"shipping_address_country\": \"\",\n  \"shipping_address_postcode\": \"SW1A 1AA\",\n  \"shipping_address_iso\": \"GB\",\n  \"customer_comments\": \"\",\n  \"customs_description\": null,\n  \"email\": \"g5ship@example.com\",\n  \"phone\": \"+44 1234 567890\",\n  \"payment_currency\": \"GBP\",\n  \"total_pick_count\": 1,\n  \"total_pieces\": 1,\n  \"pd_options\": [\n    {\n      \"dim_length\": 1,\n      \"dim_width\": 1,\n      \"dim_height\": 1,\n      \"typeID\": null,\n      \"dim_unit\": \"cm\",\n      \"items\": [\n        {\n          \"description\": \"HA Product Test - 1\",\n          \"extended_description\": \"HA Product Test - 1\",\n          \"origin_country\": null,\n          \"quantity\": 1,\n          \"value\": \"2.00\",\n          \"undiscounted_value\": \"2.00\",\n          \"discount\": 0,\n          \"value_currency\": \"GBP\",\n          \"weight\": 1,\n          \"weight_unit\": \"kg\",\n          \"unit_weight\": 1,\n          \"sku\": \"ha_product_test_1\",\n          \"kit_sku\": null,\n          \"kit_quantity\": null,\n          \"original_quantity\": 1,\n          \"dynamic_component_type\": 0,\n          \"dynamic_component_master_sku\": \"ha_product_test_1\",\n          \"dynamic_component_master_id\": 1,\n          \"product_id\": 1,\n          \"unit_tax\": \"0.0000\",\n          \"order_product_identifier\": 21157,\n          \"price\": \"2.0000\",\n          \"location\": \"\",\n          \"fabric_content\": null,\n          \"options\": \"\",\n          \"sales_channel_item_id\": null,\n          \"channel_product_sku\": null,\n          \"is_used_parcel_formatter\": false,\n          \"hs_code\": \"\",\n          \"image_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n          \"customs_value_applied\": false,\n          \"original_value\": null\n        }\n      ],\n      \"packaging\": {}\n    }\n  ],\n  \"auxiliary_data\": null,\n  \"time_based_picking_time\": null,\n  \"picking_by_packaging_qtys\": null,\n  \"container_picking_qtys\": null,\n  \"sent_to_billing\": 0,\n  \"packing_stocks_used\": null,\n  \"warehouse_id\": null,\n  \"warehouse_address\": null,\n  \"voila_tracking_request_id\": 867976402,\n  \"voila_tracking_request_hash\": 2599145744,\n  \"bbx_pallet_id\": null,\n  \"bbx_parent_id\": null,\n  \"is_return_label\": 0,\n  \"is_smart_shipping\": 0,\n  \"smart_shipping_split_response\": null,\n  \"created_at\": \"2026-04-30 13:24:11\",\n  \"updated_at\": \"2026-04-30 13:24:16\",\n  \"order_print_process\": {\n    \"id\": 3614,\n    \"order_summary_id\": 6316,\n    \"process_ref\": \"DC1777551850804\",\n    \"print_time\": 1777551850,\n    \"created_at\": \"2026-04-30 13:24:10\",\n    \"updated_at\": \"2026-04-30 13:24:10\"\n  },\n  \"user_id\": 4,\n  \"user_name\": \"Hidayet Arasan\",\n  \"return_shipments\": []\n}"}],"_postman_id":"6bac7543-0b41-41e3-86cd-57a31ab69a6a"},{"name":"Book Shipment","id":"a2070bc8-ca00-4e76-bbf6-ea80ed3e042c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_id\": ,\n    \"courier_service_id\": 1,\n    \"tracking_codes\": null,\n    \"customs_description\": null,\n    \"total_weight\": null,\n\n    \"shipping_informations\": {\n        \"shipping_name\": \"Customer Name\",\n        \"shipping_name_company\": \"\",\n        \"shipping_address_line_one\": \"1 Example Street\",\n        \"shipping_address_line_two\": \"\",\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_county\": \"\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 1AA\",\n        \"shipping_address_iso\": \"GB\",\n        \"phone_one\": \"+44 1234 567890\",\n        \"phone_two\": \"\",\n        \"email\": \"customer@example.com\",\n        \"email_shipping\": \"\",\n        \"tax_id\": \"\",\n        \"vat_number\": \"\",\n        \"eori_number\": \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/shipments/book","description":"<p>Generates a shipping label for an order, automatically packing its inventory into parcels and resolving courier-specific configuration.</p>\n<h3 id=\"when-to-use\">When to use</h3>\n<ul>\n<li>After an order is fully allocated and ready to despatch.</li>\n<li>To override the customer's address (use <code>shipping_informations.*</code>) or substitute a different courier service from the one configured for the order.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The internal order ID. Must exist, must be fully allocated (<code>allocation_status_id = 2</code>), and must be in a despatch-eligible status (NOT cancelled / despatched / on-hold / picking / partially-picked / returned / partially-returned / packing / importing).</td>\n</tr>\n<tr>\n<td><code>courier_service_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>A courier service ID from <code>Couriers → List Courier Services</code>. The service must be enabled and its courier currency compatible with the order's <code>payment_currency</code>.</td>\n</tr>\n<tr>\n<td><code>tracking_codes</code></td>\n<td>string | null</td>\n<td>no</td>\n<td>Pre-assigned tracking number(s). Most integrations leave this empty and let the courier generate one.</td>\n</tr>\n<tr>\n<td><code>customs_description</code></td>\n<td>string | null</td>\n<td>no</td>\n<td>Override the customs content description. Falls back to the courier service's configured description.</td>\n</tr>\n<tr>\n<td><code>total_weight</code></td>\n<td>number</td>\n<td>no</td>\n<td>Override the auto-calculated parcel weight.</td>\n</tr>\n<tr>\n<td><code>shipping_informations</code></td>\n<td>object</td>\n<td>yes</td>\n<td>Address &amp; contact details for the parcel. See fields below.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"shipping_informations-fields\"><code>shipping_informations</code> fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>shipping_name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Recipient full name.</td>\n</tr>\n<tr>\n<td><code>shipping_name_company</code></td>\n<td>string</td>\n<td>no</td>\n<td>Recipient company name.</td>\n</tr>\n<tr>\n<td><code>shipping_address_line_one</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Address line 1.</td>\n</tr>\n<tr>\n<td><code>shipping_address_line_two</code></td>\n<td>string</td>\n<td>no</td>\n<td>Address line 2.</td>\n</tr>\n<tr>\n<td><code>shipping_address_city</code></td>\n<td>string</td>\n<td>yes</td>\n<td>City / town.</td>\n</tr>\n<tr>\n<td><code>shipping_address_county</code></td>\n<td>string</td>\n<td>yes</td>\n<td>County / state / region.</td>\n</tr>\n<tr>\n<td><code>shipping_address_country</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Country full name.</td>\n</tr>\n<tr>\n<td><code>shipping_address_postcode</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Postal code.</td>\n</tr>\n<tr>\n<td><code>shipping_address_iso</code></td>\n<td>string</td>\n<td>yes</td>\n<td>ISO 3166-1 alpha-2 country code.</td>\n</tr>\n<tr>\n<td><code>phone_one</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Primary phone.</td>\n</tr>\n<tr>\n<td><code>phone_two</code></td>\n<td>string</td>\n<td>no</td>\n<td>Secondary phone.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Recipient email.</td>\n</tr>\n<tr>\n<td><code>email_shipping</code></td>\n<td>string</td>\n<td>no</td>\n<td>Alternative shipping email.</td>\n</tr>\n<tr>\n<td><code>tax_id</code> / <code>vat_number</code> / <code>eori_number</code></td>\n<td>string</td>\n<td>no</td>\n<td>Customs/compliance numbers.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"parcel-packing-automatic\">Parcel packing (automatic)</h3>\n<p>The API takes the order's allocated inventory, groups it into parcels using the cartonisation engine (respecting per-SKU package configurations and per-courier weight/dimension limits), and emits one or more parcels per shipment. Each parcel auto-includes:</p>\n<ul>\n<li>inventory rows (<code>inventory_id</code>, <code>quantity</code>, weight, <code>p_length</code> / <code>p_width</code> / <code>p_height</code>, HS code, country of origin)</li>\n<li>aggregated parcel weight + dimensions</li>\n<li>packaging type (resolved to a packaging inventory item in the response)</li>\n</ul>\n<p>Where SKU dimensions are missing, the system falls back to the tenant's default item length, width, height and weight settings.</p>\n<h3 id=\"side-effects-on-success\">Side effects on success</h3>\n<ul>\n<li>A <code>shipment</code> record is created and linked to the order.</li>\n<li>The order's status moves to <strong>Despatched</strong> (<code>5</code>).</li>\n<li>The label artefact (PDF / ZPL / etc.) is stored.</li>\n<li>A billing-API record is created.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"success\": true,\n  \"shipment_id\": &lt;int&gt;,\n  \"process_ref\": &lt;int&gt;,\n  \"courier_service_name\": \"&lt;string&gt;\",\n  \"sort_reference\": \"&lt;string&gt;\",\n  \"package_weight\": &lt;float&gt;,\n  \"package_value\": &lt;float&gt;,\n  \"shipping_label\": \"&lt;base64 or URL&gt;\",\n  \"shipping_label_type\": \"pdf\" | \"zpl\" | ...,\n  \"shipping_tracking_code\": \"&lt;string&gt;\",\n  \"shipping_tracking_urls\": [\"&lt;url&gt;\"],\n  \"request_id\": \"&lt;unique request id&gt;\"\n}\n</code></pre><h3 id=\"errors\">Errors</h3>\n<ul>\n<li><code>422</code> — order not eligible (status / allocation / inventory empty), courier service not found, currency mismatch, missing required address fields.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["shipments","book"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"d9503f33-199f-44fe-905a-b7c5e5339463","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_id\": ,\n    \"courier_service_id\": 1,\n    \"tracking_codes\": null,\n    \"customs_description\": null,\n    \"total_weight\": null,\n\n    \"shipping_informations\": {\n        \"shipping_name\": \"Customer Name\",\n        \"shipping_name_company\": \"\",\n        \"shipping_address_line_one\": \"1 Example Street\",\n        \"shipping_address_line_two\": \"\",\n        \"shipping_address_city\": \"London\",\n        \"shipping_address_county\": \"\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"SW1A 1AA\",\n        \"shipping_address_iso\": \"GB\",\n        \"phone_one\": \"+44 1234 567890\",\n        \"phone_two\": \"\",\n        \"email\": \"customer@example.com\",\n        \"email_shipping\": \"\",\n        \"tax_id\": \"\",\n        \"vat_number\": \"\",\n        \"eori_number\": \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/shipments/book","description":"Generates a shipping label for an order, automatically packing its inventory into parcels and resolving courier-specific configuration.\n\n### When to use\n- After an order is fully allocated and ready to despatch.\n- To override the customer's address (use `shipping_informations.*`) or substitute a different courier service from the one configured for the order.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `order_id` | int | yes | The internal order ID. Must exist, must be fully allocated (`allocation_status_id = 2`), and must be in a despatch-eligible status (NOT cancelled / despatched / on-hold / picking / partially-picked / returned / partially-returned / packing / importing). |\n| `courier_service_id` | int | yes | A courier service ID from `Couriers → List Courier Services`. The service must be enabled and its courier currency compatible with the order's `payment_currency`. |\n| `tracking_codes` | string \\| null | no | Pre-assigned tracking number(s). Most integrations leave this empty and let the courier generate one. |\n| `customs_description` | string \\| null | no | Override the customs content description. Falls back to the courier service's configured description. |\n| `total_weight` | number | no | Override the auto-calculated parcel weight. |\n| `shipping_informations` | object | yes | Address & contact details for the parcel. See fields below. |\n\n### `shipping_informations` fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `shipping_name` | string | yes | Recipient full name. |\n| `shipping_name_company` | string | no | Recipient company name. |\n| `shipping_address_line_one` | string | yes | Address line 1. |\n| `shipping_address_line_two` | string | no | Address line 2. |\n| `shipping_address_city` | string | yes | City / town. |\n| `shipping_address_county` | string | yes | County / state / region. |\n| `shipping_address_country` | string | yes | Country full name. |\n| `shipping_address_postcode` | string | yes | Postal code. |\n| `shipping_address_iso` | string | yes | ISO 3166-1 alpha-2 country code. |\n| `phone_one` | string | yes | Primary phone. |\n| `phone_two` | string | no | Secondary phone. |\n| `email` | string | yes | Recipient email. |\n| `email_shipping` | string | no | Alternative shipping email. |\n| `tax_id` / `vat_number` / `eori_number` | string | no | Customs/compliance numbers. |\n\n### Parcel packing (automatic)\nThe API takes the order's allocated inventory, groups it into parcels using the cartonisation engine (respecting per-SKU package configurations and per-courier weight/dimension limits), and emits one or more parcels per shipment. Each parcel auto-includes:\n- inventory rows (`inventory_id`, `quantity`, weight, `p_length` / `p_width` / `p_height`, HS code, country of origin)\n- aggregated parcel weight + dimensions\n- packaging type (resolved to a packaging inventory item in the response)\n\nWhere SKU dimensions are missing, the system falls back to the tenant's default item length, width, height and weight settings.\n\n### Side effects on success\n- A `shipment` record is created and linked to the order.\n- The order's status moves to **Despatched** (`5`).\n- The label artefact (PDF / ZPL / etc.) is stored.\n- A billing-API record is created.\n\n### Response\n```\n{\n  \"success\": true,\n  \"shipment_id\": <int>,\n  \"process_ref\": <int>,\n  \"courier_service_name\": \"<string>\",\n  \"sort_reference\": \"<string>\",\n  \"package_weight\": <float>,\n  \"package_value\": <float>,\n  \"shipping_label\": \"<base64 or URL>\",\n  \"shipping_label_type\": \"pdf\" | \"zpl\" | ...,\n  \"shipping_tracking_code\": \"<string>\",\n  \"shipping_tracking_urls\": [\"<url>\"],\n  \"request_id\": \"<unique request id>\"\n}\n```\n\n### Errors\n- `422` — order not eligible (status / allocation / inventory empty), courier service not found, currency mismatch, missing required address fields.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"type\": \"pdf\",\n  \"data\": \"https://s3.eu-central-003.backblazeb2.com/heyvoila-bucket/courierapi/pdf_test_2Mxvn8Cp8KocZOWRW3tI_1.pdf?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0037342f8477262000000000c%2F20260430%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260430T122411Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=b9469d6e340463abde237b2e7dd58980ce5e69b8f772d8099e145a17febf87da\",\n  \"key\": \"pdf_test_2Mxvn8Cp8KocZOWRW3tI_1.pdf\",\n  \"commercial_label_data\": \"\",\n  \"commercial_label_key\": \"\",\n  \"shipment_id\": 4012,\n  \"printer_name\": \"PDFwriter\",\n  \"label_size\": \"6x4\",\n  \"commercial_label_printer_name\": \"PDFwriter\",\n  \"commercial_label_size\": \"A4\",\n  \"extra_label_data\": null,\n  \"extra_label_printer_name\": \"\",\n  \"extra_label_size\": \"extra\",\n  \"courier_service_name\": \"CustomIntegrationTestAccountService\",\n  \"sort_reference\": null,\n  \"package_weight\": 1,\n  \"package_value\": 4,\n  \"process_ref\": 3614\n}"}],"_postman_id":"a2070bc8-ca00-4e76-bbf6-ea80ed3e042c"},{"name":"Cancel Shipment","id":"e2f06c87-e4d9-4a65-abc2-ed74b16c7341","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"shipment_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/shipments/cancel","description":"<p>Voids a previously-booked label and resets the order back to <strong>Despatch Ready</strong> (<code>status_id = 3</code>).</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>shipment_id</code> (int, required).</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Order's status must be <strong>Despatched</strong> (<code>5</code>) or <strong>Despatch Pending</strong> (<code>2700</code>).</li>\n<li>The manifest must not be finalised (<code>manifested = 0</code>).</li>\n<li>The user must own the order (auth check).</li>\n</ul>\n<h3 id=\"side-effects\">Side effects</h3>\n<ul>\n<li>Cancels the label with the courier where the API supports it.</li>\n<li>Moves the original PDF label to <code>&lt;filename&gt;_cancelled_{shipment_id}.pdf</code> for audit.</li>\n<li>Removes pending billing-API jobs for this shipment.</li>\n<li>Order status reverts to <code>3</code>.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"message\":     \"Label has been successfully canceled and the order has been reset.\",\n  \"shipment_id\": &lt;int&gt;,\n  \"order_id\":    &lt;int&gt;\n}\n</code></pre><p>The order is reset even when the courier refuses to void the label. The call still succeeds, but <code>message</code> then carries the courier's reason followed by <code>The label could not be cancelled at the courier, but your order has been reset.</code> Check with the courier that the label is void before reusing it.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["shipments","cancel"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"4b6f1eeb-fab6-4845-917c-78dd4e77c2f3","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"shipment_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/shipments/cancel","description":"Voids a previously-booked label and resets the order back to **Despatch Ready** (`status_id = 3`).\n\n### Body field\n- `shipment_id` (int, required).\n\n### Constraints\n- Order's status must be **Despatched** (`5`) or **Despatch Pending** (`2700`).\n- The manifest must not be finalised (`manifested = 0`).\n- The user must own the order (auth check).\n\n### Side effects\n- Cancels the label with the courier where the API supports it.\n- Moves the original PDF label to `<filename>_cancelled_{shipment_id}.pdf` for audit.\n- Removes pending billing-API jobs for this shipment.\n- Order status reverts to `3`.\n\n### Response\n```\n{\n  \"message\":     \"Label has been successfully canceled and the order has been reset.\",\n  \"shipment_id\": <int>,\n  \"order_id\":    <int>\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Label has been successfully canceled and the order has been reset.\",\n  \"shipment_id\": 4012,\n  \"order_id\": 6316\n}"},{"id":"1bf7fc2d-c702-4775-add1-58678ad1343c","name":"Success - order reset, courier refused","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"shipment_id\": \n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/shipments/cancel","description":"Voids a previously-booked label and resets the order back to **Despatch Ready** (`status_id = 3`).\n\n### Body field\n- `shipment_id` (int, required).\n\n### Constraints\n- Order's status must be **Despatched** (`5`) or **Despatch Pending** (`2700`).\n- The manifest must not be finalised (`manifested = 0`).\n- The user must own the order (auth check).\n\n### Side effects\n- Cancels the label with the courier where the API supports it.\n- Moves the original PDF label to `<filename>_cancelled_{shipment_id}.pdf` for audit.\n- Removes pending billing-API jobs for this shipment.\n- Order status reverts to `3`.\n\n### Response\n```\n{\n  \"message\":     \"Label has been successfully canceled and the order has been reset.\",\n  \"shipment_id\": <int>,\n  \"order_id\":    <int>\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"royalmail Message: Shipment already collected. The label could not be cancelled at the courier, but your order has been reset.\",\n  \"shipment_id\": 4012,\n  \"order_id\": 6316\n}"}],"_postman_id":"e2f06c87-e4d9-4a65-abc2-ed74b16c7341"}],"id":"ce905d8b-dfbe-4f8a-8f8e-358997a38b5c","description":"<p>Endpoints for booking, listing, retrieving, and cancelling shipping labels. Shipments are anchored to a single order via <code>order_summary_id</code> and carry the courier, parcel, and tracking metadata for despatch.</p>\n","_postman_id":"ce905d8b-dfbe-4f8a-8f8e-358997a38b5c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Couriers","item":[{"name":"List Couriers","id":"970ba45b-8015-469a-a0c9-066b39428d82","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/couriers?page=1","description":"<p>Returns a paginated list of registered couriers (carriers).</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by tenant settings.</p>\n<h3 id=\"sort\">Sort</h3>\n<p>Fixed: <code>created_at</code> descending.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match; use `</td>\n</tr>\n<tr>\n<td><code>filters[test-account]</code></td>\n<td>int or array</td>\n<td><code>1</code> test accounts only, <code>0</code> live accounts only.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a <code>courier</code> record with <code>platform</code>, <code>name</code>, <code>company_name</code>, <code>test_account</code>, <code>data</code> (JSON config), <code>is_smart_shipping</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["couriers"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Free-text search. Pair with <code>filters[search_field]</code>. Single pipe <code>|</code> between terms.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>One of: <code>auto</code> | <code>platform</code> | <code>name</code> | <code>company_name</code>.</p>\n","type":"text/plain"},"key":"filters[search_field]","value":"auto"},{"disabled":true,"description":{"content":"<p>Filter by test-account flag. Send array form for OR (<code>filters[test-account][]=0&amp;filters[test-account][]=1</code>).</p>\n","type":"text/plain"},"key":"filters[test-account]","value":"0"}],"variable":[]}},"response":[{"id":"d02a123b-7217-4375-9280-6ebfc776414c","name":"200 — registered couriers","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/couriers"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 2,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"data\": [\n        {\n            \"id\": \"2\",\n            \"platform\": \"smart-shipping\",\n            \"name\": \"Smart Shipping\",\n            \"company_name\": \"\",\n            \"test_account\": \"0\",\n            \"data\": { \"active\": 1 },\n            \"is_smart_shipping\": \"1\"\n        }\n    ]\n}"}],"_postman_id":"970ba45b-8015-469a-a0c9-066b39428d82"},{"name":"List Courier Services","id":"91122a5d-5cbf-4c0c-8dea-0750c7de50ce","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/couriers/services?page=1","description":"<p>Returns a paginated list of courier services (the actual sellable shipping options under each courier).</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by the tenant <em>Items per page</em> setting. Sorted newest first.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on the service name. Use `</td>\n</tr>\n<tr>\n<td><code>filters[enabled]</code></td>\n<td>int or array</td>\n<td><code>1</code> enabled services only, <code>0</code> disabled only.</td>\n</tr>\n<tr>\n<td><code>filters[courier_id]</code></td>\n<td>int or array</td>\n<td>Services of these couriers.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>Each <code>data[]</code> item includes <code>id</code>, <code>name</code>, <code>enabled</code>, <code>config</code> (decoded JSON), <code>courier_id</code>, <code>local_tracking</code>, <code>local_tracking_url</code>, <code>print_packing_list</code>, <code>print_gift_note_label</code>, <code>label_reference</code>, <code>reference_2</code>, <code>sort_reference</code>, <code>is_bbx</code>, <code>use_third_party_insurance</code>, plus an embedded <code>courier</code> object for the parent courier.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["couriers","services"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>LIKE-search on service name. Single pipe <code>|</code> between terms.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Filter by <code>enabled</code> flag (<code>1</code> or <code>0</code>). Array form for OR.</p>\n","type":"text/plain"},"key":"filters[enabled]","value":"1"},{"disabled":true,"description":{"content":"<p>Filter by parent courier ID. Array form for OR.</p>\n","type":"text/plain"},"key":"filters[courier_id]","value":""}],"variable":[]}},"response":[{"id":"1d97ecc7-3253-42d6-9a03-14f738e53a3e","name":"200 — page of services","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/couriers/services?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["couriers","services"],"query":[{"key":"page","value":"1"},{"key":"filters[search]","value":"","description":"LIKE-search on service name. Single pipe `|` between terms.","disabled":true},{"key":"filters[enabled]","value":"1","description":"Filter by `enabled` flag (`1` or `0`). Array form for OR.","disabled":true},{"key":"filters[courier_id]","value":"","description":"Filter by parent courier ID. Array form for OR.","disabled":true}]},"description":"Returns a paginated list of courier services (the actual sellable shipping options under each courier).\n\n### Response\nEach `data[]` item includes `id`, `name`, `enabled`, `config` (decoded JSON), `courier_id`, `local_tracking`, `local_tracking_url`, `print_packing_list`, `print_gift_note_label`, `label_reference`, `reference_2`, `sort_reference`, `is_bbx`, `use_third_party_insurance`, plus an embedded `courier` object for the parent courier.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 5,\n  \"per_page\": \"100\",\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 100,\n  \"data\": [\n    {\n      \"id\": \"4\",\n      \"name\": \"SmartGroupOne\",\n      \"enabled\": \"1\",\n      \"config\": null,\n      \"courier_id\": \"2\",\n      \"local_tracking\": \"0\",\n      \"print_packing_list\": \"0\",\n      \"print_gift_note_label\": \"0\",\n      \"local_tracking_url\": \"\",\n      \"label_reference\": \"0\",\n      \"reference_2\": \"0\",\n      \"sort_reference\": null,\n      \"is_bbx\": \"0\",\n      \"use_third_party_insurance\": \"0\",\n      \"created_at\": \"2026-03-31 16:07:16\",\n      \"updated_at\": \"2026-04-29 16:27:19\",\n      \"courier\": {\n        \"id\": 2,\n        \"platform\": \"smart-shipping\",\n        \"name\": \"Smart Shipping\",\n        \"company_name\": \"\",\n        \"test_account\": 0,\n        \"data\": {\n          \"active\": 1\n        },\n        \"is_smart_shipping\": 1,\n        \"created_at\": \"2026-03-30 16:06:19\",\n        \"updated_at\": \"2026-03-30 16:06:19\"\n      }\n    },\n    {\n      \"id\": \"5\",\n      \"name\": \"Smart Rule One\",\n      \"enabled\": \"1\",\n      \"config\": null,\n      \"courier_id\": \"2\",\n      \"local_tracking\": \"0\",\n      \"print_packing_list\": \"0\",\n      \"print_gift_note_label\": \"0\",\n      \"local_tracking_url\": \"\",\n      \"label_reference\": \"0\",\n      \"reference_2\": \"0\",\n      \"sort_reference\": null,\n      \"is_bbx\": \"0\",\n      \"use_third_party_insurance\": \"0\",\n      \"created_at\": \"2026-03-31 16:07:16\",\n      \"updated_at\": \"2026-04-29 16:27:19\",\n      \"courier\": {\n        \"id\": 2,\n        \"platform\": \"smart-shipping\",\n        \"name\": \"Smart Shipping\",\n        \"company_name\": \"\",\n        \"test_account\": 0,\n        \"data\": {\n          \"active\": 1\n        },\n        \"is_smart_shipping\": 1,\n        \"created_at\": \"2026-03-30 16:06:19\",\n        \"updated_at\": \"2026-03-30 16:06:19\"\n      }\n    },\n    {\n      \"id\": \"6\",\n      \"name\": \"Smart Rule Two\",\n      \"enabled\": \"1\",\n      \"config\": null,\n      \"courier_id\": \"2\",\n      \"local_tracking\": \"0\",\n      \"print_packing_list\": \"0\",\n      \"print_gift_note_label\": \"0\",\n      \"local_tracking_url\": \"\",\n      \"label_reference\": \"0\",\n      \"reference_2\": \"0\",\n      \"sort_reference\": null,\n      \"is_bbx\": \"0\",\n      \"use_third_party_insurance\": \"0\",\n      \"created_at\": \"2026-03-31 16:07:16\",\n      \"updated_at\": \"2026-04-29 16:27:19\",\n      \"courier\": {\n        \"id\": 2,\n        \"platform\": \"smart-shipping\",\n        \"name\": \"Smart Shipping\",\n        \"company_name\": \"\",\n        \"test_account\": 0,\n        \"data\": {\n          \"active\": 1\n        },\n        \"is_smart_shipping\": 1,\n        \"created_at\": \"2026-03-30 16:06:19\",\n        \"updated_at\": \"2026-03-30 16:06:19\"\n      }\n    },\n    {\n      \"id\": \"7\",\n      \"name\": \"Smart Rule Three\",\n      \"enabled\": \"1\",\n      \"config\": null,\n      \"courier_id\": \"2\",\n      \"local_tracking\": \"0\",\n      \"print_packing_list\": \"0\",\n      \"print_gift_note_label\": \"0\",\n      \"local_tracking_url\": \"\",\n      \"label_reference\": \"0\",\n      \"reference_2\": \"0\",\n      \"sort_reference\": null,\n      \"is_bbx\": \"0\",\n      \"use_third_party_insurance\": \"0\",\n      \"created_at\": \"2026-03-31 16:07:16\",\n      \"updated_at\": \"2026-04-29 16:27:19\",\n      \"courier\": {\n        \"id\": 2,\n        \"platform\": \"smart-shipping\",\n        \"name\": \"Smart Shipping\",\n        \"company_name\": \"\",\n        \"test_account\": 0,\n        \"data\": {\n          \"active\": 1\n        },\n        \"is_smart_shipping\": 1,\n        \"created_at\": \"2026-03-30 16:06:19\",\n        \"updated_at\": \"2026-03-30 16:06:19\"\n      }\n    },\n    {\n      \"id\": \"1\",\n      \"name\": \"CustomIntegrationTestAccountService\",\n      \"enabled\": \"1\",\n      \"config\": null,\n      \"courier_id\": \"1\",\n      \"local_tracking\": \"0\",\n      \"print_packing_list\": \"0\",\n      \"print_gift_note_label\": \"0\",\n      \"local_tracking_url\": \"\",\n      \"label_reference\": \"0\",\n      \"reference_2\": \"0\",\n      \"sort_reference\": null,\n      \"is_bbx\": \"0\",\n      \"use_third_party_insurance\": \"0\",\n      \"created_at\": \"2026-02-25 12:11:28\",\n      \"updated_at\": \"2026-02-25 12:11:28\",\n      \"courier\": {\n        \"id\": 1,\n        \"platform\": \"Test\",\n        \"name\": \"CustomIntegrationTest\",\n        \"company_name\": \"CustomIntegrationTestCompany\",\n        \"test_account\": 0,\n        \"data\": {\n          \"active\": \"1\",\n          \"collection_time\": \"19:00\",\n          \"collection_days\": []\n        },\n        \"is_smart_shipping\": 0,\n        \"created_at\": \"2026-02-25 12:10:49\",\n        \"updated_at\": \"2026-02-25 12:11:03\"\n      }\n    }\n  ]\n}"}],"_postman_id":"91122a5d-5cbf-4c0c-8dea-0750c7de50ce"}],"id":"aa0ddff4-ca8c-4b30-9b9a-ba54fa5d6aaf","description":"<p>Read-only endpoints listing the carriers and courier services configured on the tenant. Use these to look up the <code>courier_service_id</code> you need for <strong>Shipments → Book Shipment</strong> or <strong>Orders → Despatch with Tracking Code</strong>.</p>\n<p>Not available to fulfilment-client users — both endpoints return <code>401 Unauthorised</code> for them.</p>\n","_postman_id":"aa0ddff4-ca8c-4b30-9b9a-ba54fa5d6aaf","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Sales Channels","item":[{"name":"List Sales Channels (All)","id":"da77aa2d-56ff-4d15-ac7a-1655e1806630","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels?page=1","description":"<p>Returns every sales channel — integrated and manual — visible to the user. Fulfilment-client users see only their own channels.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by the tenant <em>Items per page</em> setting. Sorted newest first; there is no <code>sort</code> parameter.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match; use `</td>\n</tr>\n<tr>\n<td><code>filters[type]</code></td>\n<td>string or array</td>\n<td>Channel type, e.g. <code>manual</code>, <code>shopify</code>, <code>amazon</code>.</td>\n</tr>\n<tr>\n<td><code>filters[manual]</code></td>\n<td>int or array</td>\n<td><code>1</code> manual channels only, <code>0</code> integrated channels only.</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_client]</code></td>\n<td>int or array</td>\n<td>Channels of these fulfilment clients.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The same filters apply to <strong>List Manual Sales Channels</strong>, where <code>filters[type]</code> is fixed to manual channels.</p>\n<h3 id=\"response\">Response</h3>\n<p>Each <code>data[]</code> item is a <code>sales_channel</code> record with <code>config</code> decoded into an object. The <code>auto_sync_offset</code> field is omitted (internal use); <code>fulfilment_client_id</code> is omitted for fulfilment-client users.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Search on <code>name</code> and <code>type</code>.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Channel type — <code>manual</code>, <code>amazon</code>, <code>ebay</code>, <code>shopify</code>, <code>woocommerce</code>, <code>aerocommerce</code>, etc.</p>\n","type":"text/plain"},"key":"filters[type][]","value":""},{"disabled":true,"description":{"content":"<p><code>0</code> = integrated channels only, <code>1</code> = manual channels only.</p>\n","type":"text/plain"},"key":"filters[manual][]","value":""},{"disabled":true,"description":{"content":"<p>Filter by fulfilment client ID.</p>\n","type":"text/plain"},"key":"filters[fulfilment_client][]","value":""}],"variable":[]}},"response":[{"id":"ef44eb53-637b-4a38-809e-c9ba7233e080","name":"200 — page of channels","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/sales_channels?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["sales_channels"],"query":[{"key":"page","value":"1"},{"key":"filters[search]","value":"","description":"Search on `name` and `type`.","disabled":true},{"key":"filters[type][]","value":"","description":"Channel type — `manual`, `amazon`, `ebay`, `shopify`, `woocommerce`, `aerocommerce`, etc.","disabled":true},{"key":"filters[manual][]","value":"","description":"`0` = integrated channels only, `1` = manual channels only.","disabled":true},{"key":"filters[fulfilment_client][]","value":"","description":"Filter by fulfilment client ID.","disabled":true}]},"description":"Returns every sales channel — integrated and manual — visible to the user. Fulfilment-client users see only their own channels.\n\n### Response\nEach `data[]` item is a `sales_channel` record with `config` decoded into an object. The `auto_sync_offset` field is omitted (internal use); `fulfilment_client_id` is omitted for fulfilment-client users.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 17,\n  \"per_page\": \"100\",\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 100,\n  \"data\": [\n    {\n      \"id\": \"36\",\n      \"chapi_id\": \"\",\n      \"fulfilment_client_id\": \"1\",\n      \"name\": \"Manual\",\n      \"type\": \"manual\",\n      \"config\": {\n        \"send_to_accounts\": \"\",\n        \"invoice_template\": \"a4.default.invoice.tpl\",\n        \"auto_print_invoice_at_terminal\": \"\",\n        \"company_logo\": \"\",\n        \"company_name\": \"\",\n        \"company_return_address\": \"\",\n        \"company_info\": \"\",\n        \"company_phone\": \"\",\n        \"commercial_invoice_template\": \"a4.default.commercial_invoice.tpl\",\n        \"sender_company\": \"\",\n        \"sender_address_line_one\": \"\",\n        \"sender_address_line_two\": \"\",\n        \"sender_address_line_three\": \"\",\n        \"sender_address_line_four\": \"\",\n        \"sender_vat_number\": \"\",\n        \"sender_eori_number\": \"\",\n        \"sender_company_number\": \"\",\n        \"sender_contact_number\": \"\",\n        \"email_status\": \"0\",\n        \"email_subject\": \"\",\n        \"email_message\": \"\",\n        \"feedback_email_status\": \"0\",\n        \"feedback_email_subject\": \"\",\n        \"feedback_email_message\": \"\",\n        \"feedback_email_send_days\": \"\",\n        \"fulfilment_client_id\": 1,\n        \"company_return_address_id\": 0,\n        \"sender_address_id\": 0\n      },\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"1\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-03-05 19:26:40\",\n      \"updated_at\": \"2026-03-05 19:26:40\"\n    },\n    {\n      \"id\": \"34\",\n      \"chapi_id\": \"451ffee8-646d-41fa-9aaa-b9f5a38060f1\",\n      \"fulfilment_client_id\": \"0\",\n      \"name\": \"Hidayet Local Manual\",\n      \"type\": \"manual\",\n      \"config\": {\n        \"id\": \"34\",\n        \"fulfilment_client_id\": \"0\",\n        \"warehouse_id\": \"6\",\n        \"auto_despatch_pos\": \"1\",\n        \"insufficient_stocks_order_status\": \"1\",\n        \"received_timeout_status\": \"2\",\n        \"received_timeout_period\": \"2\",\n        \"international_tax_calculations\": \"1\",\n        \"name\": \"Hidayet Local Manual\",\n        \"inventory_names_usage\": \"internal\",\n        \"company_name\": \"Hidayet&#39;s Company\",\n        \"company_return_address_id\": \"0\",\n        \"company_info\": \"\",\n        \"company_phone\": \"\",\n        \"invoice_template\": \"4x6.default.invoice.tpl\",\n        \"cheat_sheet_template\": \"6x9.default.cheat_sheet.tpl\",\n        \"groupon_template\": \"\",\n        \"commercial_invoice_template\": \"a4.default.commercial_invoice.tpl\",\n        \"auto_print_invoice_at_terminal\": \"0\",\n        \"sender_address_id\": \"0\",\n        \"email_status\": \"0\",\n        \"email_subject\": \"\",\n        \"bcc_email\": \"\",\n        \"template_selection\": \"sales_channel_specific\",\n        \"despatch_from_name\": \"\",\n        \"despatch_from_address\": \"\",\n        \"email_message\": \"16\",\n        \"feedback_email_status\": \"0\",\n        \"feedback_email_subject\": \"\",\n        \"feedback_bcc_email\": \"\",\n        \"feedback_from_name\": \"\",\n        \"feedback_from_address\": \"\",\n        \"feedback_email_send_days\": \"\"\n      },\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"1\",\n      \"warehouse_id\": \"6\",\n      \"created_at\": \"2026-02-25 12:16:13\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"2\",\n      \"chapi_id\": \"d912310d-b9cb-41b1-8ba4-72ed7c2569e8\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"asd\",\n      \"type\": \"woocommerce\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"3\",\n      \"chapi_id\": \"add72c4f-5e58-405e-b77e-241da806f2fb\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"asdasdasdas\",\n      \"type\": \"aerocommerce\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"4\",\n      \"chapi_id\": \"8788ac0f-cb99-4467-8cfc-c554bac9749f\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"AmzTest\",\n      \"type\": \"amazonsp\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"5\",\n      \"chapi_id\": \"5b20e46c-6585-4c9d-a1d2-e2cf6de3de61\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"AmzEasy\",\n      \"type\": \"amazoneasyship\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"6\",\n      \"chapi_id\": \"06d614e6-d724-4077-89ef-4778f5dd8feb\",\n      \"fulfilment_client_id\": \"0\",\n      \"name\": \"Wocommerce Original Account\",\n      \"type\": \"woocommerce\",\n      \"config\": {\n        \"fulfilment_client_id\": \"0\",\n        \"warehouse_id\": \"6\",\n        \"auto_despatch_pos\": \"1\",\n        \"insufficient_stocks_order_status\": \"3\",\n        \"received_timeout_status\": \"2\",\n        \"received_timeout_period\": \"2\",\n        \"international_tax_calculations\": \"0\",\n        \"name\": \"\",\n        \"inventory_names_usage\": \"internal\",\n        \"company_logo\": \"\",\n        \"company_name\": \"\",\n        \"company_return_address_id\": \"0\",\n        \"company_info\": \"\",\n        \"company_phone\": \"\",\n        \"invoice_template\": \"4x6.default.invoice.tpl\",\n        \"packing_sheet_template\": \"\",\n        \"picking_sheet_template\": \"\",\n        \"cheat_sheet_template\": \"6x9.default.cheat_sheet.tpl\",\n        \"groupon_template\": \"\",\n        \"commercial_invoice_template\": \"a4.default.commercial_invoice.tpl\",\n        \"auto_print_invoice_at_terminal\": \"0\",\n        \"sender_address_id\": \"0\",\n        \"email_status\": \"0\",\n        \"email_subject\": \"\",\n        \"bcc_email\": \"\",\n        \"template_selection\": \"sales_channel_specific\",\n        \"despatch_from_name\": \"\",\n        \"despatch_from_address\": \"\",\n        \"email_message\": \"16\",\n        \"feedback_email_status\": \"0\",\n        \"feedback_email_subject\": \"\",\n        \"feedback_bcc_email\": \"\",\n        \"feedback_from_name\": \"\",\n        \"feedback_from_address\": \"\",\n        \"feedback_email_message\": \"\",\n        \"feedback_email_send_days\": \"\"\n      },\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": \"6\",\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:31\"\n    },\n    {\n      \"id\": \"7\",\n      \"chapi_id\": \"115cfe6a-e03b-4cd9-ab27-93c9ca5a7357\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Shopify Original Account\",\n      \"type\": \"shopify\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"8\",\n      \"chapi_id\": \"962a0dcd-1152-48e0-94a7-735658390f69\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual Channel Test\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"9\",\n      \"chapi_id\": \"9f5086bf-79e8-48b1-a9d5-47468dbe9a62\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"10\",\n      \"chapi_id\": \"8a0b4c9e-48af-4085-8365-342d77cca01c\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual - Hidayet Client\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"11\",\n      \"chapi_id\": \"b2489a24-4941-481a-98ce-e3793f0790e4\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Alpha Channel - Alpha Client\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"12\",\n      \"chapi_id\": \"15e447cd-ad91-438e-bc08-9f243e253a97\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manualbetaaa - Beta Client\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"13\",\n      \"chapi_id\": \"ccd3f85e-3854-4980-b4b3-c284b96e534f\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Billing Client Channel - Billing Test\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"14\",\n      \"chapi_id\": \"889ed316-29ab-4dd9-a847-bc4412c57708\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"fffffff\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"15\",\n      \"chapi_id\": \"ee48932b-4c65-42dc-a879-97b3b5723192\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual - asd\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": \"16\",\n      \"chapi_id\": \"468aa95b-dd6a-40df-8fa2-595ce60777a9\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual - aaaaaa\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": \"0\",\n      \"is_local\": \"0\",\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    }\n  ]\n}"}],"_postman_id":"da77aa2d-56ff-4d15-ac7a-1655e1806630"},{"name":"Get Manual Channel Param Schema","id":"778a2247-ba87-4f1d-9406-bfdded8a2987","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/params","description":"<p>Returns the parameter schema you need to build / update a manual channel — sender and return address fields, their types, requiredness, and descriptions. Use this to dynamically render UI forms.</p>\n<h3 id=\"response\">Response</h3>\n<p>Object keyed by parameter name (e.g. <code>sender_company_name</code>, <code>sender_line_one</code>, <code>sender_iso</code>, <code>return_company_name</code>, <code>return_iso</code>, …). Every key has <code>{ type, required, description }</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels","params"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"5e11c898-3fbd-4b57-89d8-0d31d6e63d8e","name":"200 — param schema","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/params","description":"Returns the parameter schema you need to build / update a manual channel — sender and return address fields, their types, requiredness, and descriptions. Use this to dynamically render UI forms.\n\n### Response\nObject keyed by parameter name (e.g. `sender_company_name`, `sender_line_one`, `sender_iso`, `return_company_name`, `return_iso`, …). Every key has `{ type, required, description }`.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"name\": {\n    \"type\": \"text\",\n    \"required\": \"true\",\n    \"default\": null,\n    \"description\": \"Channel name\"\n  },\n  \"is_active\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false\n  },\n  \"account_nominal_code\": {\n    \"type\": \"text\",\n    \"required\": false,\n    \"default\": null,\n    \"description\": \"Channel account nominal code\"\n  },\n  \"get_orders_interval\": {\n    \"type\": \"integer\",\n    \"required\": {\n      \"when\": {\n        \"use_default_get_orders_interval\": false\n      }\n    },\n    \"default\": 180,\n    \"description\": \"Get Orders Interval (seconds)\"\n  },\n  \"use_default_get_orders_interval\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": true,\n    \"description\": \"Use custom order download interval\"\n  },\n  \"auto_sync_orders\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Mark orders as synced when fetched via API.\"\n  },\n  \"auto_hold_orders\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": true,\n    \"description\": \"Auto hold aged orders will hold any order that is more than 24 hours old at the time of system import.\"\n  },\n  \"manage_stock\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Enable stock management\"\n  },\n  \"get_orders\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": true,\n    \"description\": \"Enable get orders\"\n  },\n  \"only_mark_as_updated_order_changed\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Only Get Order Data Changes\"\n  },\n  \"download_products\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Enable download products\"\n  },\n  \"add_to_products\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Add downloaded products to main products list\"\n  },\n  \"set_initial_stock_levels\": {\n    \"type\": \"checkbox\",\n    \"required\": {\n      \"when\": {\n        \"download_products\": true\n      }\n    },\n    \"default\": false,\n    \"description\": \"Set initial stock level of products via this channel.\"\n  },\n  \"auto_sync_stock\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Stock changes will be synced automatically on this channel.\"\n  },\n  \"deduct_stock_via_orders\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": true,\n    \"description\": \"Automatically updates stock when an order received\"\n  },\n  \"increase_stock_via_cancelled_orders\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Automatically updates stock when an cancelled order received\"\n  },\n  \"push_stock_levels\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false,\n    \"description\": \"Push main product stocks to channel product stocks\"\n  },\n  \"download_product_images\": {\n    \"type\": \"checkbox\",\n    \"required\": {\n      \"when\": {\n        \"download_products\": true\n      }\n    },\n    \"default\": false,\n    \"description\": \"Download product images for this channel\"\n  },\n  \"download_product_dimensions\": {\n    \"type\": \"checkbox\",\n    \"required\": {\n      \"when\": {\n        \"download_products\": true\n      }\n    },\n    \"default\": false,\n    \"description\": \"Download product dimensions & weights for this channel\"\n  },\n  \"download_product_customs_information\": {\n    \"type\": \"checkbox\",\n    \"required\": {\n      \"when\": {\n        \"download_products\": true\n      }\n    },\n    \"default\": false,\n    \"description\": \"Download product HS Code, Country of Origin for this channel\"\n  },\n  \"use_order_prefix\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": false,\n    \"description\": \"Add prefix to the beginning of order numbers\"\n  },\n  \"order_prefix\": {\n    \"type\": \"text\",\n    \"required\": {\n      \"when\": {\n        \"use_order_prefix\": true\n      }\n    },\n    \"default\": null,\n    \"description\": \"Prefix value for order numbers (Only alpha dash chars)\"\n  },\n  \"use_low_stock_buffer\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": false,\n    \"description\": \"Enter the stock quantity that will act as your low stock threshold. When product quantities are below or equal to this number, stock levels will be set to 0 on the channels.\"\n  },\n  \"low_stock_buffer\": {\n    \"type\": \"integer\",\n    \"required\": {\n      \"when\": {\n        \"use_low_stock_buffer\": true\n      }\n    },\n    \"default\": 0,\n    \"description\": \"Buffer Stock Limit\"\n  },\n  \"use_max_stock_level\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": false,\n    \"description\": \"Activate this feature to auto-set channel stock levels to a specific static quantity when product stock is high or equal to a set limit..\"\n  },\n  \"max_stock_level\": {\n    \"type\": \"integer\",\n    \"required\": {\n      \"when\": {\n        \"use_max_stock_level\": true\n      }\n    },\n    \"default\": 0,\n    \"description\": \"Set a static stock quantity. When product stock is at or above this number, channel stock levels will match your specified quantity.\"\n  },\n  \"disable_fulfillment\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": false\n  },\n  \"auto_match_product\": {\n    \"type\": \"checkbox\",\n    \"required\": true,\n    \"default\": true\n  },\n  \"fetch_order_cancellation_data\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": false\n  },\n  \"fetch_return_info\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": false\n  },\n  \"use_stock_allocation_rate\": {\n    \"type\": \"checkbox\",\n    \"required\": false,\n    \"default\": false,\n    \"description\": \"Use stock allocation rate to calculate available stock for this channel\"\n  },\n  \"stock_allocation_rate\": {\n    \"type\": \"integer\",\n    \"required\": {\n      \"when\": {\n        \"use_stock_allocation_rate\": true\n      }\n    },\n    \"default\": 1,\n    \"min\": 0,\n    \"max\": 1,\n    \"step\": 0.01,\n    \"description\": \"Stock allocation rate percentage\"\n  }\n}"}],"_postman_id":"778a2247-ba87-4f1d-9406-bfdded8a2987"},{"name":"Create (Quick) Sales Channel","id":"9f762842-d58e-4aa4-9f68-9a788945c002","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"My Online Store\",\n    \"warehouse_id\": 6,\n    \"fulfilment_client_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/sales_channels","description":"<p>Quick-create endpoint for a basic manual channel — only <code>name</code> + <code>warehouse_id</code> (+ optional fulfilment client). Use <strong>Create Manual Sales Channel</strong> instead if you also need to capture sender/return addresses (which is required to print labels from orders on the channel).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>name</code> (string, required).</li>\n<li><code>warehouse_id</code> (int, required).</li>\n<li><code>fulfilment_client_id</code> (int, optional).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created <code>sales_channel</code> record (minimal config).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"f3cbba2d-cfbb-4afa-a40f-0e6e3ac85acd","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"My Online Store\",\n    \"warehouse_id\": 6,\n    \"fulfilment_client_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/sales_channels","description":"Quick-create endpoint for a basic manual channel — only `name` + `warehouse_id` (+ optional fulfilment client). Use **Create Manual Sales Channel** instead if you also need to capture sender/return addresses (which is required to print labels from orders on the channel).\n\n### Body fields\n- `name` (string, required).\n- `warehouse_id` (int, required).\n- `fulfilment_client_id` (int, optional).\n\n### Response\nThe created `sales_channel` record (minimal config).\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 37,\n  \"chapi_id\": \"7359296d-9a22-452b-8a1c-cfebf722895e\",\n  \"fulfilment_client_id\": null,\n  \"name\": \"Postman G5 Quick SC\",\n  \"type\": \"manual\",\n  \"config\": \"\",\n  \"data\": \"\",\n  \"accounting_channel_id\": 0,\n  \"auto_sync_offset\": null,\n  \"is_local\": 1,\n  \"warehouse_id\": 6,\n  \"created_at\": \"2026-04-30 13:21:20\",\n  \"updated_at\": \"2026-04-30 13:21:20\"\n}"}],"_postman_id":"9f762842-d58e-4aa4-9f68-9a788945c002"},{"name":"List Manual Sales Channels","id":"05d9a526-e24e-4977-b3a8-068b99319d9d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/manual?page=1","description":"<p>Returns only manual channels (where <code>is_local = 1</code>). Same response shape as <strong>List Sales Channels (All)</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels","manual"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Search on <code>name</code> and <code>type</code> (always <code>manual</code> here).</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Filter by fulfilment client ID.</p>\n","type":"text/plain"},"key":"filters[fulfilment_client][]","value":""}],"variable":[]}},"response":[{"id":"f63d4cb7-f042-414d-a6a0-5bea00f24968","name":"200 — page of manual channels","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/sales_channels/manual?page=1","host":["https://your-company.myhelm.app/public-api"],"path":["sales_channels","manual"],"query":[{"key":"page","value":"1"},{"key":"filters[search]","value":"","description":"Search on `name` and `type` (always `manual` here).","disabled":true},{"key":"filters[fulfilment_client][]","value":"","description":"Filter by fulfilment client ID.","disabled":true}]},"description":"Returns only manual channels (where `is_local = 1`). Same response shape as **List Sales Channels (All)**.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"total\": 11,\n  \"per_page\": \"100\",\n  \"current_page\": 1,\n  \"last_page\": 1,\n  \"next_page_url\": null,\n  \"prev_page_url\": null,\n  \"from\": 0,\n  \"to\": 100,\n  \"data\": [\n    {\n      \"id\": 36,\n      \"chapi_id\": \"\",\n      \"fulfilment_client_id\": 1,\n      \"name\": \"Manual\",\n      \"type\": \"manual\",\n      \"config\": {\n        \"send_to_accounts\": \"\",\n        \"invoice_template\": \"a4.default.invoice.tpl\",\n        \"auto_print_invoice_at_terminal\": \"\",\n        \"company_logo\": \"\",\n        \"company_name\": \"\",\n        \"company_return_address\": \"\",\n        \"company_info\": \"\",\n        \"company_phone\": \"\",\n        \"commercial_invoice_template\": \"a4.default.commercial_invoice.tpl\",\n        \"sender_company\": \"\",\n        \"sender_address_line_one\": \"\",\n        \"sender_address_line_two\": \"\",\n        \"sender_address_line_three\": \"\",\n        \"sender_address_line_four\": \"\",\n        \"sender_vat_number\": \"\",\n        \"sender_eori_number\": \"\",\n        \"sender_company_number\": \"\",\n        \"sender_contact_number\": \"\",\n        \"email_status\": \"0\",\n        \"email_subject\": \"\",\n        \"email_message\": \"\",\n        \"feedback_email_status\": \"0\",\n        \"feedback_email_subject\": \"\",\n        \"feedback_email_message\": \"\",\n        \"feedback_email_send_days\": \"\",\n        \"fulfilment_client_id\": 1,\n        \"company_return_address_id\": 0,\n        \"sender_address_id\": 0\n      },\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 1,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-03-05 19:26:40\",\n      \"updated_at\": \"2026-03-05 19:26:40\"\n    },\n    {\n      \"id\": 34,\n      \"chapi_id\": \"451ffee8-646d-41fa-9aaa-b9f5a38060f1\",\n      \"fulfilment_client_id\": 0,\n      \"name\": \"Hidayet Local Manual\",\n      \"type\": \"manual\",\n      \"config\": {\n        \"id\": \"34\",\n        \"fulfilment_client_id\": \"0\",\n        \"warehouse_id\": \"6\",\n        \"auto_despatch_pos\": \"1\",\n        \"insufficient_stocks_order_status\": \"1\",\n        \"received_timeout_status\": \"2\",\n        \"received_timeout_period\": \"2\",\n        \"international_tax_calculations\": \"1\",\n        \"name\": \"Hidayet Local Manual\",\n        \"inventory_names_usage\": \"internal\",\n        \"company_name\": \"Hidayet&#39;s Company\",\n        \"company_return_address_id\": \"0\",\n        \"company_info\": \"\",\n        \"company_phone\": \"\",\n        \"invoice_template\": \"4x6.default.invoice.tpl\",\n        \"cheat_sheet_template\": \"6x9.default.cheat_sheet.tpl\",\n        \"groupon_template\": \"\",\n        \"commercial_invoice_template\": \"a4.default.commercial_invoice.tpl\",\n        \"auto_print_invoice_at_terminal\": \"0\",\n        \"sender_address_id\": \"0\",\n        \"email_status\": \"0\",\n        \"email_subject\": \"\",\n        \"bcc_email\": \"\",\n        \"template_selection\": \"sales_channel_specific\",\n        \"despatch_from_name\": \"\",\n        \"despatch_from_address\": \"\",\n        \"email_message\": \"16\",\n        \"feedback_email_status\": \"0\",\n        \"feedback_email_subject\": \"\",\n        \"feedback_bcc_email\": \"\",\n        \"feedback_from_name\": \"\",\n        \"feedback_from_address\": \"\",\n        \"feedback_email_send_days\": \"\"\n      },\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 1,\n      \"warehouse_id\": 6,\n      \"created_at\": \"2026-02-25 12:16:13\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 8,\n      \"chapi_id\": \"962a0dcd-1152-48e0-94a7-735658390f69\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual Channel Test\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 9,\n      \"chapi_id\": \"9f5086bf-79e8-48b1-a9d5-47468dbe9a62\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 10,\n      \"chapi_id\": \"8a0b4c9e-48af-4085-8365-342d77cca01c\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual - Hidayet Client\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 11,\n      \"chapi_id\": \"b2489a24-4941-481a-98ce-e3793f0790e4\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Alpha Channel - Alpha Client\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 12,\n      \"chapi_id\": \"15e447cd-ad91-438e-bc08-9f243e253a97\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manualbetaaa - Beta Client\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 13,\n      \"chapi_id\": \"ccd3f85e-3854-4980-b4b3-c284b96e534f\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Billing Client Channel - Billing Test\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 14,\n      \"chapi_id\": \"889ed316-29ab-4dd9-a847-bc4412c57708\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"fffffff\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 15,\n      \"chapi_id\": \"ee48932b-4c65-42dc-a879-97b3b5723192\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual - asd\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    },\n    {\n      \"id\": 16,\n      \"chapi_id\": \"468aa95b-dd6a-40df-8fa2-595ce60777a9\",\n      \"fulfilment_client_id\": null,\n      \"name\": \"Manual - aaaaaa\",\n      \"type\": \"manual\",\n      \"config\": null,\n      \"data\": \"\",\n      \"accounting_channel_id\": 0,\n      \"is_local\": 0,\n      \"warehouse_id\": null,\n      \"created_at\": \"2026-02-25 12:06:24\",\n      \"updated_at\": \"2026-03-30 12:36:19\"\n    }\n  ]\n}"}],"_postman_id":"05d9a526-e24e-4977-b3a8-068b99319d9d"},{"name":"Get Manual Channel Detail","id":"5e95ac93-87a6-4ec0-8592-610064029491","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/{{sales_channel_id}}","description":"<p>Returns a single manual channel with its full address block expanded.</p>\n<h3 id=\"response\">Response</h3>\n<p><code>sales_channel</code> record with <code>config</code> containing every sender/return-address field. <code>type</code>, <code>is_local</code>, <code>auto_sync_offset</code> are omitted; <code>fulfilment_client_id</code> is omitted for fulfilment-client users.</p>\n<p>Returns <code>404</code> if the channel doesn't exist or is not a manual channel.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels","manual","{{sales_channel_id}}"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"60e538ff-db03-40c2-85ad-60601dd512b6","name":"200 — manual channel found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/{{sales_channel_id}}","description":"Returns a single manual channel with its full address block expanded.\n\n### Response\n`sales_channel` record with `config` containing every sender/return-address field. `type`, `is_local`, `auto_sync_offset` are omitted; `fulfilment_client_id` is omitted for fulfilment-client users.\n\nReturns `404` if the channel doesn't exist or is not a manual channel.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 44,\n  \"chapi_id\": \"\",\n  \"fulfilment_client_id\": null,\n  \"name\": \"Postman G8 Manual SC\",\n  \"config\": {\n    \"sender_company_name\": \"Postman\",\n    \"sender_line_one\": \"1 St\",\n    \"sender_line_two\": \"\",\n    \"sender_city\": \"London\",\n    \"sender_county\": \"Greater London\",\n    \"sender_country\": \"United Kingdom\",\n    \"sender_postcode\": \"SW1A 1AA\",\n    \"sender_iso\": \"GB\",\n    \"sender_email\": \"s@p.test\",\n    \"sender_phone_number\": \"+44 1\",\n    \"sender_company_number\": \"\",\n    \"sender_vat_number\": \"\",\n    \"sender_eori_number\": \"\",\n    \"sender_xeori_number\": \"\",\n    \"sender_ioss_number\": \"\",\n    \"sender_ukims_number\": \"\",\n    \"return_company_name\": \"Postman\",\n    \"return_line_one\": \"1 St\",\n    \"return_line_two\": \"\",\n    \"return_city\": \"London\",\n    \"return_county\": \"Greater London\",\n    \"return_country\": \"United Kingdom\",\n    \"return_postcode\": \"SW1A 1AA\",\n    \"return_iso\": \"GB\",\n    \"return_email\": \"r@p.test\",\n    \"return_phone_number\": \"+44 1\",\n    \"return_company_number\": \"\",\n    \"return_vat_number\": \"\",\n    \"return_eori_number\": \"\",\n    \"return_xeori_number\": \"\",\n    \"return_ioss_number\": \"\",\n    \"return_ukims_number\": \"\",\n    \"fulfilment_client_id\": null,\n    \"warehouse_id\": 6,\n    \"sender_address_id\": 11,\n    \"company_return_address_id\": 12\n  },\n  \"data\": \"\",\n  \"accounting_channel_id\": 0,\n  \"warehouse_id\": 6,\n  \"created_at\": \"2026-04-30 13:58:45\",\n  \"updated_at\": \"2026-04-30 13:58:45\"\n}"}],"_postman_id":"5e95ac93-87a6-4ec0-8592-610064029491"},{"name":"Create Manual Sales Channel","id":"7b9ea928-e555-4b4a-b2d0-50c7fd767388","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":                 \"My Online Store\",   // REQUIRED — must be unique across all sales channels\n    \"warehouse_id\":         6,\n    \"fulfilment_client_id\": null,\n    \"config\": {\n        // Sender address — provide all 16 fields below (use \"\" for unused) UNLESS sender_address_id is set to an existing address ID.\n        \"sender_address_id\":      null,\n        \"sender_company_name\":    \"My Company Ltd\",\n        \"sender_line_one\":        \"1 Sender Street\",\n        \"sender_line_two\":        \"\",\n        \"sender_city\":            \"London\",\n        \"sender_county\":          \"Greater London\",   // REQUIRED — non-empty value\n        \"sender_country\":         \"United Kingdom\",\n        \"sender_postcode\":        \"SW1A 1AA\",\n        \"sender_iso\":             \"GB\",\n        \"sender_email\":           \"sender@example.com\",\n        \"sender_phone_number\":    \"+44 1234 567890\",\n        \"sender_company_number\":  \"\",\n        \"sender_vat_number\":      \"\",\n        \"sender_eori_number\":     \"\",\n        \"sender_xeori_number\":    \"\",\n        \"sender_ioss_number\":     \"\",\n        \"sender_ukims_number\":    \"\",\n\n        // Return address — same 16-field requirement, prefixed return_*. Set company_return_address_id to skip.\n        \"company_return_address_id\": null,\n        \"return_company_name\":    \"My Returns Centre\",\n        \"return_line_one\":        \"5 Returns Drive\",\n        \"return_line_two\":        \"\",\n        \"return_city\":            \"London\",\n        \"return_county\":          \"Greater London\",\n        \"return_country\":         \"United Kingdom\",\n        \"return_postcode\":        \"SW1A 1AA\",\n        \"return_iso\":             \"GB\",\n        \"return_email\":           \"returns@example.com\",\n        \"return_phone_number\":    \"+44 1234 567890\",\n        \"return_company_number\":  \"\",\n        \"return_vat_number\":      \"\",\n        \"return_eori_number\":     \"\",\n        \"return_xeori_number\":    \"\",\n        \"return_ioss_number\":     \"\",\n        \"return_ukims_number\":    \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/create","description":"<p>Creates a manual channel with full sender + return address configuration.</p>\n<h3 id=\"top-level-body-fields\">Top-level body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Unique channel name.</td>\n</tr>\n<tr>\n<td><code>warehouse_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Default warehouse for orders on this channel. Must be a warehouse location (<code>type_id</code> <code>4</code>).</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Auto-set if API user is a fulfilment-client user.</td>\n</tr>\n<tr>\n<td><code>config</code></td>\n<td>object</td>\n<td>yes</td>\n<td>Sender + return address fields — see below.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"config--sender-address\"><code>config</code> — sender address</h3>\n<p>Provide either <code>sender_address_id</code> (an existing address record) <strong>or</strong> every inline <code>sender_*</code> field:</p>\n<ul>\n<li>Required: <code>sender_company_name</code>, <code>sender_line_one</code>, <code>sender_line_two</code>, <code>sender_city</code>, <code>sender_county</code>, <code>sender_country</code>, <code>sender_postcode</code>, <code>sender_iso</code>, <code>sender_email</code>, <code>sender_phone_number</code>.</li>\n<li>Optional compliance fields: <code>sender_company_number</code>, <code>sender_vat_number</code>, <code>sender_eori_number</code>, <code>sender_xeori_number</code>, <code>sender_ioss_number</code>, <code>sender_ukims_number</code>.</li>\n</ul>\n<h3 id=\"config--return-address\"><code>config</code> — return address</h3>\n<p>Provide either <code>company_return_address_id</code> (existing address) <strong>or</strong> every inline <code>return_*</code> field (same shape as sender, with <code>return_*</code> prefix).</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li><code>name</code> must be unique across channels.</li>\n<li>The warehouse must exist and be a warehouse location (<code>type_id</code> <code>4</code>).</li>\n<li>If <code>fulfilment_client_id</code> is set, the client must exist.</li>\n<li>If using existing address IDs, the addresses must exist and be shipping addresses.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The created channel with <code>config</code> containing the merged inline + database address fields.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels","manual","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"4a610616-96f0-4fd7-811c-67abc6cd447d","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"My Online Store\",\n    \"warehouse_id\": 6,\n    \"fulfilment_client_id\": null,\n    \"config\": {\n        \"sender_address_id\": null,\n        \"sender_company_name\": \"My Company Ltd\",\n        \"sender_line_one\": \"1 Sender Street\",\n        \"sender_line_two\": \"\",\n        \"sender_city\": \"London\",\n        \"sender_county\": \"\",\n        \"sender_country\": \"United Kingdom\",\n        \"sender_postcode\": \"SW1A 1AA\",\n        \"sender_iso\": \"GB\",\n        \"sender_email\": \"sender@example.com\",\n        \"sender_phone_number\": \"+44 1234 567890\",\n        \"sender_company_number\": \"\",\n        \"sender_vat_number\": \"\",\n        \"sender_eori_number\": \"\",\n        \"sender_xeori_number\": \"\",\n        \"sender_ioss_number\": \"\",\n        \"sender_ukims_number\": \"\",\n\n        \"company_return_address_id\": null,\n        \"return_company_name\": \"My Returns Centre\",\n        \"return_line_one\": \"5 Returns Drive\",\n        \"return_line_two\": \"\",\n        \"return_city\": \"London\",\n        \"return_county\": \"\",\n        \"return_country\": \"United Kingdom\",\n        \"return_postcode\": \"SW1A 1AA\",\n        \"return_iso\": \"GB\",\n        \"return_email\": \"returns@example.com\",\n        \"return_phone_number\": \"+44 1234 567890\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/create","description":"Creates a manual channel with full sender + return address configuration.\n\n### Top-level body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | yes | Unique channel name. |\n| `warehouse_id` | int | yes | Default warehouse for orders on this channel. Must be a warehouse location (`type_id` `4`). |\n| `fulfilment_client_id` | int | no | Auto-set if API user is a fulfilment-client user. |\n| `config` | object | yes | Sender + return address fields — see below. |\n\n### `config` — sender address\nProvide either `sender_address_id` (an existing address record) **or** every inline `sender_*` field:\n\n- Required: `sender_company_name`, `sender_line_one`, `sender_line_two`, `sender_city`, `sender_county`, `sender_country`, `sender_postcode`, `sender_iso`, `sender_email`, `sender_phone_number`.\n- Optional compliance fields: `sender_company_number`, `sender_vat_number`, `sender_eori_number`, `sender_xeori_number`, `sender_ioss_number`, `sender_ukims_number`.\n\n### `config` — return address\nProvide either `company_return_address_id` (existing address) **or** every inline `return_*` field (same shape as sender, with `return_*` prefix).\n\n### Constraints\n- `name` must be unique across channels.\n- The warehouse must exist and be a warehouse location (`type_id` `4`).\n- If `fulfilment_client_id` is set, the client must exist.\n- If using existing address IDs, the addresses must exist and be shipping addresses.\n\n### Response\nThe created channel with `config` containing the merged inline + database address fields.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 41,\n  \"chapi_id\": \"\",\n  \"fulfilment_client_id\": null,\n  \"name\": \"Postman G5 Final\",\n  \"config\": {\n    \"sender_company_name\": \"Postman Test Co\",\n    \"sender_line_one\": \"1 Sender Street\",\n    \"sender_line_two\": \"Suite 1\",\n    \"sender_city\": \"London\",\n    \"sender_county\": \"Greater London\",\n    \"sender_country\": \"United Kingdom\",\n    \"sender_postcode\": \"SW1A 1AA\",\n    \"sender_iso\": \"GB\",\n    \"sender_email\": \"sender@postman.test\",\n    \"sender_phone_number\": \"+44 1234 567890\",\n    \"sender_company_number\": \"12345678\",\n    \"sender_vat_number\": \"GB123456789\",\n    \"sender_eori_number\": \"GB123456789000\",\n    \"sender_xeori_number\": \"\",\n    \"sender_ioss_number\": \"\",\n    \"sender_ukims_number\": \"\",\n    \"return_company_name\": \"Postman Returns\",\n    \"return_line_one\": \"5 Returns Drive\",\n    \"return_line_two\": \"Unit B\",\n    \"return_city\": \"London\",\n    \"return_county\": \"Greater London\",\n    \"return_country\": \"United Kingdom\",\n    \"return_postcode\": \"SW1A 1AA\",\n    \"return_iso\": \"GB\",\n    \"return_email\": \"returns@postman.test\",\n    \"return_phone_number\": \"+44 1234 567890\",\n    \"return_company_number\": \"12345678\",\n    \"return_vat_number\": \"GB123456789\",\n    \"return_eori_number\": \"\",\n    \"return_xeori_number\": \"\",\n    \"return_ioss_number\": \"\",\n    \"return_ukims_number\": \"\",\n    \"sender_address_id\": 5,\n    \"company_return_address_id\": 6\n  },\n  \"data\": \"\",\n  \"accounting_channel_id\": 0,\n  \"warehouse_id\": 6,\n  \"created_at\": \"2026-04-30 13:22:59\",\n  \"updated_at\": \"2026-04-30 13:22:59\"\n}"}],"_postman_id":"7b9ea928-e555-4b4a-b2d0-50c7fd767388"},{"name":"Update Manual Sales Channel","id":"cf3b0b1e-4671-40ad-be2f-77ee6d1793dd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":                 \"My Online Store (Renamed)\",\n    \"warehouse_id\":         6,\n    \"fulfilment_client_id\": null,\n    \"config\": {\n        // Update requires the existing sender_address_id together with all 16 sender_* fields.\n        \"sender_address_id\":      10,            // existing sender address ID for this channel\n        \"sender_company_name\":    \"My Company Ltd\",\n        \"sender_line_one\":        \"1 Sender Street\",\n        \"sender_line_two\":        \"\",\n        \"sender_city\":            \"London\",\n        \"sender_county\":          \"Greater London\",\n        \"sender_country\":         \"United Kingdom\",\n        \"sender_postcode\":        \"SW1A 1AA\",\n        \"sender_iso\":             \"GB\",\n        \"sender_email\":           \"sender@example.com\",\n        \"sender_phone_number\":    \"+44 1234 567890\",\n        \"sender_company_number\":  \"\",\n        \"sender_vat_number\":      \"\",\n        \"sender_eori_number\":     \"\",\n        \"sender_xeori_number\":    \"\",\n        \"sender_ioss_number\":     \"\",\n        \"sender_ukims_number\":    \"\",\n\n        \"company_return_address_id\": 11,         // existing return address ID for this channel\n        \"return_company_name\":    \"My Returns Centre\",\n        \"return_line_one\":        \"5 Returns Drive\",\n        \"return_line_two\":        \"\",\n        \"return_city\":            \"London\",\n        \"return_county\":          \"Greater London\",\n        \"return_country\":         \"United Kingdom\",\n        \"return_postcode\":        \"SW1A 1AA\",\n        \"return_iso\":             \"GB\",\n        \"return_email\":           \"returns@example.com\",\n        \"return_phone_number\":    \"+44 1234 567890\",\n        \"return_company_number\":  \"\",\n        \"return_vat_number\":      \"\",\n        \"return_eori_number\":     \"\",\n        \"return_xeori_number\":    \"\",\n        \"return_ioss_number\":     \"\",\n        \"return_ukims_number\":    \"\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/{{sales_channel_id}}/update","description":"<p>Updates an existing manual channel. Same body shape as <strong>Create Manual Sales Channel</strong>.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The channel must exist and be a manual channel.</li>\n<li><code>name</code> must remain unique (excluding the channel's own row).</li>\n<li><code>sender_address_id</code> and <code>company_return_address_id</code> must exist — <code>null</code> is rejected.</li>\n<li>All sender_* and return_* fields must be present in the config block.</li>\n<li>Updates rewrite the linked address records in place — they do not create new addresses.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated channel with merged config.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels","manual","{{sales_channel_id}}","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"c40c21a4-f017-4114-a039-14eab14d14e2","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"My Online Store (Renamed)\",\n    \"warehouse_id\": 6,\n    \"fulfilment_client_id\": null,\n    \"config\": {\n        \"sender_address_id\": 10,\n        \"sender_company_name\": \"My Company Ltd\",\n        \"sender_line_one\": \"1 Sender Street\",\n        \"sender_line_two\": \"\",\n        \"sender_city\": \"London\",\n        \"sender_county\": \"\",\n        \"sender_country\": \"United Kingdom\",\n        \"sender_postcode\": \"SW1A 1AA\",\n        \"sender_iso\": \"GB\",\n        \"sender_email\": \"sender@example.com\",\n        \"sender_phone_number\": \"+44 1234 567890\",\n\n        \"company_return_address_id\": 11,\n        \"return_company_name\": \"My Returns Centre\",\n        \"return_line_one\": \"5 Returns Drive\",\n        \"return_line_two\": \"\",\n        \"return_city\": \"London\",\n        \"return_county\": \"\",\n        \"return_country\": \"United Kingdom\",\n        \"return_postcode\": \"SW1A 1AA\",\n        \"return_iso\": \"GB\",\n        \"return_email\": \"returns@example.com\",\n        \"return_phone_number\": \"+44 1234 567890\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/{{sales_channel_id}}/update","description":"Updates an existing manual channel. Same body shape as **Create Manual Sales Channel**.\n\n### Constraints\n- The channel must exist and be a manual channel.\n- `name` must remain unique (excluding the channel's own row).\n- `sender_address_id` and `company_return_address_id` must exist — `null` is rejected.\n- All sender_* and return_* fields must be present in the config block.\n- Updates rewrite the linked address records in place — they do not create new addresses.\n\n### Response\nThe updated channel with merged config.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 43,\n  \"chapi_id\": \"\",\n  \"fulfilment_client_id\": null,\n  \"name\": \"Postman G5 Update Test 2 - Renamed\",\n  \"config\": {\n    \"sender_address_id\": 9,\n    \"sender_company_name\": \"Updated Postman Co\",\n    \"sender_line_one\": \"99 Updated Street\",\n    \"sender_line_two\": \"Suite 9\",\n    \"sender_city\": \"London\",\n    \"sender_county\": \"Greater London\",\n    \"sender_country\": \"United Kingdom\",\n    \"sender_postcode\": \"SW1A 9ZZ\",\n    \"sender_iso\": \"GB\",\n    \"sender_email\": \"updated@postman.test\",\n    \"sender_phone_number\": \"+44 9999 999999\",\n    \"sender_company_number\": \"99999999\",\n    \"sender_vat_number\": \"\",\n    \"sender_eori_number\": \"\",\n    \"sender_xeori_number\": \"\",\n    \"sender_ioss_number\": \"\",\n    \"sender_ukims_number\": \"\",\n    \"company_return_address_id\": 10,\n    \"return_company_name\": \"Postman Returns Updated\",\n    \"return_line_one\": \"99 Return Street\",\n    \"return_line_two\": \"Unit Z\",\n    \"return_city\": \"London\",\n    \"return_county\": \"Greater London\",\n    \"return_country\": \"United Kingdom\",\n    \"return_postcode\": \"SW1A 9ZZ\",\n    \"return_iso\": \"GB\",\n    \"return_email\": \"returns@postman.test\",\n    \"return_phone_number\": \"+44 9999 999999\",\n    \"return_company_number\": \"99999999\",\n    \"return_vat_number\": \"\",\n    \"return_eori_number\": \"\",\n    \"return_xeori_number\": \"\",\n    \"return_ioss_number\": \"\",\n    \"return_ukims_number\": \"\"\n  },\n  \"data\": \"\",\n  \"accounting_channel_id\": 0,\n  \"warehouse_id\": 6,\n  \"created_at\": \"2026-04-30 13:23:46\",\n  \"updated_at\": \"2026-04-30 13:23:47\"\n}"}],"_postman_id":"cf3b0b1e-4671-40ad-be2f-77ee6d1793dd"},{"name":"Delete Manual Sales Channel","id":"94bce384-aa2c-4b39-a1bf-0570374f8a87","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/{{sales_channel_id}}/delete","description":"<p>Soft-deletes a manual channel. Linked addresses are retained for audit.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The channel must be a manual channel.</li>\n<li>Fulfilment-client users can only delete their own client's channels.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The deleted channel object with its config.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["sales_channels","manual","{{sales_channel_id}}","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"e87217f6-d860-4a89-b756-2cdbf38c6c93","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/sales_channels/manual/{{sales_channel_id}}/delete","description":"Soft-deletes a manual channel. Linked addresses are retained for audit.\n\n### Constraints\n- The channel must be a manual channel.\n- Fulfilment-client users can only delete their own client's channels.\n\n### Response\nThe deleted channel object with its config.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 43,\n  \"chapi_id\": \"\",\n  \"fulfilment_client_id\": null,\n  \"name\": \"Postman G5 Update Test 2 - Renamed\",\n  \"type\": \"manual\",\n  \"config\": {\n    \"sender_address_id\": 9,\n    \"sender_company_name\": \"Updated Postman Co\",\n    \"sender_line_one\": \"99 Updated Street\",\n    \"sender_line_two\": \"Suite 9\",\n    \"sender_city\": \"London\",\n    \"sender_county\": \"Greater London\",\n    \"sender_country\": \"United Kingdom\",\n    \"sender_postcode\": \"SW1A 9ZZ\",\n    \"sender_iso\": \"GB\",\n    \"sender_email\": \"updated@postman.test\",\n    \"sender_phone_number\": \"+44 9999 999999\",\n    \"sender_company_number\": \"99999999\",\n    \"sender_vat_number\": \"\",\n    \"sender_eori_number\": \"\",\n    \"sender_xeori_number\": \"\",\n    \"sender_ioss_number\": \"\",\n    \"sender_ukims_number\": \"\",\n    \"company_return_address_id\": 10,\n    \"return_company_name\": \"Postman Returns Updated\",\n    \"return_line_one\": \"99 Return Street\",\n    \"return_line_two\": \"Unit Z\",\n    \"return_city\": \"London\",\n    \"return_county\": \"Greater London\",\n    \"return_country\": \"United Kingdom\",\n    \"return_postcode\": \"SW1A 9ZZ\",\n    \"return_iso\": \"GB\",\n    \"return_email\": \"returns@postman.test\",\n    \"return_phone_number\": \"+44 9999 999999\",\n    \"return_company_number\": \"99999999\",\n    \"return_vat_number\": \"\",\n    \"return_eori_number\": \"\",\n    \"return_xeori_number\": \"\",\n    \"return_ioss_number\": \"\",\n    \"return_ukims_number\": \"\",\n    \"fulfilment_client_id\": null,\n    \"warehouse_id\": 6\n  },\n  \"data\": \"\",\n  \"accounting_channel_id\": 0,\n  \"auto_sync_offset\": null,\n  \"is_local\": 1,\n  \"warehouse_id\": 6,\n  \"created_at\": \"2026-04-30 13:23:46\",\n  \"updated_at\": \"2026-04-30 13:23:47\"\n}"}],"_postman_id":"94bce384-aa2c-4b39-a1bf-0570374f8a87"}],"id":"8a23baf7-bb9c-4f25-817f-046c0defedce","description":"<p>Manage and inspect sales channels — both <em>integrated</em> channels (real marketplaces / storefronts synced via plugins) and <em>manual</em> channels (locally-defined channels for orders that don't come from an integration).</p>\n<p>For manual channels you also need to provide sender and return-address details — these are required for any label printed from orders that arrive on the channel.</p>\n","_postman_id":"8a23baf7-bb9c-4f25-817f-046c0defedce","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Picks","item":[{"name":"List Picks","id":"2bddea0a-9faa-45da-b58f-12328a110072","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/picks?page=1&per_page=20","description":"<p>Returns a paginated list of picks with status / type / option labels resolved.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size is fixed by the tenant <em>Items per page</em> setting; <code>per_page</code> is ignored.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match on <code>pick_number</code>. Use `</td>\n</tr>\n<tr>\n<td><code>filters[status]</code></td>\n<td>int or array</td>\n<td>Pick status (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[warehouse]</code></td>\n<td>int or array</td>\n<td>Warehouse location ID.</td>\n</tr>\n<tr>\n<td><code>filters[pick_type]</code></td>\n<td>int or array</td>\n<td><code>1</code> single, <code>2</code> multi.</td>\n</tr>\n<tr>\n<td><code>filters[pick_option]</code></td>\n<td>int or array</td>\n<td>Pick option (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[assigned_user]</code></td>\n<td>int or array</td>\n<td>User the pick is assigned to.</td>\n</tr>\n<tr>\n<td><code>filters[creator_user]</code></td>\n<td>int or array</td>\n<td>User who created the pick.</td>\n</tr>\n<tr>\n<td><code>filters[ui_pick]</code></td>\n<td>int or array</td>\n<td><code>1</code> = created from the dashboard, <code>0</code> = created another way.</td>\n</tr>\n<tr>\n<td><code>filters[create_date_range]</code></td>\n<td>string</td>\n<td><code>start,end</code> as Unix timestamps on the creation date; the end day is included in full.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Sorted newest first; there is no <code>sort</code> parameter.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a pick record with <code>status_name</code>, <code>pick_type_name</code>, <code>pick_option_name</code> resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>Search on <code>pick_number</code>.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>Pick status (see folder description). Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[status][]","value":"0"},{"disabled":true,"description":{"content":"<p>Warehouse ID. Send multiple times for OR.</p>\n","type":"text/plain"},"key":"filters[warehouse][]","value":""},{"disabled":true,"description":{"content":"<p><code>1</code> = Single, <code>2</code> = Multi.</p>\n","type":"text/plain"},"key":"filters[pick_type][]","value":""},{"disabled":true,"description":{"content":"<p>Pick option (see folder description).</p>\n","type":"text/plain"},"key":"filters[pick_option][]","value":""},{"disabled":true,"description":{"content":"<p>User ID assigned to the pick.</p>\n","type":"text/plain"},"key":"filters[assigned_user][]","value":""},{"disabled":true,"description":{"content":"<p>User ID who created the pick.</p>\n","type":"text/plain"},"key":"filters[creator_user][]","value":""},{"disabled":true,"description":{"content":"<p><code>0</code> = picks generated by API, <code>1</code> = picks generated from the dashboard UI.</p>\n","type":"text/plain"},"key":"filters[ui_pick][]","value":""},{"disabled":true,"description":{"content":"<p>Two unix timestamps comma-joined. Filters on <code>created_at</code>.</p>\n","type":"text/plain"},"key":"filters[create_date_range]","value":""}],"variable":[]}},"response":[{"id":"3864da8e-854b-49e9-9a8e-057da465a194","name":"200 — page of picks","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/picks"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 6,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"data\": [\n        {\n            \"id\": \"15\",\n            \"pick_type\": \"2\",\n            \"pick_option\": \"4\",\n            \"pick_number\": \"PIC-1777460375-773\",\n            \"created_by\": \"4\",\n            \"warehouse_id\": \"6\",\n            \"assigned_to\": null,\n            \"status\": \"0\",\n            \"is_batch\": \"0\",\n            \"is_split\": \"0\",\n            \"ui_pick\": \"0\",\n            \"force_completed\": \"0\",\n            \"completed_at\": null,\n            \"created_at\": \"2026-04-29 11:59:35\",\n            \"pick_type_name\": \"Multi\",\n            \"pick_option_name\": \"Bulk\",\n            \"status_name\": \"OPEN\"\n        }\n    ]\n}"}],"_postman_id":"2bddea0a-9faa-45da-b58f-12328a110072"},{"name":"Get Pick Detail","id":"9f0cf362-a493-485b-9840-03a7fbdc4b20","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/picks/","description":"<p>Returns a single pick with its <code>pick_inventories[]</code> and <code>time_tracking_data[]</code>.</p>\n<h3 id=\"response\">Response</h3>\n<p>Full pick record plus:</p>\n<ul>\n<li><code>pick_inventories[]</code> - one row per item and location to pick; each row carries <code>order_data</code>, <code>location_data</code> and <code>inventory_data</code> objects with the related order, location and inventory item.</li>\n<li><code>time_tracking_data[]</code> - time tracking entries recorded against the pick.</li>\n<li><code>pre_sort_location_links[]</code> - the pre-sort location link per order when the pick has been linked (see <strong>Link Pick to Pre-Sort Location</strong>), otherwise <code>[]</code>.</li>\n</ul>\n<p>Returns <code>404</code> if the pick doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"855cacb5-2432-49ec-85e1-d3a2caeedaa0","name":"200 — pick found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/picks/","description":"Returns a single pick with its `pick_inventories[]` (each enriched with order / location / inventory data) and `time_tracking_data[]`.\n\n### Response\nFull pick record + `pick_inventories[]` + `time_tracking_data[]`. Returns `404` if the pick doesn't exist.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 15,\n  \"pick_type\": 2,\n  \"pick_option\": 4,\n  \"pick_number\": \"PIC-1777460375-773\",\n  \"created_by\": 4,\n  \"warehouse_id\": 6,\n  \"assigned_to\": null,\n  \"status\": 0,\n  \"zone_id\": 0,\n  \"is_batch\": 0,\n  \"is_split\": 0,\n  \"ui_pick\": 0,\n  \"force_completed\": 0,\n  \"completed_at\": null,\n  \"created_at\": \"2026-04-29 11:59:35\",\n  \"updated_at\": \"2026-04-29 11:59:35\",\n  \"pick_type_name\": \"Multi\",\n  \"pick_option_name\": \"Bulk\",\n  \"status_name\": \"OPEN\",\n  \"pick_inventories\": [\n    {\n      \"id\": 139,\n      \"pick_header_id\": 15,\n      \"order_summary_id\": 6308,\n      \"order_inventory_id\": 21144,\n      \"inventory_id\": 1,\n      \"location_id\": 1,\n      \"quantity_to_pick\": 1,\n      \"quantity_picked\": 0,\n      \"picked_by\": null,\n      \"created_at\": \"2026-04-29 11:59:35\",\n      \"updated_at\": \"2026-04-29 11:59:35\",\n      \"order_data\": {\n        \"id\": 6308,\n        \"status_id\": 4,\n        \"previous_status_id\": 3,\n        \"sale_type\": \"B2B\",\n        \"allocation_status_id\": 2,\n        \"bulk_despatched_without_allocation\": 0,\n        \"channel_order_id\": \"1777460098-72\",\n        \"chapi_id\": null,\n        \"channel_id\": 34,\n        \"channel_username\": null,\n        \"channel_alt_id\": null,\n        \"is_merge\": 0,\n        \"is_merged_with_new_logic\": 0,\n        \"is_revertable\": 1,\n        \"merge_order_summary_id\": null,\n        \"is_split\": 0,\n        \"split_order_summary_id\": null,\n        \"is_sorted\": 0,\n        \"contact_id\": 5778,\n        \"shipping_name_company\": \"Hidayet's Company\",\n        \"shipping_name\": \"Hidayet Arasan\",\n        \"shipping_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"shipping_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"shipping_address_city\": \"Mirfield\",\n        \"shipping_address_county\": \"\\u0130zmir\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"WF14 0DE\",\n        \"shipping_address_packing_postcode\": null,\n        \"shipping_address_iso\": \"GB\",\n        \"invoice_name_company\": \"Hidayet's Company\",\n        \"invoice_name\": \"Hidayet Arasan\",\n        \"invoice_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"invoice_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"invoice_address_city\": \"Mirfield\",\n        \"invoice_address_county\": \"\\u0130zmir\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"WF14 0DE\",\n        \"invoice_address_iso\": \"GB\",\n        \"email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"email_shipping\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"phone_one\": \"05555555555\",\n        \"phone_two\": \"5555555555\",\n        \"total_paid\": \"5.0000\",\n        \"total_discount\": \"0.0000\",\n        \"order_discount\": \"0.0000\",\n        \"total_tax\": \"0.0000\",\n        \"auto_calculate_tax\": 1,\n        \"shipping_paid\": \"0.0000\",\n        \"shipping_method_requested\": null,\n        \"lock_shipping_method\": 0,\n        \"shipping_tracking_code\": null,\n        \"payment_method\": \"\",\n        \"payment_ref\": null,\n        \"payment_currency\": \"GBP\",\n        \"sales_channel\": \"\",\n        \"date_received\": \"2026-04-29 11:54:58\",\n        \"date_dispatched\": \"0000-00-00 00:00:00\",\n        \"collection_date\": null,\n        \"allowed_despatch_date\": null,\n        \"ship_by_date\": null,\n        \"customer_comments\": null,\n        \"gift_note\": null,\n        \"delivery_instructions\": null,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"channel_updated\": 0,\n        \"channel_updated_time\": 0,\n        \"total_weight\": \"1.000\",\n        \"one_off_shipment\": 0,\n        \"shipment_id\": null,\n        \"fulfilment_client_id\": null,\n        \"sync_informed\": 0,\n        \"total_inventory_count\": 2,\n        \"total_inventory_quantity\": 3,\n        \"stock_levels_adjusted\": 0,\n        \"custom_fields\": null,\n        \"pudo_id\": null,\n        \"ioss_number\": \"Ioss\",\n        \"ukims_number\": \"Ukims\",\n        \"vat_number\": \"123456\",\n        \"eori_number\": \"Eori\",\n        \"tax_id\": \"1232134211\",\n        \"access_url\": null,\n        \"packer_id\": null,\n        \"packed_at\": 0,\n        \"calculated_shipping_service\": null,\n        \"calculated_shipping_service_run_count\": 0,\n        \"is_sent_accounting_invoice\": 0,\n        \"pregenerated_label\": 0,\n        \"has_ecommerce_return\": 0,\n        \"is_locked\": 0,\n        \"is_bopis\": 0,\n        \"is_easyship\": 0,\n        \"is_force_despatched\": 0,\n        \"is_force_locked\": 0,\n        \"is_dropship\": 0,\n        \"fulfilment_job_status\": 0,\n        \"is_new_order\": 0,\n        \"is_archived\": 0,\n        \"created_at\": \"2026-04-29 11:54:58\",\n        \"updated_at\": \"2026-04-29 11:59:35\",\n        \"webhook_run_id\": null,\n        \"batch_label\": 0,\n        \"is_mcf\": 0,\n        \"mcf_plugin_id\": null,\n        \"created_date\": \"2026-04-29\",\n        \"is_pos\": 0,\n        \"tracking_status_id\": null,\n        \"dtpp_run\": null,\n        \"dtpp_queue_status\": null,\n        \"dtpp_started_at\": null,\n        \"dtpp_queue_error\": null,\n        \"pick_completed_at\": null\n      },\n      \"location_data\": {\n        \"id\": 1,\n        \"type_id\": null,\n        \"parent_location_id\": null,\n        \"legacy_id\": null,\n        \"location_name\": \"Default\",\n        \"priority\": 1000,\n        \"pickable\": 1,\n        \"allow_box_splitting\": 1,\n        \"allow_negative\": 0,\n        \"on_hand_stock\": 1,\n        \"warehouse_id\": 6,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"pm_plugin_capacity_type\": 2,\n        \"pm_plugin_capacity_value\": 1,\n        \"pm_plugin_current_capacity\": 0,\n        \"pm_plugin_allow_mixed_products\": 1,\n        \"pm_plugin_not_in_use\": 0,\n        \"pm_plugin_has_mixed_product\": 0,\n        \"created_at\": \"0000-00-00 00:00:00\",\n        \"updated_at\": \"2026-02-25 12:00:20\",\n        \"iso_countries\": \"\",\n        \"barcode\": \"Default\"\n      },\n      \"inventory_data\": {\n        \"id\": 1,\n        \"legacy_id\": null,\n        \"type\": 1,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0,\n        \"service_id\": null,\n        \"dropshipping_type\": 0,\n        \"sync_stock\": 0,\n        \"include_component_stock_level\": 0,\n        \"fulfilment_client_id\": null,\n        \"sku\": \"ha_product_test_1\",\n        \"secondary_sku\": null,\n        \"sku_hash\": \"0472c3fc59ce8a84bc09c5e40693c764\",\n        \"vendor_sku\": null,\n        \"chapi_id\": \"1bf51964-790b-4ca4-b054-36a6f4580c66\",\n        \"stock_level\": 10129,\n        \"stock_level_open\": 415,\n        \"stock_level_global_available\": 9714,\n        \"stock_level_available\": 9723,\n        \"stock_warn_level\": 0,\n        \"item_barcode\": \"1234567898765\",\n        \"item_barcode_2\": null,\n        \"item_barcode_3\": null,\n        \"item_barcode_4\": null,\n        \"item_barcode_5\": null,\n        \"thumbnail_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"single_parcel_per_item\": 0,\n        \"name\": \"HA Product Test - 1\",\n        \"product_weight\": \"1.000\",\n        \"product_height\": \"1.0\",\n        \"product_width\": \"1.0\",\n        \"product_length\": \"1.0\",\n        \"product_box_type\": 1,\n        \"product_box_quantity\": 1,\n        \"picking_by_packaging\": 0,\n        \"default_packaging_id\": 0,\n        \"description\": null,\n        \"country_of_origin\": \"GB\",\n        \"hs_code\": \"HSTest1\",\n        \"customs_description\": null,\n        \"unit_price\": \"1.0000\",\n        \"cost_price\": null,\n        \"shipping_service_id\": 0,\n        \"zone\": \"\",\n        \"multiplier\": 1,\n        \"include_po_stock\": 0,\n        \"custom_fields\": null,\n        \"dynamic_components_type\": 0,\n        \"is_archived\": 0,\n        \"archived_sync_stock\": null,\n        \"temp_image_url\": null,\n        \"ghost_asset\": 0,\n        \"master_dropshipping\": 0,\n        \"include_po_level\": 0,\n        \"fabric_content\": null,\n        \"low_stock_email_sent_time\": 0,\n        \"vat_rate_percentage\": \"20.0000\",\n        \"stock_update_scheduled_at\": \"2026-03-18 11:22:02\",\n        \"created_at\": \"2026-02-25 12:17:19\",\n        \"updated_at\": \"2026-04-30 13:59:09\",\n        \"dont_sync_until\": null,\n        \"assembly_notes\": null,\n        \"customs_value\": null\n      }\n    },\n    {\n      \"id\": 140,\n      \"pick_header_id\": 15,\n      \"order_summary_id\": 6309,\n      \"order_inventory_id\": 21146,\n      \"inventory_id\": 1,\n      \"location_id\": 1,\n      \"quantity_to_pick\": 1,\n      \"quantity_picked\": 0,\n      \"picked_by\": null,\n      \"created_at\": \"2026-04-29 11:59:35\",\n      \"updated_at\": \"2026-04-29 11:59:35\",\n      \"order_data\": {\n        \"id\": 6309,\n        \"status_id\": 4,\n        \"previous_status_id\": 3,\n        \"sale_type\": \"B2B\",\n        \"allocation_status_id\": 2,\n        \"bulk_despatched_without_allocation\": 0,\n        \"channel_order_id\": \"1777460098-65\",\n        \"chapi_id\": null,\n        \"channel_id\": 34,\n        \"channel_username\": null,\n        \"channel_alt_id\": null,\n        \"is_merge\": 0,\n        \"is_merged_with_new_logic\": 0,\n        \"is_revertable\": 1,\n        \"merge_order_summary_id\": null,\n        \"is_split\": 0,\n        \"split_order_summary_id\": null,\n        \"is_sorted\": 0,\n        \"contact_id\": 5778,\n        \"shipping_name_company\": \"Hidayet's Company\",\n        \"shipping_name\": \"Hidayet Arasan\",\n        \"shipping_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"shipping_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"shipping_address_city\": \"Mirfield\",\n        \"shipping_address_county\": \"\\u0130zmir\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"WF14 0DE\",\n        \"shipping_address_packing_postcode\": null,\n        \"shipping_address_iso\": \"GB\",\n        \"invoice_name_company\": \"Hidayet's Company\",\n        \"invoice_name\": \"Hidayet Arasan\",\n        \"invoice_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"invoice_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"invoice_address_city\": \"Mirfield\",\n        \"invoice_address_county\": \"\\u0130zmir\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"WF14 0DE\",\n        \"invoice_address_iso\": \"GB\",\n        \"email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"email_shipping\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"phone_one\": \"05555555555\",\n        \"phone_two\": \"5555555555\",\n        \"total_paid\": \"5.0000\",\n        \"total_discount\": \"0.0000\",\n        \"order_discount\": \"0.0000\",\n        \"total_tax\": \"0.0000\",\n        \"auto_calculate_tax\": 1,\n        \"shipping_paid\": \"0.0000\",\n        \"shipping_method_requested\": null,\n        \"lock_shipping_method\": 0,\n        \"shipping_tracking_code\": null,\n        \"payment_method\": \"\",\n        \"payment_ref\": null,\n        \"payment_currency\": \"GBP\",\n        \"sales_channel\": \"\",\n        \"date_received\": \"2026-04-29 11:54:58\",\n        \"date_dispatched\": \"0000-00-00 00:00:00\",\n        \"collection_date\": null,\n        \"allowed_despatch_date\": null,\n        \"ship_by_date\": null,\n        \"customer_comments\": null,\n        \"gift_note\": null,\n        \"delivery_instructions\": null,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"channel_updated\": 0,\n        \"channel_updated_time\": 0,\n        \"total_weight\": \"1.000\",\n        \"one_off_shipment\": 0,\n        \"shipment_id\": null,\n        \"fulfilment_client_id\": null,\n        \"sync_informed\": 0,\n        \"total_inventory_count\": 2,\n        \"total_inventory_quantity\": 3,\n        \"stock_levels_adjusted\": 0,\n        \"custom_fields\": null,\n        \"pudo_id\": null,\n        \"ioss_number\": \"Ioss\",\n        \"ukims_number\": \"Ukims\",\n        \"vat_number\": \"123456\",\n        \"eori_number\": \"Eori\",\n        \"tax_id\": \"1232134211\",\n        \"access_url\": null,\n        \"packer_id\": null,\n        \"packed_at\": 0,\n        \"calculated_shipping_service\": null,\n        \"calculated_shipping_service_run_count\": 0,\n        \"is_sent_accounting_invoice\": 0,\n        \"pregenerated_label\": 0,\n        \"has_ecommerce_return\": 0,\n        \"is_locked\": 0,\n        \"is_bopis\": 0,\n        \"is_easyship\": 0,\n        \"is_force_despatched\": 0,\n        \"is_force_locked\": 0,\n        \"is_dropship\": 0,\n        \"fulfilment_job_status\": 0,\n        \"is_new_order\": 0,\n        \"is_archived\": 0,\n        \"created_at\": \"2026-04-29 11:54:58\",\n        \"updated_at\": \"2026-04-29 11:59:35\",\n        \"webhook_run_id\": null,\n        \"batch_label\": 0,\n        \"is_mcf\": 0,\n        \"mcf_plugin_id\": null,\n        \"created_date\": \"2026-04-29\",\n        \"is_pos\": 0,\n        \"tracking_status_id\": null,\n        \"dtpp_run\": null,\n        \"dtpp_queue_status\": null,\n        \"dtpp_started_at\": null,\n        \"dtpp_queue_error\": null,\n        \"pick_completed_at\": null\n      },\n      \"location_data\": {\n        \"id\": 1,\n        \"type_id\": null,\n        \"parent_location_id\": null,\n        \"legacy_id\": null,\n        \"location_name\": \"Default\",\n        \"priority\": 1000,\n        \"pickable\": 1,\n        \"allow_box_splitting\": 1,\n        \"allow_negative\": 0,\n        \"on_hand_stock\": 1,\n        \"warehouse_id\": 6,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"pm_plugin_capacity_type\": 2,\n        \"pm_plugin_capacity_value\": 1,\n        \"pm_plugin_current_capacity\": 0,\n        \"pm_plugin_allow_mixed_products\": 1,\n        \"pm_plugin_not_in_use\": 0,\n        \"pm_plugin_has_mixed_product\": 0,\n        \"created_at\": \"0000-00-00 00:00:00\",\n        \"updated_at\": \"2026-02-25 12:00:20\",\n        \"iso_countries\": \"\",\n        \"barcode\": \"Default\"\n      },\n      \"inventory_data\": {\n        \"id\": 1,\n        \"legacy_id\": null,\n        \"type\": 1,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0,\n        \"service_id\": null,\n        \"dropshipping_type\": 0,\n        \"sync_stock\": 0,\n        \"include_component_stock_level\": 0,\n        \"fulfilment_client_id\": null,\n        \"sku\": \"ha_product_test_1\",\n        \"secondary_sku\": null,\n        \"sku_hash\": \"0472c3fc59ce8a84bc09c5e40693c764\",\n        \"vendor_sku\": null,\n        \"chapi_id\": \"1bf51964-790b-4ca4-b054-36a6f4580c66\",\n        \"stock_level\": 10129,\n        \"stock_level_open\": 415,\n        \"stock_level_global_available\": 9714,\n        \"stock_level_available\": 9723,\n        \"stock_warn_level\": 0,\n        \"item_barcode\": \"1234567898765\",\n        \"item_barcode_2\": null,\n        \"item_barcode_3\": null,\n        \"item_barcode_4\": null,\n        \"item_barcode_5\": null,\n        \"thumbnail_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"single_parcel_per_item\": 0,\n        \"name\": \"HA Product Test - 1\",\n        \"product_weight\": \"1.000\",\n        \"product_height\": \"1.0\",\n        \"product_width\": \"1.0\",\n        \"product_length\": \"1.0\",\n        \"product_box_type\": 1,\n        \"product_box_quantity\": 1,\n        \"picking_by_packaging\": 0,\n        \"default_packaging_id\": 0,\n        \"description\": null,\n        \"country_of_origin\": \"GB\",\n        \"hs_code\": \"HSTest1\",\n        \"customs_description\": null,\n        \"unit_price\": \"1.0000\",\n        \"cost_price\": null,\n        \"shipping_service_id\": 0,\n        \"zone\": \"\",\n        \"multiplier\": 1,\n        \"include_po_stock\": 0,\n        \"custom_fields\": null,\n        \"dynamic_components_type\": 0,\n        \"is_archived\": 0,\n        \"archived_sync_stock\": null,\n        \"temp_image_url\": null,\n        \"ghost_asset\": 0,\n        \"master_dropshipping\": 0,\n        \"include_po_level\": 0,\n        \"fabric_content\": null,\n        \"low_stock_email_sent_time\": 0,\n        \"vat_rate_percentage\": \"20.0000\",\n        \"stock_update_scheduled_at\": \"2026-03-18 11:22:02\",\n        \"created_at\": \"2026-02-25 12:17:19\",\n        \"updated_at\": \"2026-04-30 13:59:09\",\n        \"dont_sync_until\": null,\n        \"assembly_notes\": null,\n        \"customs_value\": null\n      }\n    },\n    {\n      \"id\": 141,\n      \"pick_header_id\": 15,\n      \"order_summary_id\": 6308,\n      \"order_inventory_id\": 21145,\n      \"inventory_id\": 2,\n      \"location_id\": 1,\n      \"quantity_to_pick\": 2,\n      \"quantity_picked\": 0,\n      \"picked_by\": null,\n      \"created_at\": \"2026-04-29 11:59:35\",\n      \"updated_at\": \"2026-04-29 11:59:35\",\n      \"order_data\": {\n        \"id\": 6308,\n        \"status_id\": 4,\n        \"previous_status_id\": 3,\n        \"sale_type\": \"B2B\",\n        \"allocation_status_id\": 2,\n        \"bulk_despatched_without_allocation\": 0,\n        \"channel_order_id\": \"1777460098-72\",\n        \"chapi_id\": null,\n        \"channel_id\": 34,\n        \"channel_username\": null,\n        \"channel_alt_id\": null,\n        \"is_merge\": 0,\n        \"is_merged_with_new_logic\": 0,\n        \"is_revertable\": 1,\n        \"merge_order_summary_id\": null,\n        \"is_split\": 0,\n        \"split_order_summary_id\": null,\n        \"is_sorted\": 0,\n        \"contact_id\": 5778,\n        \"shipping_name_company\": \"Hidayet's Company\",\n        \"shipping_name\": \"Hidayet Arasan\",\n        \"shipping_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"shipping_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"shipping_address_city\": \"Mirfield\",\n        \"shipping_address_county\": \"\\u0130zmir\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"WF14 0DE\",\n        \"shipping_address_packing_postcode\": null,\n        \"shipping_address_iso\": \"GB\",\n        \"invoice_name_company\": \"Hidayet's Company\",\n        \"invoice_name\": \"Hidayet Arasan\",\n        \"invoice_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"invoice_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"invoice_address_city\": \"Mirfield\",\n        \"invoice_address_county\": \"\\u0130zmir\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"WF14 0DE\",\n        \"invoice_address_iso\": \"GB\",\n        \"email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"email_shipping\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"phone_one\": \"05555555555\",\n        \"phone_two\": \"5555555555\",\n        \"total_paid\": \"5.0000\",\n        \"total_discount\": \"0.0000\",\n        \"order_discount\": \"0.0000\",\n        \"total_tax\": \"0.0000\",\n        \"auto_calculate_tax\": 1,\n        \"shipping_paid\": \"0.0000\",\n        \"shipping_method_requested\": null,\n        \"lock_shipping_method\": 0,\n        \"shipping_tracking_code\": null,\n        \"payment_method\": \"\",\n        \"payment_ref\": null,\n        \"payment_currency\": \"GBP\",\n        \"sales_channel\": \"\",\n        \"date_received\": \"2026-04-29 11:54:58\",\n        \"date_dispatched\": \"0000-00-00 00:00:00\",\n        \"collection_date\": null,\n        \"allowed_despatch_date\": null,\n        \"ship_by_date\": null,\n        \"customer_comments\": null,\n        \"gift_note\": null,\n        \"delivery_instructions\": null,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"channel_updated\": 0,\n        \"channel_updated_time\": 0,\n        \"total_weight\": \"1.000\",\n        \"one_off_shipment\": 0,\n        \"shipment_id\": null,\n        \"fulfilment_client_id\": null,\n        \"sync_informed\": 0,\n        \"total_inventory_count\": 2,\n        \"total_inventory_quantity\": 3,\n        \"stock_levels_adjusted\": 0,\n        \"custom_fields\": null,\n        \"pudo_id\": null,\n        \"ioss_number\": \"Ioss\",\n        \"ukims_number\": \"Ukims\",\n        \"vat_number\": \"123456\",\n        \"eori_number\": \"Eori\",\n        \"tax_id\": \"1232134211\",\n        \"access_url\": null,\n        \"packer_id\": null,\n        \"packed_at\": 0,\n        \"calculated_shipping_service\": null,\n        \"calculated_shipping_service_run_count\": 0,\n        \"is_sent_accounting_invoice\": 0,\n        \"pregenerated_label\": 0,\n        \"has_ecommerce_return\": 0,\n        \"is_locked\": 0,\n        \"is_bopis\": 0,\n        \"is_easyship\": 0,\n        \"is_force_despatched\": 0,\n        \"is_force_locked\": 0,\n        \"is_dropship\": 0,\n        \"fulfilment_job_status\": 0,\n        \"is_new_order\": 0,\n        \"is_archived\": 0,\n        \"created_at\": \"2026-04-29 11:54:58\",\n        \"updated_at\": \"2026-04-29 11:59:35\",\n        \"webhook_run_id\": null,\n        \"batch_label\": 0,\n        \"is_mcf\": 0,\n        \"mcf_plugin_id\": null,\n        \"created_date\": \"2026-04-29\",\n        \"is_pos\": 0,\n        \"tracking_status_id\": null,\n        \"dtpp_run\": null,\n        \"dtpp_queue_status\": null,\n        \"dtpp_started_at\": null,\n        \"dtpp_queue_error\": null,\n        \"pick_completed_at\": null\n      },\n      \"location_data\": {\n        \"id\": 1,\n        \"type_id\": null,\n        \"parent_location_id\": null,\n        \"legacy_id\": null,\n        \"location_name\": \"Default\",\n        \"priority\": 1000,\n        \"pickable\": 1,\n        \"allow_box_splitting\": 1,\n        \"allow_negative\": 0,\n        \"on_hand_stock\": 1,\n        \"warehouse_id\": 6,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"pm_plugin_capacity_type\": 2,\n        \"pm_plugin_capacity_value\": 1,\n        \"pm_plugin_current_capacity\": 0,\n        \"pm_plugin_allow_mixed_products\": 1,\n        \"pm_plugin_not_in_use\": 0,\n        \"pm_plugin_has_mixed_product\": 0,\n        \"created_at\": \"0000-00-00 00:00:00\",\n        \"updated_at\": \"2026-02-25 12:00:20\",\n        \"iso_countries\": \"\",\n        \"barcode\": \"Default\"\n      },\n      \"inventory_data\": {\n        \"id\": 2,\n        \"legacy_id\": null,\n        \"type\": 1,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0,\n        \"service_id\": null,\n        \"dropshipping_type\": 0,\n        \"sync_stock\": 0,\n        \"include_component_stock_level\": 0,\n        \"fulfilment_client_id\": null,\n        \"sku\": \"ha_product_test_2\",\n        \"secondary_sku\": null,\n        \"sku_hash\": \"14923e43cb1b76222f8cdd1b0b20fb6e\",\n        \"vendor_sku\": null,\n        \"chapi_id\": \"c1b65cfc-188f-4e45-87a9-8761c220ff90\",\n        \"stock_level\": 9935,\n        \"stock_level_open\": 824,\n        \"stock_level_global_available\": 9111,\n        \"stock_level_available\": 9123,\n        \"stock_warn_level\": 0,\n        \"item_barcode\": \"98765432345678\",\n        \"item_barcode_2\": null,\n        \"item_barcode_3\": null,\n        \"item_barcode_4\": null,\n        \"item_barcode_5\": null,\n        \"thumbnail_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"single_parcel_per_item\": 0,\n        \"name\": \"HA Product Test - 2\",\n        \"product_weight\": \"0.000\",\n        \"product_height\": \"0.0\",\n        \"product_width\": \"0.0\",\n        \"product_length\": \"0.0\",\n        \"product_box_type\": 1,\n        \"product_box_quantity\": 1,\n        \"picking_by_packaging\": 0,\n        \"default_packaging_id\": 0,\n        \"description\": null,\n        \"country_of_origin\": \"GB\",\n        \"hs_code\": \"HSTest2\",\n        \"customs_description\": null,\n        \"unit_price\": \"2.0000\",\n        \"cost_price\": null,\n        \"shipping_service_id\": 0,\n        \"zone\": \"\",\n        \"multiplier\": 1,\n        \"include_po_stock\": 0,\n        \"custom_fields\": null,\n        \"dynamic_components_type\": 0,\n        \"is_archived\": 0,\n        \"archived_sync_stock\": null,\n        \"temp_image_url\": null,\n        \"ghost_asset\": 0,\n        \"master_dropshipping\": 0,\n        \"include_po_level\": 0,\n        \"fabric_content\": null,\n        \"low_stock_email_sent_time\": 0,\n        \"vat_rate_percentage\": \"20.0000\",\n        \"stock_update_scheduled_at\": \"2026-03-18 11:22:12\",\n        \"created_at\": \"2026-02-25 12:17:19\",\n        \"updated_at\": \"2026-04-30 13:26:04\",\n        \"dont_sync_until\": null,\n        \"assembly_notes\": null,\n        \"customs_value\": null\n      }\n    },\n    {\n      \"id\": 142,\n      \"pick_header_id\": 15,\n      \"order_summary_id\": 6309,\n      \"order_inventory_id\": 21147,\n      \"inventory_id\": 2,\n      \"location_id\": 1,\n      \"quantity_to_pick\": 2,\n      \"quantity_picked\": 0,\n      \"picked_by\": null,\n      \"created_at\": \"2026-04-29 11:59:35\",\n      \"updated_at\": \"2026-04-29 11:59:35\",\n      \"order_data\": {\n        \"id\": 6309,\n        \"status_id\": 4,\n        \"previous_status_id\": 3,\n        \"sale_type\": \"B2B\",\n        \"allocation_status_id\": 2,\n        \"bulk_despatched_without_allocation\": 0,\n        \"channel_order_id\": \"1777460098-65\",\n        \"chapi_id\": null,\n        \"channel_id\": 34,\n        \"channel_username\": null,\n        \"channel_alt_id\": null,\n        \"is_merge\": 0,\n        \"is_merged_with_new_logic\": 0,\n        \"is_revertable\": 1,\n        \"merge_order_summary_id\": null,\n        \"is_split\": 0,\n        \"split_order_summary_id\": null,\n        \"is_sorted\": 0,\n        \"contact_id\": 5778,\n        \"shipping_name_company\": \"Hidayet's Company\",\n        \"shipping_name\": \"Hidayet Arasan\",\n        \"shipping_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"shipping_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"shipping_address_city\": \"Mirfield\",\n        \"shipping_address_county\": \"\\u0130zmir\",\n        \"shipping_address_country\": \"United Kingdom\",\n        \"shipping_address_postcode\": \"WF14 0DE\",\n        \"shipping_address_packing_postcode\": null,\n        \"shipping_address_iso\": \"GB\",\n        \"invoice_name_company\": \"Hidayet's Company\",\n        \"invoice_name\": \"Hidayet Arasan\",\n        \"invoice_address_line_one\": \"Bostanl\\u0131 Mahallesi 11/22\",\n        \"invoice_address_line_two\": \"Aaa Park 54 Leeds Road\",\n        \"invoice_address_city\": \"Mirfield\",\n        \"invoice_address_county\": \"\\u0130zmir\",\n        \"invoice_address_country\": \"United Kingdom\",\n        \"invoice_address_postcode\": \"WF14 0DE\",\n        \"invoice_address_iso\": \"GB\",\n        \"email\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"email_shipping\": \"Hidayet.Arasan@thedespatchcompany.com\",\n        \"phone_one\": \"05555555555\",\n        \"phone_two\": \"5555555555\",\n        \"total_paid\": \"5.0000\",\n        \"total_discount\": \"0.0000\",\n        \"order_discount\": \"0.0000\",\n        \"total_tax\": \"0.0000\",\n        \"auto_calculate_tax\": 1,\n        \"shipping_paid\": \"0.0000\",\n        \"shipping_method_requested\": null,\n        \"lock_shipping_method\": 0,\n        \"shipping_tracking_code\": null,\n        \"payment_method\": \"\",\n        \"payment_ref\": null,\n        \"payment_currency\": \"GBP\",\n        \"sales_channel\": \"\",\n        \"date_received\": \"2026-04-29 11:54:58\",\n        \"date_dispatched\": \"0000-00-00 00:00:00\",\n        \"collection_date\": null,\n        \"allowed_despatch_date\": null,\n        \"ship_by_date\": null,\n        \"customer_comments\": null,\n        \"gift_note\": null,\n        \"delivery_instructions\": null,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"channel_updated\": 0,\n        \"channel_updated_time\": 0,\n        \"total_weight\": \"1.000\",\n        \"one_off_shipment\": 0,\n        \"shipment_id\": null,\n        \"fulfilment_client_id\": null,\n        \"sync_informed\": 0,\n        \"total_inventory_count\": 2,\n        \"total_inventory_quantity\": 3,\n        \"stock_levels_adjusted\": 0,\n        \"custom_fields\": null,\n        \"pudo_id\": null,\n        \"ioss_number\": \"Ioss\",\n        \"ukims_number\": \"Ukims\",\n        \"vat_number\": \"123456\",\n        \"eori_number\": \"Eori\",\n        \"tax_id\": \"1232134211\",\n        \"access_url\": null,\n        \"packer_id\": null,\n        \"packed_at\": 0,\n        \"calculated_shipping_service\": null,\n        \"calculated_shipping_service_run_count\": 0,\n        \"is_sent_accounting_invoice\": 0,\n        \"pregenerated_label\": 0,\n        \"has_ecommerce_return\": 0,\n        \"is_locked\": 0,\n        \"is_bopis\": 0,\n        \"is_easyship\": 0,\n        \"is_force_despatched\": 0,\n        \"is_force_locked\": 0,\n        \"is_dropship\": 0,\n        \"fulfilment_job_status\": 0,\n        \"is_new_order\": 0,\n        \"is_archived\": 0,\n        \"created_at\": \"2026-04-29 11:54:58\",\n        \"updated_at\": \"2026-04-29 11:59:35\",\n        \"webhook_run_id\": null,\n        \"batch_label\": 0,\n        \"is_mcf\": 0,\n        \"mcf_plugin_id\": null,\n        \"created_date\": \"2026-04-29\",\n        \"is_pos\": 0,\n        \"tracking_status_id\": null,\n        \"dtpp_run\": null,\n        \"dtpp_queue_status\": null,\n        \"dtpp_started_at\": null,\n        \"dtpp_queue_error\": null,\n        \"pick_completed_at\": null\n      },\n      \"location_data\": {\n        \"id\": 1,\n        \"type_id\": null,\n        \"parent_location_id\": null,\n        \"legacy_id\": null,\n        \"location_name\": \"Default\",\n        \"priority\": 1000,\n        \"pickable\": 1,\n        \"allow_box_splitting\": 1,\n        \"allow_negative\": 0,\n        \"on_hand_stock\": 1,\n        \"warehouse_id\": 6,\n        \"deleted\": 0,\n        \"deleted_at\": null,\n        \"pm_plugin_capacity_type\": 2,\n        \"pm_plugin_capacity_value\": 1,\n        \"pm_plugin_current_capacity\": 0,\n        \"pm_plugin_allow_mixed_products\": 1,\n        \"pm_plugin_not_in_use\": 0,\n        \"pm_plugin_has_mixed_product\": 0,\n        \"created_at\": \"0000-00-00 00:00:00\",\n        \"updated_at\": \"2026-02-25 12:00:20\",\n        \"iso_countries\": \"\",\n        \"barcode\": \"Default\"\n      },\n      \"inventory_data\": {\n        \"id\": 2,\n        \"legacy_id\": null,\n        \"type\": 1,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0,\n        \"service_id\": null,\n        \"dropshipping_type\": 0,\n        \"sync_stock\": 0,\n        \"include_component_stock_level\": 0,\n        \"fulfilment_client_id\": null,\n        \"sku\": \"ha_product_test_2\",\n        \"secondary_sku\": null,\n        \"sku_hash\": \"14923e43cb1b76222f8cdd1b0b20fb6e\",\n        \"vendor_sku\": null,\n        \"chapi_id\": \"c1b65cfc-188f-4e45-87a9-8761c220ff90\",\n        \"stock_level\": 9935,\n        \"stock_level_open\": 824,\n        \"stock_level_global_available\": 9111,\n        \"stock_level_available\": 9123,\n        \"stock_warn_level\": 0,\n        \"item_barcode\": \"98765432345678\",\n        \"item_barcode_2\": null,\n        \"item_barcode_3\": null,\n        \"item_barcode_4\": null,\n        \"item_barcode_5\": null,\n        \"thumbnail_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"single_parcel_per_item\": 0,\n        \"name\": \"HA Product Test - 2\",\n        \"product_weight\": \"0.000\",\n        \"product_height\": \"0.0\",\n        \"product_width\": \"0.0\",\n        \"product_length\": \"0.0\",\n        \"product_box_type\": 1,\n        \"product_box_quantity\": 1,\n        \"picking_by_packaging\": 0,\n        \"default_packaging_id\": 0,\n        \"description\": null,\n        \"country_of_origin\": \"GB\",\n        \"hs_code\": \"HSTest2\",\n        \"customs_description\": null,\n        \"unit_price\": \"2.0000\",\n        \"cost_price\": null,\n        \"shipping_service_id\": 0,\n        \"zone\": \"\",\n        \"multiplier\": 1,\n        \"include_po_stock\": 0,\n        \"custom_fields\": null,\n        \"dynamic_components_type\": 0,\n        \"is_archived\": 0,\n        \"archived_sync_stock\": null,\n        \"temp_image_url\": null,\n        \"ghost_asset\": 0,\n        \"master_dropshipping\": 0,\n        \"include_po_level\": 0,\n        \"fabric_content\": null,\n        \"low_stock_email_sent_time\": 0,\n        \"vat_rate_percentage\": \"20.0000\",\n        \"stock_update_scheduled_at\": \"2026-03-18 11:22:12\",\n        \"created_at\": \"2026-02-25 12:17:19\",\n        \"updated_at\": \"2026-04-30 13:26:04\",\n        \"dont_sync_until\": null,\n        \"assembly_notes\": null,\n        \"customs_value\": null\n      }\n    }\n  ],\n  \"time_tracking_data\": [\n    {\n      \"id\": 13,\n      \"action\": \"SCAN\",\n      \"type\": \"TOTE_SCAN\",\n      \"duration\": 2400,\n      \"action_date\": \"2026-04-29 09:00:00\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": null,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": null,\n      \"warehouse_id\": 6,\n      \"location_id\": 64,\n      \"inventory_id\": null,\n      \"quantity\": null,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:28\",\n      \"updated_at\": \"2026-04-29 14:06:28\"\n    },\n    {\n      \"id\": 14,\n      \"action\": \"SCAN\",\n      \"type\": \"LOCATION_SCAN\",\n      \"duration\": 8500,\n      \"action_date\": \"2026-04-29 09:00:08\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": 6309,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": 142,\n      \"warehouse_id\": 6,\n      \"location_id\": 1,\n      \"inventory_id\": 2,\n      \"quantity\": null,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:29\",\n      \"updated_at\": \"2026-04-29 14:06:29\"\n    },\n    {\n      \"id\": 15,\n      \"action\": \"SCAN\",\n      \"type\": \"ITEM_SCAN\",\n      \"duration\": 2200,\n      \"action_date\": \"2026-04-29 09:00:11\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": 6309,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": 142,\n      \"warehouse_id\": 6,\n      \"location_id\": 1,\n      \"inventory_id\": 2,\n      \"quantity\": 1,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:29\",\n      \"updated_at\": \"2026-04-29 14:06:29\"\n    },\n    {\n      \"id\": 16,\n      \"action\": \"SCAN\",\n      \"type\": \"ITEM_SCAN\",\n      \"duration\": 2900,\n      \"action_date\": \"2026-04-29 09:00:14\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": 6308,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": 141,\n      \"warehouse_id\": 6,\n      \"location_id\": 1,\n      \"inventory_id\": 2,\n      \"quantity\": 1,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:29\",\n      \"updated_at\": \"2026-04-29 14:06:29\"\n    },\n    {\n      \"id\": 17,\n      \"action\": \"SCAN\",\n      \"type\": \"ITEM_SCAN\",\n      \"duration\": 2400,\n      \"action_date\": \"2026-04-29 09:00:17\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": 6309,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": 140,\n      \"warehouse_id\": 6,\n      \"location_id\": 1,\n      \"inventory_id\": 1,\n      \"quantity\": 1,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:30\",\n      \"updated_at\": \"2026-04-29 14:06:30\"\n    },\n    {\n      \"id\": 18,\n      \"action\": \"SCAN\",\n      \"type\": \"ITEM_SCAN\",\n      \"duration\": 2100,\n      \"action_date\": \"2026-04-29 09:00:19\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": 6308,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": 139,\n      \"warehouse_id\": 6,\n      \"location_id\": 1,\n      \"inventory_id\": 1,\n      \"quantity\": 1,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:30\",\n      \"updated_at\": \"2026-04-29 14:06:30\"\n    },\n    {\n      \"id\": 19,\n      \"action\": \"OTHER\",\n      \"type\": \"CUSTOM_SCAN\",\n      \"duration\": 38000,\n      \"action_date\": \"2026-04-29 09:00:57\",\n      \"model_id\": null,\n      \"user_id\": 4,\n      \"order_summary_id\": null,\n      \"pick_header_id\": 15,\n      \"purchase_order_summary_id\": null,\n      \"pick_inventory_id\": null,\n      \"warehouse_id\": 6,\n      \"location_id\": null,\n      \"inventory_id\": null,\n      \"quantity\": null,\n      \"data\": null,\n      \"extra\": null,\n      \"created_at\": \"2026-04-29 14:06:31\",\n      \"updated_at\": \"2026-04-29 14:06:31\"\n    }\n  ]\n}"}],"_postman_id":"9f0cf362-a493-485b-9840-03a7fbdc4b20"},{"name":"Update Product Picks","id":"0d4b070c-ce5a-464a-8b17-5cc44251783e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"action\": \"increase\",\n    \"inventory_id\": 1,\n    \"location_id\": 1,\n    \"quantity\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//update_product_picks","description":"<p>Adjusts the quantity or completion state of a product line within a pick.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td>yes</td>\n<td>One of <code>decrease</code>, <code>increase</code>, <code>reset</code>, <code>complete</code>.</td>\n</tr>\n<tr>\n<td><code>inventory_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The product to adjust.</td>\n</tr>\n<tr>\n<td><code>location_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Specific warehouse location. Required when allocating from a particular bin.</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>int</td>\n<td>no</td>\n<td>Quantity delta. Required for <code>decrease</code> and <code>increase</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"behaviour\">Behaviour</h3>\n<ul>\n<li><code>decrease</code> / <code>increase</code>: changes the picked quantity by <code>quantity</code>.</li>\n<li><code>reset</code>: resets picked quantity to 0.</li>\n<li><code>complete</code>: marks the inventory line as fully picked.</li>\n<li>Stock allocations are moved between locations as needed; if every line is complete the order's pick status updates accordingly.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The affected <code>pick_inventory</code> records after the update.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks","","update_product_picks"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"0cf649e0-c164-4c65-ac50-065b6ba50cdc","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"action\": \"increase\",\n    \"inventory_id\": 1,\n    \"location_id\": 1,\n    \"quantity\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//update_product_picks","description":"Adjusts the quantity or completion state of a product line within a pick.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `action` | string | yes | One of `decrease`, `increase`, `reset`, `complete`. |\n| `inventory_id` | int | yes | The product to adjust. |\n| `location_id` | int | no | Specific warehouse location. Required when allocating from a particular bin. |\n| `quantity` | int | no | Quantity delta. Required for `decrease` and `increase`. |\n\n### Behaviour\n- `decrease` / `increase`: changes the picked quantity by `quantity`.\n- `reset`: resets picked quantity to 0.\n- `complete`: marks the inventory line as fully picked.\n- Stock allocations are moved between locations as needed; if every line is complete the order's pick status updates accordingly.\n\n### Response\nThe affected `pick_inventory` records after the update.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 220,\n    \"pick_header_id\": 17,\n    \"order_summary_id\": 5410,\n    \"order_inventory_id\": 19873,\n    \"inventory_id\": 1,\n    \"location_id\": 1,\n    \"quantity_to_pick\": 1,\n    \"quantity_picked\": 1,\n    \"picked_by\": null,\n    \"created_at\": \"2026-04-30 13:26:05\",\n    \"updated_at\": \"2026-04-30 13:26:26\"\n  },\n  {\n    \"id\": 221,\n    \"pick_header_id\": 17,\n    \"order_summary_id\": 5417,\n    \"order_inventory_id\": 19887,\n    \"inventory_id\": 1,\n    \"location_id\": 1,\n    \"quantity_to_pick\": 1,\n    \"quantity_picked\": 0,\n    \"picked_by\": null,\n    \"created_at\": \"2026-04-30 13:26:05\",\n    \"updated_at\": \"2026-04-30 13:26:05\"\n  },\n  {\n    \"id\": 222,\n    \"pick_header_id\": 17,\n    \"order_summary_id\": 5442,\n    \"order_inventory_id\": 19937,\n    \"inventory_id\": 1,\n    \"location_id\": 1,\n    \"quantity_to_pick\": 1,\n    \"quantity_picked\": 0,\n    \"picked_by\": null,\n    \"created_at\": \"2026-04-30 13:26:05\",\n    \"updated_at\": \"2026-04-30 13:26:05\"\n  }\n]"}],"_postman_id":"0d4b070c-ce5a-464a-8b17-5cc44251783e"},{"name":"Assign User to Pick","id":"40467da0-a4fe-4151-a126-e5d75993f722","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"user_id\": 4\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//assign_user","description":"<p>Assigns a pick to a warehouse user.</p>\n<h3 id=\"body-field\">Body field</h3>\n<ul>\n<li><code>user_id</code> (int, required).</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The pick's status must be <strong>OPEN</strong> (<code>0</code>) or <strong>IDLE</strong> (<code>4</code>).</li>\n<li>The user must exist, must not be a fulfilment-client user, and must not be DC staff.</li>\n<li>Status moves to <strong>INPROGRESS</strong> (<code>3</code>) if assigning from IDLE.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated pick record.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks","","assign_user"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"de745e74-ec15-429e-8b24-ed470bb6965c","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"user_id\": 4\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//assign_user","description":"Assigns a pick to a warehouse user.\n\n### Body field\n- `user_id` (int, required).\n\n### Constraints\n- The pick's status must be **OPEN** (`0`) or **IDLE** (`4`).\n- The user must exist, must not be a fulfilment-client user, and must not be DC staff.\n- Status moves to **INPROGRESS** (`3`) if assigning from IDLE.\n\n### Response\nThe updated pick record.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 16,\n  \"pick_type\": 1,\n  \"pick_option\": 2,\n  \"pick_number\": \"PIC-1777551965-147\",\n  \"created_by\": 4,\n  \"warehouse_id\": 6,\n  \"assigned_to\": 4,\n  \"status\": 4,\n  \"zone_id\": 0,\n  \"is_batch\": 0,\n  \"is_split\": 0,\n  \"ui_pick\": 0,\n  \"force_completed\": 0,\n  \"completed_at\": null,\n  \"created_at\": \"2026-04-30 13:26:05\",\n  \"updated_at\": \"2026-04-30 13:26:14\"\n}"}],"_postman_id":"40467da0-a4fe-4151-a126-e5d75993f722"},{"name":"Link Pick to Pre-Sort Location","id":"3aca773e-0831-4f58-9a8d-7e187bf28535","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"pre_sort_location_id\": 74\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//link_pre_sort_location","description":"<p>Links a completed pick to a pre-sort location, the holding location where a bulk pick is sorted into individual orders. Every order on the pick is linked to the location, and orders in <strong>Picked</strong> (<code>10</code>) status move to <strong>Sorting</strong> (<code>2710</code>).</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users (<code>401</code>).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal pick ID.</li>\n</ul>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>pre_sort_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>ID of a location whose <code>type_id</code> is <code>99</code> (Pre Sort).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The pick must be <strong>COMPLETED</strong> (<code>1</code>).</li>\n<li>A pick can be linked to one pre-sort location at a time; unlink it first to move it.</li>\n<li>When the tenant's picking setting <em>Pre Sort Location Option</em> is <strong>One Pick per Pre Sort Location</strong>, a location already linked to another pick is refused.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p><code>status</code>, <code>message</code> and <code>pick_pre_sort_location_links[]</code>, one entry per order on the pick: <code>id</code>, <code>pre_sort_location_id</code>, <code>pick_header_id</code>, <code>order_summary_id</code>, <code>linked_by</code> (user ID), <code>created_at</code>, <code>updated_at</code>. The same list is returned on <strong>Get Pick Detail</strong> as <code>pre_sort_location_links[]</code>.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Pick not found</td>\n<td><code>404</code> <code>{\"error\": \"Pick Not Found\"}</code></td>\n</tr>\n<tr>\n<td><code>pre_sort_location_id</code> missing</td>\n<td><code>422</code> <code>{\"validation_error\": \"pre_sort_location_id is required.\"}</code></td>\n</tr>\n<tr>\n<td>Location not found, or not a pre-sort location</td>\n<td><code>422</code> <code>{\"validation_error\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>Pick not completed, already linked, or location already taken</td>\n<td><code>422</code> <code>{\"error\": \"...\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks","","link_pre_sort_location"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"ec27b59a-b5db-420d-a93f-eacbed8f7f2f","name":"200 - linked","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"pre_sort_location_id\": 74\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//link_pre_sort_location"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"message\": \"Pick linked to pre sort location successfully.\",\n  \"pick_pre_sort_location_links\": [\n    {\n      \"id\": 42,\n      \"pre_sort_location_id\": 74,\n      \"pick_header_id\": 374,\n      \"order_summary_id\": 178927,\n      \"linked_by\": 12,\n      \"created_at\": \"2026-09-25 09:25:17\",\n      \"updated_at\": \"2026-09-25 09:25:17\"\n    }\n  ]\n}"},{"id":"90e91cb2-7a26-45c2-a306-9ab291e1f214","name":"422 - pick not completed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"pre_sort_location_id\": 74\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//link_pre_sort_location"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Pick is not completed yet.\"\n}"},{"id":"636b9cf6-13c9-4eb0-8e7e-ab79d1d0a889","name":"422 - already linked","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"pre_sort_location_id\": 74\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//link_pre_sort_location"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Pick already linked to pre sort location.\"\n}"},{"id":"e9cdf3e8-7c74-42a3-9504-b987f03be7f9","name":"422 - not a pre-sort location","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"pre_sort_location_id\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks//link_pre_sort_location"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"validation_error\": \"Location is not a pre sort location.\"\n}"},{"id":"ce1ce271-e0ac-4354-8637-cea46c16f86d","name":"404 - pick not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"pre_sort_location_id\": 74\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks/999999/link_pre_sort_location"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Pick Not Found\"\n}"}],"_postman_id":"3aca773e-0831-4f58-9a8d-7e187bf28535"},{"name":"Unlink Pick from Pre-Sort Location","id":"fcdbb8f7-7849-4eef-a04e-4d86fafd9cf8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/picks//unlink_pre_sort_location","description":"<p>Removes the pre-sort location link from a pick. Every order that is still in <strong>Sorting</strong> (<code>2710</code>) because of the link goes back to <strong>Picked</strong> (<code>10</code>); orders that have moved on are left as they are. No request body.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Not available to fulfilment-client users (<code>401</code>).</p>\n<h3 id=\"path-parameter\">Path parameter</h3>\n<ul>\n<li><code></code> - internal pick ID.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p><code>status</code>, <code>message</code> and <code>unlinked_order_count</code>, the number of orders whose link was removed.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Response</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Pick not found</td>\n<td><code>404</code> <code>{\"error\": \"Pick Not Found\"}</code></td>\n</tr>\n<tr>\n<td>Pick is not linked to any pre-sort location</td>\n<td><code>422</code> <code>{\"error\": \"Pick is not linked to any pre sort location.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks","","unlink_pre_sort_location"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"1714895b-ea0e-4dc7-ba82-02383456bf26","name":"200 - unlinked","originalRequest":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/picks//unlink_pre_sort_location"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"message\": \"Pick unlinked from pre sort location successfully.\",\n  \"unlinked_order_count\": 1\n}"},{"id":"d3b84fb1-1cea-404d-97cb-a5dba7c940b9","name":"422 - not linked","originalRequest":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://your-company.myhelm.app/public-api/picks//unlink_pre_sort_location"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Pick is not linked to any pre sort location.\"\n}"}],"_postman_id":"fcdbb8f7-7849-4eef-a04e-4d86fafd9cf8"},{"name":"Delete Pick","id":"fdd9a19f-c1d4-4f91-93ae-bd6456cca473","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/picks//delete","description":"<p>Soft-deletes a pick and unwinds the linked allocations.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The pick's status must NOT be <strong>COMPLETED</strong> (<code>1</code>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;pick_id&gt;, \"message\": \"Pick deleted successfully.\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"b891f327-846a-4230-8f27-137a7b13813d","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/picks//delete","description":"Soft-deletes a pick and unwinds the linked allocations.\n\n### Constraints\n- The pick's status must NOT be **COMPLETED** (`1`).\n\n### Response\n```\n{ \"id\": <pick_id>, \"message\": \"Pick deleted successfully.\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 16,\n  \"message\": \"Pick deleted successfully.\"\n}"}],"_postman_id":"fdd9a19f-c1d4-4f91-93ae-bd6456cca473"},{"name":"Create Picks by Order Status","id":"00c6cd45-b71b-44e4-a288-34b3d9dca8df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_status_id\": 3,\n    \"warehouse_id\": 6,\n    \"single_pick_option\": 2,\n    \"multi_pick_option\": 2,\n    \"order_ids\": [],\n    \"max_order_limit\": 100,\n    \"min_order_limit\": 1,\n    \"failed_order_status_id\": null,\n    \"fulfilment_client_id\": null,\n    \"pass_warehouse_check\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks/create_by_order_status","description":"<p>Bulk-generates picks for every order in a given status. Heavy operation: it selects stock locations for every candidate order, decides whether to create single- or multi-order picks, and applies a status change to any orders that fail to allocate.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_status_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The status to harvest orders from (e.g. <code>3</code> = Despatch Ready). The status must allow pick creation (a status setting) and not be one of the no-pick statuses (Returned, Picking, Picked, Partially Picked, Despatched, On Hold, Partially Returned, etc.).</td>\n</tr>\n<tr>\n<td><code>warehouse_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Warehouse to pick from. Must be a warehouse location (<code>type_id</code> <code>4</code>) and the user must have access (unless <code>pass_warehouse_check = true</code>).</td>\n</tr>\n<tr>\n<td><code>single_pick_option</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Picking option for single-order picks. One of <code>1</code> (Order by Order), <code>2</code> (Bulk and Sort), <code>4</code> (Bulk).</td>\n</tr>\n<tr>\n<td><code>multi_pick_option</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Picking option for multi-order picks. One of <code>1</code> (Order by Order), <code>2</code> (Bulk and Sort), <code>3</code> (Tote), <code>4</code> (Bulk).</td>\n</tr>\n<tr>\n<td><code>order_ids</code></td>\n<td>array of int</td>\n<td>no</td>\n<td>Explicit list of orders to consider; otherwise all orders matching <code>order_status_id</code> are eligible.</td>\n</tr>\n<tr>\n<td><code>max_order_limit</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>100</code>. Capped at <code>100</code>.</td>\n</tr>\n<tr>\n<td><code>min_order_limit</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>failed_order_status_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>If set, orders that fail to allocate are moved to this status.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int | null</td>\n<td>no</td>\n<td><code>null</code> / <code>0</code> selects only non-fulfilment orders; otherwise restrict to one client.</td>\n</tr>\n<tr>\n<td><code>pass_warehouse_check</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>false</code>. DC-staff-only flag to bypass warehouse access checks.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Stock control must be enabled.</li>\n<li><code>order_status_id</code> must allow pick creation.</li>\n<li><code>failed_order_status_id</code>, if set, must NOT be in the no-pick set listed above.</li>\n<li><code>max_order_limit</code> cannot exceed <code>100</code>.</li>\n</ul>\n<h3 id=\"behaviour\">Behaviour</h3>\n<ul>\n<li>Long-running: allow a generous client-side timeout.</li>\n<li>Detects multi-zone allocations and disables incompatible pick options automatically.</li>\n<li>Detects batch-tracked SKUs and disables Bulk-and-Sort for those orders.</li>\n<li><code>BULK</code> (<code>4</code>) auto-converts to <code>BULK_AND_SORT</code> (<code>2</code>) when the pick option is unsupported.</li>\n<li>Orders that fail allocation are moved to <code>failed_order_status_id</code> (if set) and reported in the response.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"status\":  \"success\",\n  \"message\": \"50 order(s) found... 48 pick(s) created. 2 order(s) failed...\",\n  \"result\": {\n    \"created_picks\": [ ...pick objects... ],\n    \"failed_orders_due_to_allocation\": { \"&lt;order_id&gt;\": \"&lt;reason&gt;\" }\n  },\n  \"time_taken\": \"X.X Seconds\"\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["picks","create_by_order_status"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"9264b796-a764-46ca-a4ac-b10b6e024cfe","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"order_status_id\": 3,\n    \"warehouse_id\": 6,\n    \"single_pick_option\": 2,\n    \"multi_pick_option\": 2,\n    \"order_ids\": [],\n    \"max_order_limit\": 100,\n    \"min_order_limit\": 1,\n    \"failed_order_status_id\": null,\n    \"fulfilment_client_id\": null,\n    \"pass_warehouse_check\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/picks/create_by_order_status","description":"Bulk-generates picks for every order in a given status. Heavy operation: it selects stock locations for every candidate order, decides whether to create single- or multi-order picks, and applies a status change to any orders that fail to allocate.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `order_status_id` | int | yes | The status to harvest orders from (e.g. `3` = Despatch Ready). The status must allow pick creation (a status setting) and not be one of the no-pick statuses (Returned, Picking, Picked, Partially Picked, Despatched, On Hold, Partially Returned, etc.). |\n| `warehouse_id` | int | yes | Warehouse to pick from. Must be a warehouse location (`type_id` `4`) and the user must have access (unless `pass_warehouse_check = true`). |\n| `single_pick_option` | int | yes | Picking option for single-order picks. One of `1` (Order by Order), `2` (Bulk and Sort), `4` (Bulk). |\n| `multi_pick_option` | int | yes | Picking option for multi-order picks. One of `1` (Order by Order), `2` (Bulk and Sort), `3` (Tote), `4` (Bulk). |\n| `order_ids` | array of int | no | Explicit list of orders to consider; otherwise all orders matching `order_status_id` are eligible. |\n| `max_order_limit` | int | no | Default `100`. Capped at `100`. |\n| `min_order_limit` | int | no | Default `1`. |\n| `failed_order_status_id` | int | no | If set, orders that fail to allocate are moved to this status. |\n| `fulfilment_client_id` | int \\| null | no | `null` / `0` selects only non-fulfilment orders; otherwise restrict to one client. |\n| `pass_warehouse_check` | bool | no | Default `false`. DC-staff-only flag to bypass warehouse access checks. |\n\n### Constraints\n- Stock control must be enabled.\n- `order_status_id` must allow pick creation.\n- `failed_order_status_id`, if set, must NOT be in the no-pick set listed above.\n- `max_order_limit` cannot exceed `100`.\n\n### Behaviour\n- Long-running: allow a generous client-side timeout.\n- Detects multi-zone allocations and disables incompatible pick options automatically.\n- Detects batch-tracked SKUs and disables Bulk-and-Sort for those orders.\n- `BULK` (`4`) auto-converts to `BULK_AND_SORT` (`2`) when the pick option is unsupported.\n- Orders that fail allocation are moved to `failed_order_status_id` (if set) and reported in the response.\n\n### Response\n```\n{\n  \"status\":  \"success\",\n  \"message\": \"50 order(s) found... 48 pick(s) created. 2 order(s) failed...\",\n  \"result\": {\n    \"created_picks\": [ ...pick objects... ],\n    \"failed_orders_due_to_allocation\": { \"<order_id>\": \"<reason>\" }\n  },\n  \"time_taken\": \"X.X Seconds\"\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"success\",\n  \"message\": \"100 order(s) found for pick creation. 2 pick(s) created. 0 order(s) failed to create due to insufficient stock.\",\n  \"result\": {\n    \"all_order_ids\": [\n      5410,\n      5411,\n      5412,\n      5413,\n      5414\n    ],\n    \"processed_orders\": null,\n    \"failed_orders\": null,\n    \"pick_ids\": null\n  },\n  \"_truncated\": \"all_order_ids truncated to first 5; full list returned in real response\"\n}"}],"_postman_id":"00c6cd45-b71b-44e4-a288-34b3d9dca8df"}],"id":"6159e8e7-bb49-4128-96d6-b8e6b7bcdb0a","description":"<p>Manage warehouse picks — single- or multi-order pick lists generated from despatch-ready orders.</p>\n<h3 id=\"status-reference\"><code>status</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>OPEN</td>\n</tr>\n<tr>\n<td>1</td>\n<td>COMPLETED</td>\n</tr>\n<tr>\n<td>2</td>\n<td>CANCELLED</td>\n</tr>\n<tr>\n<td>3</td>\n<td>INPROGRESS</td>\n</tr>\n<tr>\n<td>4</td>\n<td>IDLE</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"pick_type-reference\"><code>pick_type</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Single (one pick per order)</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Multi (multiple orders in one pick)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"pick_option-reference\"><code>pick_option</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Option</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Order by Order</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Bulk and Sort</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Tote</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Bulk</td>\n</tr>\n</tbody>\n</table>\n</div><p>Pick endpoints are not available to fulfilment-client users.</p>\n","_postman_id":"6159e8e7-bb49-4128-96d6-b8e6b7bcdb0a","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Stock Transfers","item":[{"name":"List Stock Transfers","id":"ff952995-2ee4-4f4c-8e52-cac8cf7223fb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfers?page=1&per_page=20","description":"<p>Returns a paginated list of stock transfers.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>), <code>per_page</code> (default tenant setting).</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[transfer_number]</code></td>\n<td>string</td>\n<td>Partial match on the transfer number.</td>\n</tr>\n<tr>\n<td><code>filters[status]</code></td>\n<td>int or array</td>\n<td>Transfer status (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[source_warehouse]</code></td>\n<td>int or array</td>\n<td>Source warehouse location ID.</td>\n</tr>\n<tr>\n<td><code>filters[destination_warehouse]</code></td>\n<td>int or array</td>\n<td>Destination warehouse location ID.</td>\n</tr>\n<tr>\n<td><code>filters[date_range][from]</code> / <code>filters[date_range][to]</code></td>\n<td>string</td>\n<td>Creation date bounds as <code>YYYY-MM-DD HH:MM:SS</code>; both are required.</td>\n</tr>\n<tr>\n<td><code>filters[created_by]</code></td>\n<td>int</td>\n<td>User who created the transfer.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort-options\">Sort options</h3>\n<p><code>sort</code> = <code>transfer_number_asc</code> / <code>transfer_number_desc</code>, <code>status_asc</code> / <code>status_desc</code>, <code>created_at_asc</code> / <code>created_at_desc</code>. Default: <code>created_at_desc</code>.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item carries <code>transfer_number</code>, <code>status</code> + <code>status_label</code>, <code>source_warehouse</code>, <code>destination_warehouse</code>, <code>items_count</code>, <code>total_quantity</code>, <code>total_shipped</code>, <code>total_received</code>. When there are no transfers, <code>data</code> is <code>null</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfers"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>Partial match on the public-facing transfer number.</p>\n","type":"text/plain"},"key":"filters[transfer_number]","value":""},{"disabled":true,"description":{"content":"<p>Status ID — see folder description.</p>\n","type":"text/plain"},"key":"filters[status][]","value":"0"},{"disabled":true,"description":{"content":"<p>Source warehouse ID.</p>\n","type":"text/plain"},"key":"filters[source_warehouse][]","value":""},{"disabled":true,"description":{"content":"<p>Destination warehouse ID.</p>\n","type":"text/plain"},"key":"filters[destination_warehouse][]","value":""},{"disabled":true,"description":{"content":"<p>Starting date for transfer creation.</p>\n","type":"text/plain"},"key":"filters[date_range][from]","value":""},{"disabled":true,"description":{"content":"<p>Ending date for transfer creation.</p>\n","type":"text/plain"},"key":"filters[date_range][to]","value":""},{"disabled":true,"description":{"content":"<p>User ID who created the transfer.</p>\n","type":"text/plain"},"key":"filters[created_by]","value":""},{"disabled":true,"description":{"content":"<p>One of: <code>transfer_number_asc</code> | <code>transfer_number_desc</code> | <code>status_asc</code> | <code>status_desc</code> | <code>created_at_asc</code> | <code>created_at_desc</code>. Default: <code>created_at_desc</code>.</p>\n","type":"text/plain"},"key":"sort","value":"created_at_desc"}],"variable":[]}},"response":[{"id":"947ad534-3e09-4617-b826-9de0c4be71f2","name":"200 — empty list","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfers"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 0,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 0,\n    \"next_page_url\": \"https://your-company.myhelm.app/public-api/stock_transfers?&page=2\",\n    \"prev_page_url\": null,\n    \"from\": 0,\n    \"to\": 100,\n    \"data\": null\n}"}],"_postman_id":"ff952995-2ee4-4f4c-8e52-cac8cf7223fb"},{"name":"Get Stock Transfer Detail","id":"8c539193-370c-4ea0-879d-be6e14923c7f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer/","description":"<p>Returns a single stock transfer with the full nested <code>items[]</code> array (each item with <code>inventory</code> metadata, plus a <code>locations[]</code> array carrying batch / serial / expiry info per source location).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"9d247da2-db9a-4391-a6d3-ce844c519e18","name":"200 — transfer found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer/","description":"Returns a single stock transfer with the full nested `items[]` array (each item with `inventory` metadata, plus a `locations[]` array carrying batch / serial / expiry info per source location).\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 4,\n  \"transfer_number\": \"ST202604300002\",\n  \"source_warehouse_location_id\": 6,\n  \"destination_warehouse_location_id\": 78,\n  \"status\": 0,\n  \"notes\": \"Postman G8 ST\",\n  \"initiated_by\": 4,\n  \"received_by\": null,\n  \"shipped_at\": null,\n  \"delivered_at\": null,\n  \"cancelled_at\": null,\n  \"is_api\": 1,\n  \"created_at\": \"2026-04-30 13:58:44\",\n  \"updated_at\": \"2026-04-30 13:58:44\",\n  \"status_label\": \"Pending\",\n  \"source_warehouse\": {\n    \"id\": 6,\n    \"type_id\": 4,\n    \"parent_location_id\": null,\n    \"legacy_id\": null,\n    \"location_name\": \"Warehouse\",\n    \"priority\": 0,\n    \"pickable\": 0,\n    \"allow_box_splitting\": 1,\n    \"allow_negative\": 0,\n    \"on_hand_stock\": 0,\n    \"warehouse_id\": null,\n    \"deleted\": 0,\n    \"deleted_at\": null,\n    \"pm_plugin_capacity_type\": 2,\n    \"pm_plugin_capacity_value\": 1,\n    \"pm_plugin_current_capacity\": 0,\n    \"pm_plugin_allow_mixed_products\": 1,\n    \"pm_plugin_not_in_use\": 0,\n    \"pm_plugin_has_mixed_product\": 0,\n    \"created_at\": \"0000-00-00 00:00:00\",\n    \"updated_at\": \"2026-02-25 12:00:20\",\n    \"iso_countries\": \"\",\n    \"barcode\": \"Warehouse\"\n  },\n  \"destination_warehouse\": {\n    \"id\": 78,\n    \"type_id\": 4,\n    \"parent_location_id\": null,\n    \"legacy_id\": null,\n    \"location_name\": \"API Test Warehouse\",\n    \"priority\": 1,\n    \"pickable\": 1,\n    \"allow_box_splitting\": 1,\n    \"allow_negative\": 0,\n    \"on_hand_stock\": 1,\n    \"warehouse_id\": null,\n    \"deleted\": 0,\n    \"deleted_at\": null,\n    \"pm_plugin_capacity_type\": 2,\n    \"pm_plugin_capacity_value\": 1,\n    \"pm_plugin_current_capacity\": 0,\n    \"pm_plugin_allow_mixed_products\": 1,\n    \"pm_plugin_not_in_use\": 0,\n    \"pm_plugin_has_mixed_product\": 0,\n    \"created_at\": \"2026-04-30 11:51:12\",\n    \"updated_at\": \"2026-04-30 11:51:12\",\n    \"iso_countries\": \"\",\n    \"barcode\": \"API-WH\"\n  },\n  \"items\": [\n    {\n      \"id\": 5,\n      \"transfer_id\": 4,\n      \"inventory_id\": 1,\n      \"requested_quantity\": 2,\n      \"shipped_quantity\": 0,\n      \"received_quantity\": 0,\n      \"source_location_id\": null,\n      \"destination_location_id\": null,\n      \"notes\": \"\",\n      \"created_at\": \"2026-04-30 13:58:44\",\n      \"updated_at\": \"2026-04-30 13:58:44\",\n      \"inventory\": {\n        \"id\": 1,\n        \"legacy_id\": null,\n        \"type\": 1,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0,\n        \"service_id\": null,\n        \"dropshipping_type\": 0,\n        \"sync_stock\": 0,\n        \"include_component_stock_level\": 0,\n        \"fulfilment_client_id\": null,\n        \"sku\": \"ha_product_test_1\",\n        \"secondary_sku\": null,\n        \"sku_hash\": \"0472c3fc59ce8a84bc09c5e40693c764\",\n        \"vendor_sku\": null,\n        \"chapi_id\": \"1bf51964-790b-4ca4-b054-36a6f4580c66\",\n        \"stock_level\": 10129,\n        \"stock_level_open\": 415,\n        \"stock_level_global_available\": 9714,\n        \"stock_level_available\": 9723,\n        \"stock_warn_level\": 0,\n        \"item_barcode\": \"1234567898765\",\n        \"item_barcode_2\": null,\n        \"item_barcode_3\": null,\n        \"item_barcode_4\": null,\n        \"item_barcode_5\": null,\n        \"thumbnail_url\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"single_parcel_per_item\": 0,\n        \"name\": \"HA Product Test - 1\",\n        \"product_weight\": \"1.000\",\n        \"product_height\": \"1.0\",\n        \"product_width\": \"1.0\",\n        \"product_length\": \"1.0\",\n        \"product_box_type\": 1,\n        \"product_box_quantity\": 1,\n        \"picking_by_packaging\": 0,\n        \"default_packaging_id\": 0,\n        \"description\": null,\n        \"country_of_origin\": \"GB\",\n        \"hs_code\": \"HSTest1\",\n        \"customs_description\": null,\n        \"unit_price\": \"1.0000\",\n        \"cost_price\": null,\n        \"shipping_service_id\": 0,\n        \"zone\": \"\",\n        \"multiplier\": 1,\n        \"include_po_stock\": 0,\n        \"custom_fields\": null,\n        \"dynamic_components_type\": 0,\n        \"is_archived\": 0,\n        \"archived_sync_stock\": null,\n        \"temp_image_url\": null,\n        \"ghost_asset\": 0,\n        \"master_dropshipping\": 0,\n        \"include_po_level\": 0,\n        \"fabric_content\": null,\n        \"low_stock_email_sent_time\": 0,\n        \"vat_rate_percentage\": \"20.0000\",\n        \"stock_update_scheduled_at\": \"2026-03-18 11:22:02\",\n        \"created_at\": \"2026-02-25 12:17:19\",\n        \"updated_at\": \"2026-04-30 13:59:09\",\n        \"dont_sync_until\": null,\n        \"assembly_notes\": null,\n        \"customs_value\": null,\n        \"image\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\"\n      },\n      \"locations\": [\n        {\n          \"id\": 5,\n          \"transfer_item_id\": 5,\n          \"source_location_id\": 1,\n          \"batch_number\": \"\",\n          \"serial_number\": \"\",\n          \"expire_date\": null,\n          \"quantity\": 2,\n          \"shipped_quantity\": 0,\n          \"received_quantity\": 0,\n          \"notes\": \"\",\n          \"created_at\": \"2026-04-30 13:58:44\",\n          \"updated_at\": \"2026-04-30 13:58:44\",\n          \"location_name\": \"Default\",\n          \"location_map\": null\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"8c539193-370c-4ea0-879d-be6e14923c7f"},{"name":"Create Stock Transfer","id":"4c12befa-85cf-409e-b3f6-84ee7c876308","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"source_warehouse_location_id\": 6,\n    \"destination_warehouse_location_id\": 7,\n    \"notes\": \"Restock branch warehouse\",\n    \"items\": [\n        {\n            \"id\": 1,\n            \"notes\": \"\",\n            \"locations\": [\n                {\n                    \"location_id\": 1,\n                    \"quantity\": 50,\n                    \"batch_number\": \"\",\n                    \"serial_number\": \"\",\n                    \"expire_date\": \"\",\n                    \"notes\": \"\"\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfers/create","description":"<p>Creates a new stock transfer in <strong>Pending</strong> status. Stock isn't deducted yet — that happens at <strong>Ship Stock Transfer</strong>.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>source_warehouse_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Source warehouse. User must have access.</td>\n</tr>\n<tr>\n<td><code>destination_warehouse_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Destination warehouse. Must differ from source. User must have access.</td>\n</tr>\n<tr>\n<td><code>notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Free-text notes.</td>\n</tr>\n<tr>\n<td><code>items[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least one item.</td>\n</tr>\n<tr>\n<td><code>items[].id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Inventory ID. Cannot be a Group SKU or a dynamic-component SKU.</td>\n</tr>\n<tr>\n<td><code>items[].notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Per-item note.</td>\n</tr>\n<tr>\n<td><code>items[].locations[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least one source location per item.</td>\n</tr>\n<tr>\n<td><code>items[].locations[].location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Source location inside the source warehouse.</td>\n</tr>\n<tr>\n<td><code>items[].locations[].quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Must be <code>&gt; 0</code> and within the available stock at that location.</td>\n</tr>\n<tr>\n<td><code>items[].locations[].batch_number</code></td>\n<td>string</td>\n<td>conditional</td>\n<td>Required when the SKU is batch-tracked.</td>\n</tr>\n<tr>\n<td><code>items[].locations[].serial_number</code></td>\n<td>string</td>\n<td>no</td>\n<td>For serial-tracked SKUs.</td>\n</tr>\n<tr>\n<td><code>items[].locations[].expire_date</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>YYYY-MM-DD</code>.</td>\n</tr>\n<tr>\n<td><code>items[].locations[].notes</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"success\": true, \"transfer_id\": &lt;int&gt;, \"transfer_number\": \"&lt;string&gt;\", \"message\": \"...\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfers","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"cde7935f-94f7-4774-891e-15cc4fa860d7","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"source_warehouse_location_id\": 6,\n    \"destination_warehouse_location_id\": 7,\n    \"notes\": \"Restock branch warehouse\",\n    \"items\": [\n        {\n            \"id\": 1,\n            \"notes\": \"\",\n            \"locations\": [\n                {\n                    \"location_id\": 1,\n                    \"quantity\": 50,\n                    \"batch_number\": \"\",\n                    \"serial_number\": \"\",\n                    \"expire_date\": \"\",\n                    \"notes\": \"\"\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfers/create","description":"Creates a new stock transfer in **Pending** status. Stock isn't deducted yet — that happens at **Ship Stock Transfer**.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `source_warehouse_location_id` | int | yes | Source warehouse. User must have access. |\n| `destination_warehouse_location_id` | int | yes | Destination warehouse. Must differ from source. User must have access. |\n| `notes` | string | no | Free-text notes. |\n| `items[]` | array | yes | At least one item. |\n| `items[].id` | int | yes | Inventory ID. Cannot be a Group SKU or a dynamic-component SKU. |\n| `items[].notes` | string | no | Per-item note. |\n| `items[].locations[]` | array | yes | At least one source location per item. |\n| `items[].locations[].location_id` | int | yes | Source location inside the source warehouse. |\n| `items[].locations[].quantity` | int | yes | Must be `> 0` and within the available stock at that location. |\n| `items[].locations[].batch_number` | string | conditional | Required when the SKU is batch-tracked. |\n| `items[].locations[].serial_number` | string | no | For serial-tracked SKUs. |\n| `items[].locations[].expire_date` | string | no | `YYYY-MM-DD`. |\n| `items[].locations[].notes` | string | no | |\n\n### Response\n```\n{ \"success\": true, \"transfer_id\": <int>, \"transfer_number\": \"<string>\", \"message\": \"...\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"transfer_id\": 1,\n  \"transfer_number\": \"ST202604300001\",\n  \"message\": \"Transfer created successfully.\"\n}"}],"_postman_id":"4c12befa-85cf-409e-b3f6-84ee7c876308"},{"name":"Update Stock Transfer","id":"8660eef9-ffbb-4539-86d4-f9d48955c35a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"destination_warehouse_location_id\": 7,\n    \"notes\": \"Updated notes\",\n    \"items\": [\n        {\n            \"inventory_id\": 1,    // REQUIRED — the inventory's ID\n            \"locations\": [\n                { \"location_id\": 1, \"quantity\": 75 }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfer//update","description":"<p>Updates a transfer's destination, notes or items. Only <strong>Pending</strong> (<code>0</code>) transfers can be updated.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>All optional; same shape as <strong>Create Stock Transfer</strong> (without <code>source_warehouse_location_id</code>). Sending <code>items[]</code> replaces the entire item list.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"success\": true, \"message\": \"...\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"a8ed358f-5ff0-4517-be55-eedb46af98bd","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"destination_warehouse_location_id\": 7,\n    \"notes\": \"Updated notes\",\n    \"items\": [\n        {\n            \"id\": 1,\n            \"locations\": [\n                { \"location_id\": 1, \"quantity\": 75 }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfer//update","description":"Updates a transfer's destination, notes or items. Only **Pending** (`0`) transfers can be updated.\n\n### Body fields\nAll optional; same shape as **Create Stock Transfer** (without `source_warehouse_location_id`). Sending `items[]` replaces the entire item list.\n\n### Response\n```\n{ \"success\": true, \"message\": \"...\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"message\": \"Transfer updated successfully.\"\n}"}],"_postman_id":"8660eef9-ffbb-4539-86d4-f9d48955c35a"},{"name":"Ship Stock Transfer","id":"6d96c978-a286-4d00-b203-9e02f0044442","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer//ship","description":"<p>Transitions a transfer from <strong>Pending</strong> to <strong>Shipped</strong>, deducting stock from the source locations.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Status must be <strong>Pending</strong> (<code>0</code>).</li>\n<li>All items must have available stock at their declared source locations.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"success\": true, \"message\": \"...\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer","","ship"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"47bc1342-de23-44a1-a09b-e95f763148f0","name":"Success","originalRequest":{"method":"POST","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer//ship","description":"Transitions a transfer from **Pending** to **Shipped**, deducting stock from the source locations.\n\n### Constraints\n- Status must be **Pending** (`0`).\n- All items must have available stock at their declared source locations.\n\n### Response\n```\n{ \"success\": true, \"message\": \"...\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"message\": \"Transfer shipped successfully.\"\n}"}],"_postman_id":"6d96c978-a286-4d00-b203-9e02f0044442"},{"name":"Receive Stock Transfer","id":"e825cbbf-f04a-41aa-b624-7e4691246950","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"item_transfer_source_location_id\": 100,\n            \"destination_location_id\": 5,\n            \"receive_quantity\": 50,\n            \"notes\": \"Received in good condition\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfer//receive","description":"<p>Records receipt of items at the destination warehouse. The transfer auto-completes once every shipped item is received.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items[]</code></td>\n<td>array</td>\n<td>yes</td>\n<td>At least one receive entry.</td>\n</tr>\n<tr>\n<td><code>items[].item_transfer_source_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>The source-location row ID inside the transfer (from the detail endpoint).</td>\n</tr>\n<tr>\n<td><code>items[].destination_location_id</code></td>\n<td>int</td>\n<td>yes</td>\n<td>A location inside the destination warehouse, or the destination warehouse itself.</td>\n</tr>\n<tr>\n<td><code>items[].receive_quantity</code></td>\n<td>int</td>\n<td>yes</td>\n<td>Must not exceed the remaining shipped quantity.</td>\n</tr>\n<tr>\n<td><code>items[].notes</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>The transfer must be in status <strong>Shipped</strong> (<code>1</code>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"success\": true,\n  \"message\": \"...\",\n  \"result\": {\n    \"success\": true,\n    \"locations_received\": &lt;int&gt;,\n    \"transfer_completed\": &lt;bool&gt;,\n    \"errors\": []\n  }\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer","","receive"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"08b1d092-56c2-4c9e-955a-041957d127a4","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"item_transfer_source_location_id\": 100,\n            \"destination_location_id\": 5,\n            \"receive_quantity\": 50,\n            \"notes\": \"Received in good condition\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfer//receive","description":"Records receipt of items at the destination warehouse. The transfer auto-completes once every shipped item is received.\n\n### Body fields\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `items[]` | array | yes | At least one receive entry. |\n| `items[].item_transfer_source_location_id` | int | yes | The source-location row ID inside the transfer (from the detail endpoint). |\n| `items[].destination_location_id` | int | yes | A location inside the destination warehouse, or the destination warehouse itself. |\n| `items[].receive_quantity` | int | yes | Must not exceed the remaining shipped quantity. |\n| `items[].notes` | string | no | |\n\n### Constraints\n- The transfer must be in status **Shipped** (`1`).\n\n### Response\n```\n{\n  \"success\": true,\n  \"message\": \"...\",\n  \"result\": {\n    \"success\": true,\n    \"locations_received\": <int>,\n    \"transfer_completed\": <bool>,\n    \"errors\": []\n  }\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"message\": \"Items received successfully.\",\n  \"result\": {\n    \"success\": true,\n    \"locations_received\": 1,\n    \"transfer_completed\": true,\n    \"errors\": []\n  }\n}"}],"_postman_id":"e825cbbf-f04a-41aa-b624-7e4691246950"},{"name":"Cancel Stock Transfer","id":"7d01b664-51bb-4835-9aa0-ba9585bec1d1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"Source warehouse out of stock after planning\",\n    \"force_delete\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfer//cancel","description":"<p>Cancels a transfer. If the transfer was already shipped, stock is returned to the source.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<ul>\n<li><code>reason</code> (string, optional).</li>\n<li><code>force_delete</code> (bool, optional, default <code>false</code>) — if <code>true</code>, removes the cancelled transfer record afterwards.</li>\n</ul>\n<h3 id=\"constraints\">Constraints</h3>\n<ul>\n<li>Status must be <strong>Pending</strong> (<code>0</code>), <strong>Shipped</strong> (<code>1</code>), or <strong>Cancelled</strong> (<code>4</code>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"success\": true, \"message\": \"...\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer","","cancel"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"976723ce-017c-495a-80de-bbd98d8a241c","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"Source warehouse out of stock after planning\",\n    \"force_delete\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/stock_transfer//cancel","description":"Cancels a transfer. If the transfer was already shipped, stock is returned to the source.\n\n### Body fields\n- `reason` (string, optional).\n- `force_delete` (bool, optional, default `false`) — if `true`, removes the cancelled transfer record afterwards.\n\n### Constraints\n- Status must be **Pending** (`0`), **Shipped** (`1`), or **Cancelled** (`4`).\n\n### Response\n```\n{ \"success\": true, \"message\": \"...\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"message\": \"Transfer cancelled successfully.\"\n}"}],"_postman_id":"7d01b664-51bb-4835-9aa0-ba9585bec1d1"},{"name":"Delete Stock Transfer","id":"d285e49d-8d79-4daf-9f39-d5c7ffefe1c2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer//delete","description":"<p>Hard-delete shortcut — internally calls <strong>Cancel Stock Transfer</strong> with <code>force_delete = true</code>.</p>\n<h3 id=\"constraints\">Constraints</h3>\n<p>Same as <strong>Cancel Stock Transfer</strong>.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"success\": true, \"message\": \"...\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"4c8688aa-505e-4beb-a9df-280099e02b9a","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer//delete","description":"Hard-delete shortcut — internally calls **Cancel Stock Transfer** with `force_delete = true`.\n\n### Constraints\nSame as **Cancel Stock Transfer**.\n\n### Response\n```\n{ \"success\": true, \"message\": \"...\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"message\": \"Transfer deleted successfully.\"\n}"}],"_postman_id":"d285e49d-8d79-4daf-9f39-d5c7ffefe1c2"},{"name":"Get Stock Transfer Logs","id":"d630541b-c319-4075-9831-1e62103a9ed4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer//logs","description":"<p>Returns audit logs for a single transfer (creation, ship, receive, cancel events).</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"success\": true,\n  \"data\": [\n    { \"action\": \"...\", \"description\": \"...\", \"user_id\": &lt;int&gt;, \"metadata\": { ... }, \"created_at\": \"...\" }\n  ]\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfer","","logs"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"d0ffa5d0-5362-4c24-9bf6-b1812e6b8582","name":"200 — transfer logs","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfer//logs","description":"Returns audit logs for a single transfer (creation, ship, receive, cancel events).\n\n### Response\n```\n{\n  \"success\": true,\n  \"data\": [\n    { \"action\": \"...\", \"description\": \"...\", \"user_id\": <int>, \"metadata\": { ... }, \"created_at\": \"...\" }\n  ]\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 22,\n      \"transfer_id\": 4,\n      \"action\": \"created\",\n      \"description\": \"Transfer created from Warehouse to API Test Warehouse\",\n      \"user_id\": 4,\n      \"metadata\": {\n        \"transfer_number\": \"ST202604300002\",\n        \"source_warehouse\": \"Warehouse\",\n        \"destination_warehouse\": \"API Test Warehouse\",\n        \"notes\": \"Postman G8 ST\"\n      },\n      \"created_at\": \"2026-04-30 13:58:44\"\n    }\n  ]\n}"}],"_postman_id":"d630541b-c319-4075-9831-1e62103a9ed4"},{"name":"Search Inventory for Transfer","id":"55878840-9415-43eb-84f2-0fcd633b8ec3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfers/inventory/search?source_warehouse_id=6&search=widget&limit=50","description":"<p>Lookup helper for the transfer-creation UI — searches inventory available in a source warehouse by SKU / name / barcode.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"success\": true,\n  \"result\": {\n    \"inventory\": [\n      { \"id\": &lt;int&gt;, \"sku\": \"...\", \"name\": \"...\", \"image\": \"...\", \"stock_levels\": { ... },\n        \"fulfilment_client_id\": &lt;int|null&gt;, \"batching_type\": &lt;int&gt;, \"is_serial_numbered\": &lt;0|1&gt; }\n    ]\n  }\n}\n</code></pre><p>Results are sorted by available stock descending.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfers","inventory","search"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>Required. Warehouse to search stock in.</p>\n","type":"text/plain"},"key":"source_warehouse_id","value":"6"},{"description":{"content":"<p>Required. Partial match on SKU, name, or barcode.</p>\n","type":"text/plain"},"key":"search","value":"widget"},{"description":{"content":"<p>Result cap. Default <code>50</code>, max <code>200</code>.</p>\n","type":"text/plain"},"key":"limit","value":"50"}],"variable":[]}},"response":[{"id":"23700635-897a-410c-b84d-8560a5e81194","name":"200 — search results","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/stock_transfers/inventory/search?source_warehouse_id=6&search=widget&limit=50","host":["https://your-company.myhelm.app/public-api"],"path":["stock_transfers","inventory","search"],"query":[{"key":"source_warehouse_id","value":"6","description":"Required. Warehouse to search stock in."},{"key":"search","value":"widget","description":"Required. Partial match on SKU, name, or barcode."},{"key":"limit","value":"50","description":"Result cap. Default `50`, max `200`."}]},"description":"Lookup helper for the transfer-creation UI — searches inventory available in a source warehouse by SKU / name / barcode.\n\n### Response\n```\n{\n  \"success\": true,\n  \"result\": {\n    \"inventory\": [\n      { \"id\": <int>, \"sku\": \"...\", \"name\": \"...\", \"image\": \"...\", \"stock_levels\": { ... },\n        \"fulfilment_client_id\": <int|null>, \"batching_type\": <int>, \"is_serial_numbered\": <0|1> }\n    ]\n  }\n}\n```\n\nResults are sorted by available stock descending.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"result\": {\n    \"inventory\": [\n      {\n        \"id\": 1,\n        \"sku\": \"ha_product_test_1\",\n        \"name\": \"HA Product Test - 1\",\n        \"image\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"stock_levels\": {\n          \"stock_level\": \"10125\",\n          \"stock_level_available\": \"9719\",\n          \"stock_level_global_available\": 9710,\n          \"assembly_stock_level\": 0,\n          \"stock_level_open\": 415\n        },\n        \"fulfilment_client_id\": null,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0\n      },\n      {\n        \"id\": 2,\n        \"sku\": \"ha_product_test_2\",\n        \"name\": \"HA Product Test - 2\",\n        \"image\": \"https://your-company.myhelm.app/storage/defaults/no-image.png\",\n        \"stock_levels\": {\n          \"stock_level\": \"9935\",\n          \"stock_level_available\": \"9123\",\n          \"stock_level_global_available\": 9111,\n          \"assembly_stock_level\": 0,\n          \"stock_level_open\": 824\n        },\n        \"fulfilment_client_id\": null,\n        \"batching_type\": 0,\n        \"is_serial_numbered\": 0\n      }\n    ]\n  }\n}"}],"_postman_id":"55878840-9415-43eb-84f2-0fcd633b8ec3"},{"name":"Get Inventory Locations for Transfer","id":"a337d198-a8dd-4ed7-bdb4-6e29df34e933","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfers/inventory//locations?warehouse_id=6","description":"<p>Lookup helper for the transfer-creation UI — returns all locations in a warehouse where a SKU has stock, with batch/serial/expiry info per row.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"success\": true,\n  \"result\": {\n    \"inventory\": { \"id\": &lt;int&gt;, \"sku\": \"...\", \"name\": \"...\", \"is_batch_numbered\": &lt;0|1&gt;, \"batching_type\": &lt;int&gt; },\n    \"locations\": [\n      { \"location_id\": &lt;int&gt;, \"location_name\": \"...\", \"location_map\": \"...\",\n        \"stock_level\": &lt;int&gt;, \"stock_level_available\": &lt;int&gt;, \"priority\": &lt;int&gt;,\n        \"batch_number\": \"...\", \"serial_number\": \"...\", \"expire_date\": \"...\",\n        \"batch_display\": \"...\", \"is_batch_numbered\": &lt;0|1&gt;,\n        \"selected_quantity\": &lt;int&gt;, \"selected_notes\": \"...\" }   // last two only when transfer_id is supplied\n    ]\n  }\n}\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfers","inventory","","locations"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"description":{"content":"<p>Required. The warehouse whose locations to list.</p>\n","type":"text/plain"},"key":"warehouse_id","value":"6"},{"disabled":true,"description":{"content":"<p>Optional. If editing an existing transfer, returns previously-selected quantities and notes.</p>\n","type":"text/plain"},"key":"transfer_id","value":""}],"variable":[]}},"response":[{"id":"3ee4845c-a131-4c81-82e3-e9b154585b44","name":"200 — locations with stock","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://your-company.myhelm.app/public-api/stock_transfers/inventory//locations?warehouse_id=6","host":["https://your-company.myhelm.app/public-api"],"path":["stock_transfers","inventory","","locations"],"query":[{"key":"warehouse_id","value":"6","description":"Required. The warehouse whose locations to list."},{"key":"transfer_id","value":"","description":"Optional. If editing an existing transfer, returns previously-selected quantities and notes.","disabled":true}]},"description":"Lookup helper for the transfer-creation UI — returns all locations in a warehouse where a SKU has stock, with batch/serial/expiry info per row.\n\n### Response\n```\n{\n  \"success\": true,\n  \"result\": {\n    \"inventory\": { \"id\": <int>, \"sku\": \"...\", \"name\": \"...\", \"is_batch_numbered\": <0|1>, \"batching_type\": <int> },\n    \"locations\": [\n      { \"location_id\": <int>, \"location_name\": \"...\", \"location_map\": \"...\",\n        \"stock_level\": <int>, \"stock_level_available\": <int>, \"priority\": <int>,\n        \"batch_number\": \"...\", \"serial_number\": \"...\", \"expire_date\": \"...\",\n        \"batch_display\": \"...\", \"is_batch_numbered\": <0|1>,\n        \"selected_quantity\": <int>, \"selected_notes\": \"...\" }   // last two only when transfer_id is supplied\n    ]\n  }\n}\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"result\": {\n    \"inventory\": {\n      \"id\": 1,\n      \"sku\": \"ha_product_test_1\",\n      \"name\": \"HA Product Test - 1\",\n      \"is_batch_numbered\": false,\n      \"batching_type\": 0\n    },\n    \"locations\": [\n      {\n        \"location_id\": 1,\n        \"location_name\": \"Default\",\n        \"location_map\": \"Default\",\n        \"stock_level\": 9915,\n        \"stock_level_available\": 9542,\n        \"priority\": 1000,\n        \"is_batch_numbered\": false\n      },\n      {\n        \"location_id\": 13,\n        \"location_name\": \"4437931967\",\n        \"location_map\": \"Default > 4437931967\",\n        \"stock_level\": 10,\n        \"stock_level_available\": 10,\n        \"priority\": 1003,\n        \"is_batch_numbered\": false\n      },\n      {\n        \"location_id\": 3,\n        \"location_name\": \"Picked\",\n        \"location_map\": \"Picked\",\n        \"stock_level\": 79,\n        \"stock_level_available\": 46,\n        \"priority\": 1004,\n        \"is_batch_numbered\": false\n      },\n      {\n        \"location_id\": 24,\n        \"location_name\": \"9362914743\",\n        \"location_map\": \"Default > 9362914743\",\n        \"stock_level\": 112,\n        \"stock_level_available\": 112,\n        \"priority\": 1005,\n        \"is_batch_numbered\": false\n      },\n      {\n        \"location_id\": 19,\n        \"location_name\": \"7758833472\",\n        \"location_map\": \"Default > 7758833472\",\n        \"stock_level\": 1,\n        \"stock_level_available\": 1,\n        \"priority\": 1007,\n        \"is_batch_numbered\": false\n      },\n      {\n        \"location_id\": 56,\n        \"location_name\": \"new-splittest\",\n        \"location_map\": \"Warehouse > Row Location > Shelf Location 1 > Rack Location 1 > new-splittest\",\n        \"stock_level\": 7,\n        \"stock_level_available\": 7,\n        \"priority\": 1010,\n        \"is_batch_numbered\": false\n      },\n      {\n        \"location_id\": 2,\n        \"location_name\": \"Returns\",\n        \"location_map\": \"Returns\",\n        \"stock_level\": 1,\n        \"stock_level_available\": 1,\n        \"priority\": 1011,\n        \"is_batch_numbered\": false\n      }\n    ]\n  }\n}"}],"_postman_id":"a337d198-a8dd-4ed7-bdb4-6e29df34e933"},{"name":"List Transfer Warehouses","id":"925d162f-2955-4340-8c8b-1f636f08838a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfers/warehouses","description":"<p>Returns the warehouses available to use as source / destination of a transfer (basically every active warehouse location (<code>type_id</code> <code>4</code>)).</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"success\": true, \"data\": [ { ...location records... } ] }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["stock_transfers","warehouses"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"e19f6036-9a5b-4b19-a8da-6b388d933c8f","name":"200 — list of warehouses","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/stock_transfers/warehouses"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"data\": [\n        {\n            \"id\": 6,\n            \"type_id\": 4,\n            \"location_name\": \"Warehouse\",\n            \"priority\": 0,\n            \"pickable\": 0,\n            \"warehouse_id\": null,\n            \"barcode\": \"Warehouse\"\n        }\n    ]\n}"}],"_postman_id":"925d162f-2955-4340-8c8b-1f636f08838a"}],"id":"5f03ecb1-e912-47f3-8536-36219e06709d","description":"<p>Move stock between warehouses. A stock transfer captures <em>what</em> (inventory + qty + source location), <em>from where</em> (source warehouse), <em>to where</em> (destination warehouse), then walks through Pending → Shipped → Delivered (or Cancelled) states.</p>\n<h3 id=\"stock-transfer-status-reference\">Stock-transfer status reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Pending</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Shipped</td>\n</tr>\n<tr>\n<td>2</td>\n<td>In Transit</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Delivered</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Cancelled</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Partially Received</td>\n</tr>\n</tbody>\n</table>\n</div><p>The success-shape for endpoints in this folder differs from the rest of the API — they return <code>{ success: true, ... }</code> rather than the bare object.</p>\n","_postman_id":"5f03ecb1-e912-47f3-8536-36219e06709d","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Users","item":[{"name":"List Users","id":"f93d00e0-db15-466d-ae4b-86b10f5d35bb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/users?page=1","description":"<p>Returns a paginated list of users (excluding DC staff).</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Admin level only; not available to fulfilment-client users.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match; use `</td>\n</tr>\n<tr>\n<td><code>filters[tfa_active]</code></td>\n<td>int or array</td>\n<td><code>1</code> users with two-factor authentication enabled, <code>0</code> without.</td>\n</tr>\n<tr>\n<td><code>filters[staff_level]</code></td>\n<td>int or array</td>\n<td>Staff level (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[fulfilment_client_id]</code></td>\n<td>int or array</td>\n<td>Users linked to these fulfilment clients.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Sorted newest first; there is no <code>sort</code> parameter.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a <code>user</code> record with sensitive fields stripped. <code>last_login</code> is a unix timestamp.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["users"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Free-text search. Pair with <code>filters[search_field]</code>.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>One of: <code>auto</code> | <code>name</code> | <code>email</code>.</p>\n","type":"text/plain"},"key":"filters[search_field]","value":"auto"},{"disabled":true,"description":{"content":"<p><code>0</code> or <code>1</code>.</p>\n","type":"text/plain"},"key":"filters[tfa_active][]","value":"1"},{"disabled":true,"description":{"content":"<p>Staff level. See folder description.</p>\n","type":"text/plain"},"key":"filters[staff_level][]","value":""},{"disabled":true,"description":{"content":"<p>Fulfilment client ID.</p>\n","type":"text/plain"},"key":"filters[fulfilment_client_id][]","value":""}],"variable":[]}},"response":[{"id":"c474b651-bc32-4eb7-b5ff-4708c376f6d9","name":"200 — page of users","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/users"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 2,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"data\": [\n        {\n            \"id\": 4,\n            \"email\": \"hidayet.arasan@thedespatchcompany.com\",\n            \"tfa_active\": 0,\n            \"name\": \"Hidayet Arasan\",\n            \"last_login\": 1777542159,\n            \"staff_level\": 5,\n            \"api_access\": 1,\n            \"is_support_pin_active\": 0,\n            \"is_barcode_login_active\": 0,\n            \"barcode_number\": \"\",\n            \"is_rfid_login_active\": 0,\n            \"rfid_number\": \"\",\n            \"is_ip_whitelist_active\": 0,\n            \"ip_whitelist\": \"\",\n            \"fulfilment_client_id\": null\n        }\n    ]\n}"}],"_postman_id":"f93d00e0-db15-466d-ae4b-86b10f5d35bb"},{"name":"Get User Detail","id":"0a55d4c5-49db-4817-8cf8-dc568a665f7c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/users/","description":"<p>Returns a single non-DC-staff user with their warehouse-location IDs.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Admin level only; not available to fulfilment-client users.</p>\n<h3 id=\"response\">Response</h3>\n<p>The <code>user</code> record (sensitive fields stripped) plus a <code>locations</code> array of warehouse-location IDs the user is linked to.</p>\n<p>Returns <code>404</code> if the user doesn't exist or is DC staff.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["users",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"82682fdb-54c5-4e00-a020-99738f563deb","name":"200 — user found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/users/","description":"Returns a single non-DC-staff user with their warehouse-location IDs.\n\n### Response\nThe `user` record (sensitive fields stripped) plus a `locations` array of warehouse-location IDs the user is linked to.\n\nReturns `404` if the user doesn't exist or is DC staff.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 9,\n  \"email\": \"g8user@example.com\",\n  \"tfa_active\": 0,\n  \"name\": \"Postman G8 User\",\n  \"last_login\": 1777553925,\n  \"staff_level\": 1,\n  \"api_access\": 0,\n  \"is_support_pin_active\": 0,\n  \"is_barcode_login_active\": 0,\n  \"barcode_number\": null,\n  \"is_rfid_login_active\": 0,\n  \"rfid_number\": null,\n  \"is_ip_whitelist_active\": 0,\n  \"ip_whitelist\": null,\n  \"fulfilment_client_id\": null,\n  \"created_at\": \"2026-04-30 13:58:45\",\n  \"updated_at\": \"2026-04-30 13:58:45\",\n  \"locations\": [\n    6\n  ]\n}"}],"_postman_id":"0a55d4c5-49db-4817-8cf8-dc568a665f7c"},{"name":"Create User","id":"a70697af-6ee7-4eb5-af81-a89fa6032ba0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":     \"Jane Picker\",            // REQUIRED\n    \"email\":    \"jane@example.com\",        // REQUIRED — valid email, unique across users\n    \"password\": \"Rv7#kLp2mQ9z\",            // REQUIRED — see the password rules above\n    \"staff_level\":           1,            // 1=Packer, 2=Picker & Packer, 3=Warehouse Operative, 4=Supervisor, 5=Administrator (default 1)\n    \"fulfilment_client_id\":  null,         // scopes user to a fulfilment client when set\n\n    // ----- Login / security toggles (all bool, default 0) -----\n    \"is_support_pin_active\":  0,\n    \"is_barcode_login_active\":0,\n    \"barcode_number\":         null,        // alphanumeric only when set\n    \"is_rfid_login_active\":   0,\n    \"rfid_number\":            null,        // alphanumeric only when set\n    \"is_ip_whitelist_active\": 0,\n    \"ip_whitelist\":           null,        // comma-separated IP list when whitelist enabled\n    \"tfa_active\":             0,\n    \"api_access\":             0,           // 1 = may log in to the API; only with staff_level 4 or 5\n\n    // ----- Warehouse access -----\n    \"locations\": [1, 2]                    // array of warehouse-location IDs the user can access\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/users/create","description":"<p>Creates a new internal user.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Admin level only; not available to fulfilment-client users.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Login email. Must be a valid email and unique across users.</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>yes</td>\n<td>At least 12 characters (maximum 200), including at least 3 of: a lowercase letter, an uppercase letter, a number, a symbol. A passphrase of 16 characters or more needs no symbols. Rejected with <code>422</code>: common or previously breached passwords, words such as <code>password</code> or <code>qwerty</code>, repeated, sequential or keyboard patterns (for example <code>12345678</code> or <code>qwertyuiop</code>), and passwords containing the user's name, email address or the company name. Send it as a JSON string.</td>\n</tr>\n<tr>\n<td><code>staff_level</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code> (Packer). One of <code>1</code> to <code>5</code>, see the folder description.</td>\n</tr>\n<tr>\n<td><code>fulfilment_client_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>If set, scopes the user to that client.</td>\n</tr>\n<tr>\n<td><code>is_support_pin_active</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>is_barcode_login_active</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. Requires <code>barcode_number</code>.</td>\n</tr>\n<tr>\n<td><code>barcode_number</code></td>\n<td>string</td>\n<td>conditional</td>\n<td>Alphanumeric only.</td>\n</tr>\n<tr>\n<td><code>is_rfid_login_active</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. Requires <code>rfid_number</code>.</td>\n</tr>\n<tr>\n<td><code>rfid_number</code></td>\n<td>string</td>\n<td>conditional</td>\n<td>Alphanumeric only.</td>\n</tr>\n<tr>\n<td><code>is_ip_whitelist_active</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>ip_whitelist</code></td>\n<td>string</td>\n<td>conditional</td>\n<td>Comma-separated IP list when whitelisting is enabled.</td>\n</tr>\n<tr>\n<td><code>tfa_active</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>api_access</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. <code>1</code> lets the user log in to this API. Only accepted with <code>staff_level</code> <code>3</code>, <code>4</code> or <code>5</code>; <code>1</code> with a lower level is rejected with <code>422</code> (<code>API access can only be given to Administrator (5), Supervisor (4) or Warehouse Operative (3) users.</code>). A Warehouse Operative can only use the assembly endpoints, see <em>API access</em> in the introduction. A user without a <code>fulfilment_client_id</code> and with API access can reach every record on the account.</td>\n</tr>\n<tr>\n<td><code>locations</code></td>\n<td>array of int</td>\n<td>no</td>\n<td>Warehouse-location IDs to link.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>The created user with sensitive fields stripped. Includes <code>locations</code> (the array of linked location IDs).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["users","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"2fb679c1-b736-4957-98f1-23877ea19d08","name":"200 — created","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"name\":\"API Test User\",\"email\":\"apiuser@example.com\",\"password\":\"strongpass123\",\"staff_level\":1,\"is_support_pin_active\":0,\"is_barcode_login_active\":0,\"is_rfid_login_active\":0,\"is_ip_whitelist_active\":0,\"tfa_active\":0,\"locations\":[1]}"},"url":"https://your-company.myhelm.app/public-api/users/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 6,\n    \"email\": \"apiuser@example.com\",\n    \"tfa_active\": 0,\n    \"name\": \"API Test User\",\n    \"last_login\": 1777546278,\n    \"staff_level\": 1,\n    \"api_access\": 0,\n    \"is_support_pin_active\": 0,\n    \"is_barcode_login_active\": 0,\n    \"barcode_number\": null,\n    \"is_rfid_login_active\": 0,\n    \"rfid_number\": null,\n    \"is_ip_whitelist_active\": 0,\n    \"ip_whitelist\": null,\n    \"fulfilment_client_id\": null,\n    \"created_at\": \"2026-04-30 11:51:18\",\n    \"updated_at\": \"2026-04-30 11:51:18\",\n    \"locations\": [1]\n}"},{"id":"ce32a93c-5b4d-44b7-ad35-ac6803bc5eee","name":"422 - API access on a level below Supervisor","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"name\": \"Jane Picker\",\n    \"email\": \"jane@example.com\",\n    \"password\": \"Password123!\",\n    \"staff_level\": 1\n}"},"url":"https://your-company.myhelm.app/public-api/users/create"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"API access can only be given to Administrator (5) or Supervisor (4) users.\"\n}"}],"_postman_id":"a70697af-6ee7-4eb5-af81-a89fa6032ba0"},{"name":"Update User","id":"c5e9247c-bc68-4a35-b56b-ae71309c2393","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Jane Picker\",\n    \"email\": \"jane@example.com\",\n    \"password\": \"Tq4!wZr8Hn2c\",           // OPTIONAL — omit to keep the current password; same rules as Create User\n    \"staff_level\": 2,\n    \"fulfilment_client_id\": null,\n    \"is_support_pin_active\": 0,\n    \"is_barcode_login_active\": 0,\n    \"barcode_number\": null,\n    \"is_rfid_login_active\": 0,\n    \"rfid_number\": null,\n    \"is_ip_whitelist_active\": 0,\n    \"ip_whitelist\": null,\n    \"tfa_active\": 0,\n    \"api_access\": 0,                      // OPTIONAL - omit to keep the current API access\n    \"locations\": [1]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/users//update","description":"<p>Updates an existing user. This is a partial update: only the fields present in the request body are changed, and every field you leave out keeps its stored value.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Admin level only; not available to fulfilment-client users.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>Any field from <strong>Create User</strong>. None is required on update, but a field you do send is validated the same way as on create (for example <code>email</code> must be valid and not used by another user, and <code>name</code>, <code>email</code> and <code>staff_level</code> cannot be sent empty).</p>\n<ul>\n<li><code>password</code>: leave it out, or send an empty string, to keep the user's current password. A password you do send must meet the rules in <strong>Create User</strong>, otherwise the call returns <code>422</code> and nothing is changed.</li>\n<li><code>api_access</code>: leave it out to keep the user's current API access. Send <code>0</code> to withdraw it, which also stops any token already issued to that user. Setting <code>staff_level</code> below <code>3</code> always withdraws it, whether or not <code>api_access</code> is sent.</li>\n<li><code>locations</code>: when sent, the array completely replaces the user's warehouse-location links (send <code>[]</code> to remove them all). Leave it out to keep the current links.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated user with sensitive fields stripped, including <code>locations</code> (the linked location IDs).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["users","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"8383c913-1024-4be6-9883-4f66721e2888","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Jane Picker\",\n    \"email\": \"jane@example.com\",\n    \"password\": \"new-strong-password-456\",\n    \"staff_level\": 2,\n    \"fulfilment_client_id\": null,\n    \"is_support_pin_active\": 0,\n    \"is_barcode_login_active\": 0,\n    \"barcode_number\": null,\n    \"is_rfid_login_active\": 0,\n    \"rfid_number\": null,\n    \"is_ip_whitelist_active\": 0,\n    \"ip_whitelist\": null,\n    \"tfa_active\": 0,\n    \"locations\": [1]\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/users//update","description":"Updates an existing user. The full set of fields (including `password`) is **always** required — this endpoint is not a partial update.\n\nThe `locations[]` array completely replaces the user's existing location links (every prior link is removed first).\n\n### Body fields\nSame set as **Create User** — all required.\n\n### Response\nThe updated user with stripped fields.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 8,\n  \"email\": \"postman-g7-user2-updated@example.com\",\n  \"tfa_active\": 0,\n  \"name\": \"Postman G7 User2 Updated\",\n  \"last_login\": 1777552035,\n  \"staff_level\": 2,\n  \"api_access\": 0,\n  \"is_support_pin_active\": 0,\n  \"is_barcode_login_active\": 0,\n  \"barcode_number\": null,\n  \"is_rfid_login_active\": 0,\n  \"rfid_number\": null,\n  \"is_ip_whitelist_active\": 0,\n  \"ip_whitelist\": null,\n  \"fulfilment_client_id\": null,\n  \"created_at\": \"2026-04-30 13:27:15\",\n  \"updated_at\": \"2026-04-30 13:27:15\",\n  \"locations\": [\n    6\n  ]\n}"},{"id":"d4b7b8a7-d83a-4292-96c5-9d6654293b1b","name":"422 — password rejected","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Jane Picker\",\n    \"email\": \"jane@example.com\",\n    \"password\": \"12345678\",\n    \"staff_level\": 2\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/users//update","description":"Updates an existing user. The full set of fields (including `password`) is **always** required — this endpoint is not a partial update.\n\nThe `locations[]` array completely replaces the user's existing location links (every prior link is removed first).\n\n### Body fields\nSame set as **Create User** — all required.\n\n### Response\nThe updated user with stripped fields.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"validation_error\": \"Your password must be at least 12 characters long. Your password must contain at least 3 of the following: a lowercase letter, an uppercase letter, a number, a symbol (or use a passphrase of 16 characters or more). Your password must not be a repeated, sequential or keyboard pattern (for example \\\"12345678\\\", \\\"aaaaaaaaaaaa\\\" or \\\"qwertyuiop\\\"). Your password is on a list of commonly used or previously breached passwords. Please choose something less predictable.\"\n}"}],"_postman_id":"c5e9247c-bc68-4a35-b56b-ae71309c2393"},{"name":"Delete User","id":"a61645f8-b8d7-4409-bc42-735b0c75d58a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/users//delete","description":"<p>Soft-deletes a user. The email address is replaced with a placeholder so it can be re-used for a new account; warehouse-location links are removed.</p>\n<h3 id=\"permissions\">Permissions</h3>\n<p>Admin level only; not available to fulfilment-client users.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;user_id&gt;, \"message\": \"User deleted successfully.\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["users","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"9499b400-e749-41c4-afe1-c1174f09d2d8","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/users//delete","description":"Soft-deletes a user. The email address is replaced with a placeholder so it can be re-used for a new account; warehouse-location links are removed.\n\n### Response\n```\n{ \"id\": <user_id>, \"message\": \"User deleted successfully.\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 8,\n  \"message\": \"User deleted successfully.\"\n}"}],"_postman_id":"a61645f8-b8d7-4409-bc42-735b0c75d58a"}],"id":"763b697e-4c87-4c66-97c8-bf853246c343","description":"<p>Manage internal users (warehouse staff, supervisors, admins). All endpoints in this folder require <strong>Admin</strong> permission level and are not available to fulfilment-client users.</p>\n<h3 id=\"staff_level-reference\"><code>staff_level</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Level</th>\n<th>Role</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Packer</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Picker &amp; Packer</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Warehouse Operative</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Supervisor</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Administrator</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"api_access\"><code>api_access</code></h3>\n<p>Every user record carries <code>api_access</code> (<code>1</code> or <code>0</code>): whether the user may log in to this API. It can only be <code>1</code> for Warehouse Operative (<code>3</code>), Supervisor (<code>4</code>) and Administrator (<code>5</code>) users. See <em>API access</em> in the introduction for what such a user can reach.</p>\n<p>DC-staff users (internal The Despatch Company staff) are excluded from every list / detail response — they cannot be managed via the public API. The <code>tfa_secret</code>, <code>google_secret</code>, <code>ip</code>, <code>user_agent</code>, and <code>dc_staff</code> fields are stripped from every response.</p>\n","_postman_id":"763b697e-4c87-4c66-97c8-bf853246c343","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"Fulfilment Clients","item":[{"name":"List Fulfilment Clients","id":"cba73c59-eefd-4e83-8c89-ca5c57ac6e99","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/fulfilment_clients?page=1","description":"<p>Returns a paginated list of fulfilment clients.</p>\n<h3 id=\"pagination\">Pagination</h3>\n<p><code>page</code> (default <code>1</code>). Page size from tenant settings.</p>\n<h3 id=\"filters\">Filters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Filter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filters[search]</code></td>\n<td>string</td>\n<td>Partial match; use `</td>\n</tr>\n<tr>\n<td><code>filters[billing_api_enabled]</code></td>\n<td>int or array</td>\n<td><code>1</code> / <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>filters[billing_api_billing_option]</code></td>\n<td>int or array</td>\n<td>Billing option (see folder description).</td>\n</tr>\n<tr>\n<td><code>filters[time_based_picking]</code></td>\n<td>int or array</td>\n<td><code>1</code> / <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>filters[status]</code></td>\n<td>int or array</td>\n<td>Client status (see folder description).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sort\">Sort</h3>\n<p>Fixed: <code>created_at</code> descending.</p>\n<h3 id=\"response\">Response</h3>\n<p>List envelope. Each <code>data[]</code> item is a <code>fulfilment_client</code> with <code>status_name</code> resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["fulfilment_clients"],"host":["https://your-company.myhelm.app/public-api"],"query":[{"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Free-text search. Pair with <code>filters[search_field]</code>. Single pipe <code>|</code> between terms.</p>\n","type":"text/plain"},"key":"filters[search]","value":""},{"disabled":true,"description":{"content":"<p>One of: <code>auto</code> | <code>name</code> | <code>contact_email</code> | <code>billing_email</code>.</p>\n","type":"text/plain"},"key":"filters[search_field]","value":"auto"},{"disabled":true,"description":{"content":"<p>Status — see folder description.</p>\n","type":"text/plain"},"key":"filters[status][]","value":"1"},{"disabled":true,"description":{"content":"<p><code>0</code> or <code>1</code>.</p>\n","type":"text/plain"},"key":"filters[billing_api_enabled][]","value":"1"},{"disabled":true,"description":{"content":"<p>Billing option ID — see folder description.</p>\n","type":"text/plain"},"key":"filters[billing_api_billing_option][]","value":""},{"disabled":true,"description":{"content":"<p><code>0</code> or <code>1</code>.</p>\n","type":"text/plain"},"key":"filters[time_based_picking][]","value":""}],"variable":[]}},"response":[{"id":"c04066c7-8a26-4c40-b851-0a5143e7c2a7","name":"200 — fulfilment clients","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/fulfilment_clients"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"total\": 1,\n    \"per_page\": \"100\",\n    \"current_page\": 1,\n    \"last_page\": 1,\n    \"data\": [\n        {\n            \"id\": 1,\n            \"name\": \"Example Client\",\n            \"address_id\": 0,\n            \"contact_email\": \"client@example.com\",\n            \"billing_email\": \"billing@example.com\",\n            \"phone\": \"555-555-5555\",\n            \"notes\": \"\",\n            \"status\": 1,\n            \"billing_api_enabled\": 1,\n            \"billing_api_billing_option\": 1,\n            \"time_based_picking\": 1,\n            \"low_stock_email\": 1,\n            \"rhnd_charge\": \"0.00\",\n            \"accounts_id\": \"123\",\n            \"status_name\": \"Active\"\n        }\n    ]\n}"}],"_postman_id":"cba73c59-eefd-4e83-8c89-ca5c57ac6e99"},{"name":"Get Fulfilment Client Detail","id":"79ab7f31-5b96-4d0c-b079-93144591e0a0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/fulfilment_clients/","description":"<p>Returns a single fulfilment client with its address record and any assigned warehouse locations.</p>\n<h3 id=\"response\">Response</h3>\n<p>The <code>fulfilment_client</code> record plus:</p>\n<ul>\n<li><code>address</code> — the linked address record (or <code>null</code>).</li>\n<li><code>assigned_warehouses[]</code> — array of warehouse <code>location</code> records the client is linked to.</li>\n<li><code>status_name</code> — resolved status label.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["fulfilment_clients",""],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"67877a10-6eff-436a-a96f-2531fd62ae9c","name":"200 — fulfilment client found","originalRequest":{"method":"GET","header":[],"url":"https://your-company.myhelm.app/public-api/fulfilment_clients/","description":"Returns a single fulfilment client with its address record and any assigned warehouse locations.\n\n### Response\nThe `fulfilment_client` record plus:\n- `address` — the linked address record (or `null`).\n- `assigned_warehouses[]` — array of warehouse `location` records the client is linked to.\n- `status_name` — resolved status label.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1,\n  \"name\": \"Hidayet Client\",\n  \"address_id\": 0,\n  \"contact_email\": \"fulltime.hidayetarasan@gmail.com\",\n  \"billing_email\": \"fulltime.hidayetarasan@gmail.com\",\n  \"phone\": \"55544433223\",\n  \"notes\": \"\",\n  \"status\": 1,\n  \"billing_api_enabled\": 1,\n  \"billing_api_billing_option\": 1,\n  \"time_based_picking\": 1,\n  \"client_logo\": \"\",\n  \"accounts_id\": \"123+deleted+69aea04ccb7a0\",\n  \"custom_printing_template\": null,\n  \"low_stock_email\": 1,\n  \"rhnd_charge\": \"0.00\",\n  \"customer_comments_popup\": 0,\n  \"created_at\": \"2026-03-05 19:26:40\",\n  \"updated_at\": \"2026-03-09 10:26:20\",\n  \"default_supplier_id\": null,\n  \"purchase_order_template\": null,\n  \"status_name\": \"Active\",\n  \"address\": null,\n  \"assigned_warehouses\": [\n    {\n      \"id\": 6,\n      \"type_id\": 4,\n      \"parent_location_id\": null,\n      \"legacy_id\": null,\n      \"location_name\": \"Warehouse\",\n      \"priority\": 0,\n      \"pickable\": 0,\n      \"allow_box_splitting\": 1,\n      \"allow_negative\": 0,\n      \"on_hand_stock\": 0,\n      \"warehouse_id\": null,\n      \"deleted\": 0,\n      \"deleted_at\": null,\n      \"pm_plugin_capacity_type\": 2,\n      \"pm_plugin_capacity_value\": 1,\n      \"pm_plugin_current_capacity\": 0,\n      \"pm_plugin_allow_mixed_products\": 1,\n      \"pm_plugin_not_in_use\": 0,\n      \"pm_plugin_has_mixed_product\": 0,\n      \"created_at\": \"0000-00-00 00:00:00\",\n      \"updated_at\": \"2026-02-25 12:00:20\",\n      \"iso_countries\": \"\",\n      \"barcode\": \"Warehouse\"\n    }\n  ]\n}"}],"_postman_id":"79ab7f31-5b96-4d0c-b079-93144591e0a0"},{"name":"Create Fulfilment Client","id":"295aa33f-8bbb-47c3-ae3e-3713fb1a3a22","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\":           \"Acme Fulfilment Inc.\",       // REQUIRED\n    \"address_id\":     null,                          // optional, existing address record\n    \"contact_email\":  \"client@example.com\",          // REQUIRED, must be a valid email\n    \"billing_email\":  \"billing@example.com\",         // REQUIRED, must be a valid email\n    \"phone\":          \"+44 1234 567890\",             // REQUIRED\n    \"accounts_id\":    \"ACME-001\",                    // REQUIRED, must be unique across clients\n\n    // ----- Operational flags -----\n    \"low_stock_email\":            1,                 // 0 or 1; default 1\n    \"rhnd_charge\":                0.00,              // numeric; default 0\n    \"billing_api_enabled\":        1,                 // 0 or 1; default 1\n    \"billing_api_billing_option\": 1,                 // 1=Per SKU per Location, 2=Per Location, 3, 4 — see folder description\n    \"time_based_picking\":         1,                 // 0 or 1; default 1\n    \"advanced_stock_information\": 0,                 // 0 or 1; default 0 - read-only stock location view for the client\n\n    \"notes\":                   \"\",\n    \"purchase_order_template\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/fulfilment_clients/create","description":"<p>Creates a fulfilment client.</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>contact_email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Must be a valid email.</td>\n</tr>\n<tr>\n<td><code>billing_email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Must be a valid email.</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>yes</td>\n<td></td>\n</tr>\n<tr>\n<td><code>accounts_id</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Unique accounts reference (cannot collide with another client).</td>\n</tr>\n<tr>\n<td><code>address_id</code></td>\n<td>int</td>\n<td>no</td>\n<td>Existing address record to link.</td>\n</tr>\n<tr>\n<td><code>low_stock_email</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>1</code>. Must be <code>0</code> or <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>rhnd_charge</code></td>\n<td>number</td>\n<td>no</td>\n<td>Default <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>billing_api_enabled</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>billing_api_billing_option</code></td>\n<td>int</td>\n<td>no</td>\n<td>Default <code>1</code>. Must be <code>1</code>, <code>2</code>, <code>3</code>, or <code>4</code>.</td>\n</tr>\n<tr>\n<td><code>time_based_picking</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>advanced_stock_information</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Default <code>0</code>. Must be <code>0</code> or <code>1</code>. When <code>1</code>, the client's users can view stock locations, batches and expiry dates per location (read only). Has no extra effect while the account-wide setting that lets every fulfilment client view stock locations is switched on.</td>\n</tr>\n<tr>\n<td><code>notes</code></td>\n<td>string</td>\n<td>no</td>\n<td>Default empty string.</td>\n</tr>\n<tr>\n<td><code>purchase_order_template</code></td>\n<td>string</td>\n<td>no</td>\n<td>PO template identifier.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>The created <code>fulfilment_client</code> record with <code>status_name</code> resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["fulfilment_clients","create"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"a420b3ab-f69f-48b3-90f1-4a41c657ce79","name":"200 — created","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\"name\":\"API Test FC\",\"contact_email\":\"fc@example.com\",\"billing_email\":\"fc-billing@example.com\",\"phone\":\"+44 1234 567890\",\"accounts_id\":\"FC-API-001\",\"low_stock_email\":1,\"rhnd_charge\":0,\"billing_api_enabled\":1,\"billing_api_billing_option\":1,\"time_based_picking\":1,\"notes\":\"API test\"}"},"url":"https://your-company.myhelm.app/public-api/fulfilment_clients/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 2,\n    \"name\": \"API Test FC\",\n    \"address_id\": 0,\n    \"contact_email\": \"fc@example.com\",\n    \"billing_email\": \"fc-billing@example.com\",\n    \"phone\": \"+44 1234 567890\",\n    \"notes\": \"API test\",\n    \"status\": 1,\n    \"billing_api_enabled\": 1,\n    \"billing_api_billing_option\": 1,\n    \"time_based_picking\": 1,\n    \"client_logo\": null,\n    \"accounts_id\": \"FC-API-001\",\n    \"custom_printing_template\": null,\n    \"low_stock_email\": 1,\n    \"rhnd_charge\": \"0.00\",\n    \"customer_comments_popup\": 0,\n    \"created_at\": \"2026-04-30 10:51:17\",\n    \"updated_at\": \"2026-04-30 10:51:17\",\n    \"default_supplier_id\": null,\n    \"purchase_order_template\": null,\n    \"status_name\": \"Active\",\n    \"address\": null\n}"}],"_postman_id":"295aa33f-8bbb-47c3-ae3e-3713fb1a3a22"},{"name":"Update Fulfilment Client","id":"2cd95a4b-14bb-4f3a-a63e-18e0129dc446","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Acme Fulfilment Inc.\",\n    \"address_id\": null,\n    \"contact_email\": \"newclient@example.com\",\n    \"billing_email\": \"newbilling@example.com\",\n    \"phone\": \"+44 1234 999999\",\n    \"accounts_id\": \"ACME-001\",\n    \"status\": 1,\n\n    \"low_stock_email\": 1,\n    \"rhnd_charge\": 0.00,\n    \"billing_api_enabled\": 1,\n    \"billing_api_billing_option\": 1,\n    \"time_based_picking\": 1,\n    \"advanced_stock_information\": 0,\n\n    \"notes\": \"Updated notes\",\n    \"purchase_order_template\": null,\n    \"default_supplier_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/fulfilment_clients//update","description":"<p>Updates a fulfilment client. Omitted fields keep their current values (each optional field defaults to the existing record's value).</p>\n<h3 id=\"body-fields\">Body fields</h3>\n<p>Same set as <strong>Create Fulfilment Client</strong>, plus:</p>\n<ul>\n<li><code>status</code> (int, optional) — see folder description.</li>\n<li><code>default_supplier_id</code> (int | null, optional) — sets the default supplier contact for new POs. Must be a Supplier (<code>contact_type = 2</code>).</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<p>The updated client record with address resolved and <code>status_name</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["fulfilment_clients","","update"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"97d5b395-4444-4ef3-b1e4-30bc0a9f27ce","name":"Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Acme Fulfilment Inc.\",\n    \"address_id\": null,\n    \"contact_email\": \"newclient@example.com\",\n    \"billing_email\": \"newbilling@example.com\",\n    \"phone\": \"+44 1234 999999\",\n    \"accounts_id\": \"ACME-001\",\n    \"status\": 1,\n\n    \"low_stock_email\": 1,\n    \"rhnd_charge\": 0.00,\n    \"billing_api_enabled\": 1,\n    \"billing_api_billing_option\": 1,\n    \"time_based_picking\": 1,\n\n    \"notes\": \"Updated notes\",\n    \"purchase_order_template\": null,\n    \"default_supplier_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://your-company.myhelm.app/public-api/fulfilment_clients//update","description":"Updates a fulfilment client. Omitted fields keep their current values (each optional field defaults to the existing record's value).\n\n### Body fields\nSame set as **Create Fulfilment Client**, plus:\n- `status` (int, optional) — see folder description.\n- `default_supplier_id` (int \\| null, optional) — sets the default supplier contact for new POs. Must be a Supplier (`contact_type = 2`).\n\n### Response\nThe updated client record with address resolved and `status_name`.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3,\n  \"name\": \"Postman G7 FC Updated\",\n  \"address_id\": 0,\n  \"contact_email\": \"g7fc-updated@example.com\",\n  \"billing_email\": \"g7fc-billing-updated@example.com\",\n  \"phone\": \"+44 1234 999999\",\n  \"notes\": \"Updated by Postman G7\",\n  \"status\": 1,\n  \"billing_api_enabled\": 1,\n  \"billing_api_billing_option\": 1,\n  \"time_based_picking\": 1,\n  \"client_logo\": null,\n  \"accounts_id\": \"POSTMAN-G7-FC-001\",\n  \"custom_printing_template\": null,\n  \"low_stock_email\": 1,\n  \"rhnd_charge\": \"0.00\",\n  \"customer_comments_popup\": 0,\n  \"created_at\": \"2026-04-30 12:27:25\",\n  \"updated_at\": \"2026-04-30 12:27:26\",\n  \"default_supplier_id\": null,\n  \"purchase_order_template\": null,\n  \"status_name\": \"Active\",\n  \"address\": null\n}"}],"_postman_id":"2cd95a4b-14bb-4f3a-a63e-18e0129dc446"},{"name":"Delete Fulfilment Client","id":"9fd954f6-9e5a-42a0-b5a8-327291bd33f1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/fulfilment_clients//delete","description":"<p>Soft-deletes a fulfilment client.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \"id\": &lt;client_id&gt;, \"message\": \"Fulfilment Client deleted successfully.\" }\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"path":["fulfilment_clients","","delete"],"host":["https://your-company.myhelm.app/public-api"],"query":[],"variable":[]}},"response":[{"id":"588a9aac-0fde-497a-8747-54aeba9425cb","name":"Success","originalRequest":{"method":"DELETE","header":[],"url":"https://your-company.myhelm.app/public-api/fulfilment_clients//delete","description":"Soft-deletes a fulfilment client.\n\n### Response\n```\n{ \"id\": <client_id>, \"message\": \"Fulfilment Client deleted successfully.\" }\n```\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 3,\n  \"message\": \"Fulfilment Client deleted successfully.\"\n}"}],"_postman_id":"9fd954f6-9e5a-42a0-b5a8-327291bd33f1"}],"id":"e6b027d7-f5c0-419f-b71f-00290b3cadd3","description":"<p>Manage fulfilment clients — the tenant-of-the-tenant model used in 3PL setups, where each client gets isolated visibility into their own SKUs / orders / contacts.</p>\n<p>All endpoints in this folder require an <strong>owner / back-office</strong> user — fulfilment-client users themselves cannot manage other clients.</p>\n<h3 id=\"status-reference\"><code>status</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Active</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Pending</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Archived</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"billing_api_billing_option-reference\"><code>billing_api_billing_option</code> reference</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ID</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Per SKU per Location</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Per Location</td>\n</tr>\n<tr>\n<td>3</td>\n<td>(advanced — see your contract)</td>\n</tr>\n<tr>\n<td>4</td>\n<td>(advanced — see your contract)</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"e6b027d7-f5c0-419f-b71f-00290b3cadd3","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}},{"name":"App Integrations","item":[{"name":"User Token Exchange","id":"151a7465-b44e-4af6-b8fc-c13b90a43400","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"session_uuid\": \"GENERATED_SESSION_ID\",\n    \"jwt_token\": \"JWT_TOKEN_VALUE\",\n    \"auth_token\": \"AUTH_TOKEN\",\n    \"access_token\": \"ACCESS_TOKEN_VALUE\",\n    \"timestamp\": 1732100000\n}","options":{"raw":{"language":"json"}}},"url":"{{your_apps_get-user-token_hook_url}}","description":"<h1 id=\"app-launch--token-exchange-workflow\"><strong>App Launch &amp; Token Exchange Workflow</strong></h1>\n<p>When a partner application is installed through <strong>3.6</strong>, an <strong>access token</strong> is exchanged during the installation flow. This token will later be included in all user-initiated app launches.</p>\n<p>Whenever a user opens the application inside <strong>3.6</strong>, the system triggers a <strong>Get User Token Hook</strong> and then loads the partner app inside an iframe. The iframe launch URL will contain both the <strong>session token</strong> and the <strong>partner-generated access token</strong>.</p>\n<hr />\n<h2 id=\"get-user-token-hook\"><strong>Get User Token Hook</strong></h2>\n<p>Every time a user opens the app, <strong>3.6</strong> sends a <code>GET-USER-TOKEN</code> webhook request to your endpoint.</p>\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>session_uuid</strong></td>\n<td>A session token generated by 3.6 for each app launch. This value appears both in the webhook request and in the iframe launch URL.</td>\n</tr>\n<tr>\n<td><strong>jwt_token</strong></td>\n<td>A JWT token for the launching user. Your app can use this token to interact with the <strong>public API</strong> on behalf of the user.</td>\n</tr>\n<tr>\n<td><strong>auth_token</strong></td>\n<td>3.6's API token for authorization</td>\n</tr>\n<tr>\n<td><strong>access_token</strong></td>\n<td>The partner-specific access token that was exchanged during the installation process. Use it to identify the account/installation.</td>\n</tr>\n<tr>\n<td><strong>timestamp</strong></td>\n<td>Unix timestamp indicating when the session was created.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"app-launch-iframe-loading\"><strong>App Launch (Iframe Loading)</strong></h2>\n<p>After the <code>get-user-token</code> hook is sent, the app is loaded into an iframe.</p>\n<p>The launch URL includes:</p>\n<ul>\n<li><p><code>session_uuid</code> (generated for this launch)</p>\n</li>\n<li><p><code>access_token</code> (your original partner access token)</p>\n</li>\n</ul>\n<p>Example (simplified):</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://yourapp.com/launch?session_uuid={session_uuid}&amp;access_token={access_token}\n\n</code></pre><p>You can use the <code>session_uuid</code> to correlate the hook with the iframe session.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}},"urlObject":{"host":["{{your_apps_get-user-token_hook_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"151a7465-b44e-4af6-b8fc-c13b90a43400"}],"id":"b6d840f3-8644-41d3-b4be-a6a233ac05d9","description":"<p>Reference for partner applications embedded in Helm: how an app is launched inside the dashboard and the request Helm sends to your endpoint each time a user opens it. The request in this folder documents a call Helm makes <strong>to you</strong>, not an endpoint you call; use the tokens it delivers to call the rest of this API on the user's behalf.</p>\n","_postman_id":"b6d840f3-8644-41d3-b4be-a6a233ac05d9","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"473f3ed8-7306-464c-98bb-48b8b39c0469","id":"473f3ed8-7306-464c-98bb-48b8b39c0469","name":"Helm 3.6","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]}},"event":[{"listen":"prerequest","script":{"id":"09c6177e-7164-48f3-9377-d8859959179d","type":"text/javascript","requests":{},"exec":[""]}},{"listen":"test","script":{"id":"29c0b509-d7a3-47d6-85da-b04f60402b2d","type":"text/javascript","requests":{},"exec":[""]}}],"variable":[{"key":"base_url","value":"https://your-company.myhelm.app/public-api","description":"Base URL of your Helm tenant's Public API. Replace 'your-company' with your subdomain. Do not include a trailing slash."},{"key":"auth_token","value":"","description":"JWT access token. Auto-populated by the Auth → Login request when you run it; you can also paste a token here manually."},{"key":"order_id","value":"","description":"Numeric ID of an order_summary record."},{"key":"inventory_id","value":"","description":"Numeric ID of an inventory record."},{"key":"contact_id","value":"","description":"Numeric ID of a contact (customer or supplier)."},{"key":"location_id","value":"","description":"Numeric ID of a warehouse location."},{"key":"purchase_order_id","value":"","description":"Numeric ID of a purchase order."},{"key":"purchase_order_delivery_id","value":"","description":"Numeric ID of a purchase order delivery (goods-in record)."},{"key":"shipment_id","value":"","description":"Numeric ID of a shipment (label) record."},{"key":"pick_id","value":"","description":"Numeric ID of a pick header record."},{"key":"stock_transfer_id","value":"","description":"Numeric ID of a stock transfer record."},{"key":"user_id","value":"","description":"Numeric ID of an internal user (warehouse staff / admin)."},{"key":"category_id","value":"","description":"Numeric ID of an inventory category."},{"key":"scrapping_reason_id","value":"","description":"Numeric ID of an inventory scrapping reason."},{"key":"fulfilment_client_id","value":"","description":"Numeric ID of a fulfilment client."},{"key":"tag_id","value":"","description":"Numeric ID of an order_tag or purchase_order_tag record."},{"key":"manufacturer_id","value":"","description":"Numeric ID of an inventory manufacturer."},{"key":"app_access_token","value":"","description":"Access token of an installed App Store app. Only for App Store apps adding order logs."}]}