{"info":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","description":"<html><head></head><body><h3 id=\"🚀-sodtrack-integration-api\">🚀 <strong>Sodtrack Integration API</strong></h3>\n<p>Welcome to the <strong>Sodtrack Integration API Documentation</strong> — your comprehensive guide to integrating seamlessly with Sodtrack’s Service Management ecosystem.</p>\n<p>The Sodtrack API enables organizations to connect their systems directly with Sodtrack’s operational platform, facilitating real-time automation of service bookings, project management, lead generation, and contractor coordination.</p>\n<p>Designed for scalability, security, and efficiency, this API provides the foundation for integrating Sodtrack’s core functionalities — including scheduling, catalog synchronization, coverage validation, and transactional workflows — into your existing business processes or digital channels.</p>\n<h4 id=\"key-capabilities\"><strong>Key Capabilities</strong></h4>\n<ul>\n<li><p><strong>Authentication and Security:</strong> Token-based access using JWT for secure API communication.</p>\n</li>\n<li><p><strong>Service Catalog:</strong> Retrieve and manage categories, services, and variants available in the Sodtrack ecosystem.</p>\n</li>\n<li><p><strong>Coverage and Availability:</strong> Validate geographical coverage and check contractor or time-slot availability in real time.</p>\n</li>\n<li><p><strong>Bookings:</strong> Create, update, and manage service bookings directly from your systems.</p>\n</li>\n<li><p><strong>Projects and Transactions:</strong> Link multiple bookings under project stages, attach documentation, register payments, and synchronize task updates.</p>\n</li>\n<li><p><strong>Lead Management:</strong> Integrate Sodtrack lead forms and dynamically capture customer interest data.</p>\n</li>\n</ul>\n<h4 id=\"environment-overview\"><strong>Environment Overview</strong></h4>\n<p>Examples of enviromnents; the actual Base URL to be used will be shared by the integration team.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Environment</th>\n<th>Base URL</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Development (dev)</strong></td>\n<td><code>https://dev.integration.{country}.sodtrack-shared.sodtrack.com</code></td>\n<td>Sandbox environment for testing and development.</td>\n</tr>\n<tr>\n<td><strong>UAT (uat)</strong></td>\n<td><code>https://uat.integration.{country}.sodtrack-shared.sodtrack.com</code></td>\n<td>User Acceptance Testing environment for pre-production validation.</td>\n</tr>\n<tr>\n<td><strong>Production (prod)</strong></td>\n<td><code>https://integration.{country}.sodtrack-shared.sodtrack.com</code></td>\n<td>Live production environment. All requests here affect real data.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"support-and-assistance\"><strong>Support and Assistance</strong></h4>\n<p>If you require support during your integration, our technical team is available to assist with API setup, authentication, and best practices.</p>\n<p>📩 <strong>Contact:</strong> <a href=\"https://null\">integrations@sodtrack.com</a></p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"30960189","collectionId":"cc318f6e-0b51-4254-be86-c090e307212f","publishedId":"2sAY4uEPfU","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"01A797"},"publishDate":"2025-02-18T18:51:22.000Z"},"item":[{"name":"🔐 Authentication","item":[{"name":"Get token","event":[{"listen":"test","script":{"id":"cb5be779-9350-4eaf-96e7-ab1ed7b6f9d3","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"563fe841-dee2-4aec-b1df-0569e1359291","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"x-api-key","value":"","description":"<p>string</p>\n<p>API Key provided by Sodtrack. This key identifies and authenticates your integration.</p>\n","type":"text"},{"key":"origin","value":"","description":"<p>string</p>\n<p>The origin domain or identifier associated with your Sodtrack API access (e.g., dev.api.cl.sodtrack.sodtrack.com).</p>\n","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/authentication/generateJWT","description":"<p>Generates a JSON Web Token (JWT) that must be included in the header of all subsequent API requests to access protected resources.</p>\n<p>Each token is issued using the <strong>API Key</strong> and <strong>Origin</strong> assigned to your organization. Tokens are time-limited and must be regenerated upon expiration.</p>\n<h3 id=\"usage\"><strong>Usage</strong></h3>\n<p>Once generated, include the JWT in the <code>Authorization</code> header for all API calls:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer {token}\n\n</code></pre><hr />\n<h3 id=\"security-recommendations\"><strong>Security Recommendations</strong></h3>\n<ul>\n<li><p>🔒 Treat your <strong>API Key</strong> and <strong>JWT</strong> as sensitive credentials.</p>\n</li>\n<li><p>⏱ Refresh tokens periodically before expiration to avoid interruptions in service.</p>\n</li>\n<li><p>❌ Do not expose your credentials in client-side applications, browser code, or public repositories.</p>\n</li>\n<li><p>✅ Use secure HTTPS connections at all times.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","authentication","generateJWT"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"3b298c89-b47c-40d7-a1fe-2732f5f06f14","name":"Get token response","originalRequest":{"method":"POST","header":[{"key":"x-api-key","value":"","type":"text"},{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/authentication/generateJWT"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 10 Jan 2025 06:23:19 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"199"},{"key":"Connection","value":"keep-alive"},{"key":"x-amzn-RequestId","value":"d16e2af4-99ba-4a4d-ac13-7d7aa58239a1"},{"key":"x-amz-apigw-id","value":"EKJxkHgPIAMEGLA="},{"key":"X-Amzn-Trace-Id","value":"Root=1-6780bcd6-2673866c4b5cd3d31c7690c4;Parent=003c8eee2aa8eb7a;Sampled=0;Lineage=2:851f1f19:0"}],"cookie":[],"responseTime":null,"body":"{\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcmlnaW4iOiJkZXYuYXBpLmNsLsXdRHRyYWNrLnNvZHRyYWNrLmNvbSIsImlhdCI6MTczNjQ5MDE5OSwiZXhwIjoxNzM2NDkwNDk5fQ.21hkIFzXb1psNTqjPD8AuMq_eqeLFnzK44HT3CUXGDY\"\n}"}],"_postman_id":"563fe841-dee2-4aec-b1df-0569e1359291"}],"id":"5315a0c9-b1b4-4f7e-b785-a511ae25c959","description":"<p>Authentication is the foundation for securely interacting with the <strong>Sodtrack Integration API</strong>.  </p>\n<p>All API requests must be authenticated using a <strong>JSON Web Token (JWT)</strong> obtained through the authentication endpoint described below.</p>\n<p>This token ensures that each integration communicates securely with Sodtrack’s infrastructure and that access is restricted to authorized systems.</p>\n","_postman_id":"5315a0c9-b1b4-4f7e-b785-a511ae25c959","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Bookings","item":[{"name":"Create booking","id":"c399461e-27df-4154-a940-43a6b7b8f3a9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"token":""},"isInherited":false},"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/booking/v2","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates one or more new bookings in Sodtrack.</p>\n<p>This endpoint supports <strong>batch creation</strong>, allowing a single request to include multiple services in the <code>data</code> array.</p>\n<p>When multiple service entries are provided, Sodtrack automatically determines whether they can be <strong>grouped</strong> under a single provider and appointment slot.</p>\n<p>If grouping is not possible (due to scheduling, coverage, or provider constraints), <strong>individual ungrouped bookings</strong> will be created.</p>\n<p>Bookings can be created <strong>in a specific project</strong>: you can send a <strong>project identifier</strong> (<code>project</code>), optionally with a <strong>shopping cart</strong> within that project (<code>project.shoppingCart</code>), or a root-level <strong>shopping cart id</strong> (<code>shoppingCartId</code>) for compatibility. When <code>project</code> is present, it takes precedence and the shopping cart is resolved from the project (see <strong>Project and shopping cart resolution</strong> in Business Rules).</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧍-customer\">🧍 Customer</h4>\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>customer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Customer or requester information.</td>\n</tr>\n<tr>\n<td><code>customer.name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer's first name.</td>\n</tr>\n<tr>\n<td><code>customer.lastName</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Customer's last name.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>National ID or tax identification number.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>ISO 3166-1 alpha-2 country code for the identification number.</td>\n</tr>\n<tr>\n<td><code>customer.phoneNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Contact phone number in international format.</td>\n</tr>\n<tr>\n<td><code>customer.email</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Customer's email address.</td>\n</tr>\n<tr>\n<td><code>customer.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External reference of the customer.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>&lt;h4 &gt;If customer is new, one of email, reference or identification numbers should be provided, in order to generate a temporary email for that customer&lt;/h4&gt; </p>\n</blockquote>\n<hr />\n<h4 id=\"🧍-stakeholders\">🧍 Stakeholders</h4>\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>stakeholders</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Stakeholder who requested the booking. Only the first element is used and is applied to all created bookings.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].stakeholderId</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Link to an existing Sodtrack stakeholder by id. When provided, other fields are not required.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].name</code></td>\n<td><code>string</code></td>\n<td>✅ when creating new</td>\n<td>Stakeholder's first name (required when creating a new stakeholder, i.e. when <code>stakeholderId</code> is omitted).</td>\n</tr>\n<tr>\n<td><code>stakeholders[].lastName</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Stakeholder's last name.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].identificationNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>National ID or tax identification number.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>ISO 3166-1 alpha-2 country code for the identification number.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].phoneNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Contact phone number in international format.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].email</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Stakeholder's email address.</td>\n</tr>\n<tr>\n<td><code>stakeholders[].reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External reference of the stakeholder.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>&lt;h4 &gt;If stakeholder is new, one of email, reference or identification number should be provided.&lt;/h4&gt; </p>\n</blockquote>\n<hr />\n<h4 id=\"🏠-address\">🏠 <strong>Address</strong></h4>\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>address</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Physical service address (destination).</td>\n</tr>\n<tr>\n<td><code>address.address</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Main address or street. Omitted only if coordinates are provided; otherwise required for geocoding.</td>\n</tr>\n<tr>\n<td><code>address.extraInfo</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Additional address details (e.g., apartment, suite number).</td>\n</tr>\n<tr>\n<td><code>address.coordinate</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Optional geographic coordinates of the service location.</td>\n</tr>\n<tr>\n<td><code>address.coordinate.lat</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Latitude.</td>\n</tr>\n<tr>\n<td><code>address.coordinate.lng</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Longitude.</td>\n</tr>\n<tr>\n<td><code>address.associateToCustomer</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Whether the address should be stored and associated to the customer for reuse. Defaults to <strong>true</strong> when omitted.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>If coordinates are not provided, Sodtrack attempts to geocode the address automatically when geo-reference is part of your subscription.<br />If geocoding fails, the booking will be created without a map location and must be manually geolocated by an administrator before provider assignment. </p>\n</blockquote>\n<hr />\n<h4 id=\"🏠-origin-address\">🏠 Origin address</h4>\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>originAddress</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Origin address where the booking starts (e.g. pick-up, depot).</td>\n</tr>\n<tr>\n<td><code>originAddress.address</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Origin address or street.</td>\n</tr>\n<tr>\n<td><code>originAddress.extraInfo</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Additional address details (e.g., apartment, suite number).</td>\n</tr>\n<tr>\n<td><code>originAddress.coordinate</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Optional geographic coordinates of the origin location.</td>\n</tr>\n<tr>\n<td><code>originAddress.coordinate.lat</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Latitude.</td>\n</tr>\n<tr>\n<td><code>originAddress.coordinate.lng</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Longitude.</td>\n</tr>\n<tr>\n<td><code>originAddress.associateToCustomer</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Whether the origin address should be stored and associated to the customer. Defaults to <strong>false</strong> when omitted.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>If coordinates are not provided, Sodtrack attempts to geocode the address automatically when geo-reference is part of your subscription.<br />If geocoding fails, the booking will be created without a map location and must be manually geolocated by an administrator before provider assignment. </p>\n</blockquote>\n<hr />\n<h4 id=\"🧩-booking-data\">🧩 <strong>Booking Data</strong></h4>\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>data</code></td>\n<td><code>array[object]</code></td>\n<td>✅</td>\n<td>One or more service items to be booked. Each element represents a booking unit.</td>\n</tr>\n<tr>\n<td><code>data[].variant</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Defines the main service variant.</td>\n</tr>\n<tr>\n<td><code>data[].variant.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Type of variant identifier: <code>\"variantId\"</code> or <code>\"variantSku\"</code>.</td>\n</tr>\n<tr>\n<td><code>data[].variant.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Identifier corresponding to the selected variant.</td>\n</tr>\n<tr>\n<td><code>data[].variant.quantity</code></td>\n<td><code>number</code></td>\n<td>✅</td>\n<td>Quantity of the main variant requested.</td>\n</tr>\n<tr>\n<td><code>data[].variant.price</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Price paid by the customer (for integrations that include pricing).</td>\n</tr>\n<tr>\n<td><code>data[].variant.cost</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Cost paid to the provider.</td>\n</tr>\n<tr>\n<td><code>data[].addons</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional list of additional variants (add-ons).</td>\n</tr>\n<tr>\n<td><code>data[].addons[].type</code></td>\n<td><code>string</code></td>\n<td>✅ when addon sent</td>\n<td>Add-on identifier type: <code>\"addonId\"</code> or <code>\"addonReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>data[].addons[].value</code></td>\n<td><code>string</code></td>\n<td>✅ when addon sent</td>\n<td>Add-on identifier value.</td>\n</tr>\n<tr>\n<td><code>data[].addons[].quantity</code></td>\n<td><code>number</code></td>\n<td>✅ when addon sent</td>\n<td>Quantity of the add-on.</td>\n</tr>\n<tr>\n<td><code>data[].addons[].price</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Price charged to the customer for the add-on.</td>\n</tr>\n<tr>\n<td><code>data[].addons[].cost</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Cost paid to the provider for the add-on.</td>\n</tr>\n<tr>\n<td><code>data[].transport</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Optional transport-related charges.</td>\n</tr>\n<tr>\n<td><code>data[].transport.price</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Price charged to the customer.</td>\n</tr>\n<tr>\n<td><code>data[].transport.cost</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Cost allocated to the provider.</td>\n</tr>\n<tr>\n<td><code>data[].dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional form data collected as part of the booking (if configured in Sodtrack).</td>\n</tr>\n<tr>\n<td><code>data[].dynamicForms[].formReference</code></td>\n<td><code>string</code></td>\n<td>✅ when form sent</td>\n<td>Form reference identifier.</td>\n</tr>\n<tr>\n<td><code>data[].dynamicForms[].values</code></td>\n<td><code>object</code></td>\n<td>✅ when form sent</td>\n<td>Key-value map of submitted field data.</td>\n</tr>\n</tbody>\n</table>\n</div><p>When multiple items are included in the <code>data</code> array (<code>length &gt; 1</code>), Sodtrack automatically determines whether they can be grouped under a single booking (same provider/date).</p>\n<p>If grouping is not possible, individual bookings are created for each service item.</p>\n<hr />\n<h4 id=\"🕒-date-assignment\">🕒 <strong>Date Assignment</strong></h4>\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>dateAssignment</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Defines how the booking date is determined. See <strong>Date assignment</strong> in Business Rules.</td>\n</tr>\n<tr>\n<td><code>dateAssignment.type</code></td>\n<td><code>string</code></td>\n<td>✅ when object sent</td>\n<td>One of: <code>\"direct\"</code>, <code>\"user_scheduling\"</code>, <code>\"userScheduling\"</code>, <code>\"onDemand\"</code>, <code>\"providerScheduling\"</code>.</td>\n</tr>\n<tr>\n<td><code>dateAssignment.date</code></td>\n<td><code>string</code> (ISO 8601)</td>\n<td>❌</td>\n<td>Date and time for the booking. Required for scheduling when <code>type</code> is <code>\"direct\"</code>.</td>\n</tr>\n<tr>\n<td><code>dateAssignment.timeRange</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Time range within the day (used with <code>type = \"direct\"</code> when applicable).</td>\n</tr>\n<tr>\n<td><code>dateAssignment.timeRange.type</code></td>\n<td><code>string</code></td>\n<td>✅ when timeRange sent</td>\n<td><code>\"timeRangeId\"</code> or <code>\"timeRangeIndex\"</code>.</td>\n</tr>\n<tr>\n<td><code>dateAssignment.timeRange.value</code></td>\n<td><code>number</code></td>\n<td>✅ when timeRange sent</td>\n<td>Identifier or index of the time range.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"👷-provider-assignment\">👷 <strong>Provider Assignment</strong></h4>\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>providerAssignment</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Defines how the provider or technician is assigned. See <strong>Booking or bundle scheduling logic</strong> in Business Rules.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.type</code></td>\n<td><code>string</code></td>\n<td>✅ when object sent</td>\n<td><code>\"automatic\"</code> or <code>\"direct\"</code>.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.provider</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Required when <code>type</code> is <code>\"direct\"</code>. Specifies the provider when manually assigned.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.provider.type</code></td>\n<td><code>string</code></td>\n<td>✅ when provider sent</td>\n<td><code>\"providerId\"</code> or <code>\"providerReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.provider.value</code></td>\n<td><code>string</code></td>\n<td>✅ when provider sent</td>\n<td>ID or external reference of the provider.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"📁-project-optional\">📁 <strong>Project</strong> (optional)</h4>\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>project</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Project where the bookings will be created. When provided, Sodtrack resolves the project and then the shopping cart (see <strong>Project and shopping cart resolution</strong>). Takes precedence over root-level <code>shoppingCartId</code> when both are sent.</td>\n</tr>\n<tr>\n<td><code>project.type</code></td>\n<td><code>string</code></td>\n<td>✅ when project sent</td>\n<td>Type of project identifier: <code>\"projectId\"</code> or <code>\"projectReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>project.value</code></td>\n<td><code>string</code></td>\n<td>✅ when project sent</td>\n<td>Internal Sodtrack project ID, or external reference of the project.</td>\n</tr>\n<tr>\n<td><code>project.shoppingCart</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Optional. Target a specific shopping cart within the project (by ID or reference). When omitted, the latest shopping cart of the project is used, or a new one is created.</td>\n</tr>\n<tr>\n<td><code>project.shoppingCart.type</code></td>\n<td><code>string</code></td>\n<td>✅ when shoppingCart sent</td>\n<td>How the cart is identified: <code>\"shoppingCartId\"</code> or <code>\"shoppingCartReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>project.shoppingCart.value</code></td>\n<td><code>string</code></td>\n<td>✅ when shoppingCart sent</td>\n<td>Shopping cart ID (numeric as string) or external reference of the cart within the project.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧾-additional-metadata\">🧾 <strong>Additional Metadata</strong></h4>\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>reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External system reference (e.g., order ID).</td>\n</tr>\n<tr>\n<td><code>saleChannelId</code></td>\n<td><code>number</code></td>\n<td>✅</td>\n<td>Identifier for the sales or integration channel (must be preconfigured in Sodtrack). In best-effort mode, if the channel is not found it may be omitted and the request continues.</td>\n</tr>\n<tr>\n<td><code>project</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>See <strong>Project</strong> section above. When present, overrides <code>shoppingCartId</code>.</td>\n</tr>\n<tr>\n<td><code>createPaymentTransaction</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>If <strong>true</strong>, creates a payment transaction for each created booking.</td>\n</tr>\n<tr>\n<td><code>useStrictCoverageValidationMode</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td><strong>true</strong>: all-or-nothing validation (default). <strong>false</strong>: best-effort mode; only valid bookings are created. See Coverage Validation Behavior.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request-with-project\"><strong>Example Request (with project)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"García\",\n    \"identificationNumber\": \"12345678-9\",\n    \"identificationNumberCountry\": \"CL\",\n    \"phoneNumber\": \"+56912345678\",\n    \"email\": \"maria.garcia@example.com\"\n  },\n  \"address\": {\n    \"address\": \"Av. Providencia 1234, Santiago\",\n    \"extraInfo\": \"Depto 501\",\n    \"coordinate\": {\n      \"lat\": -33.43324794409109,\n      \"lng\": -70.58645659063548\n    }\n  },\n  \"data\": [\n    {\n      \"variant\": {\n        \"type\": \"variantSku\",\n        \"value\": \"install_curtains_sku\",\n        \"quantity\": 2,\n        \"price\": 150000,\n        \"cost\": 80000\n      }\n    }\n  ],\n  \"dateAssignment\": {\n    \"type\": \"direct\",\n    \"date\": \"2025-03-15T09:00:00.000Z\"\n  },\n  \"providerAssignment\": {\n    \"type\": \"direct\",\n    \"provider\": {\n      \"type\": \"providerId\",\n      \"value\": \"42\"\n    }\n  },\n  \"reference\": \"ORD-2025-001\",\n  \"saleChannelId\": 1,\n  \"project\": {\n    \"type\": \"projectReference\",\n    \"value\": \"PROJ-EXT-100\"\n  },\n  \"useStrictCoverageValidationMode\": true\n}\n\n</code></pre>\n<h3 id=\"example-request-with-project-and-specific-shopping-cart\"><strong>Example Request (with project and specific shopping cart)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": { \"name\": \"María\", \"lastName\": \"García\", \"email\": \"maria@example.com\" },\n  \"address\": { \"address\": \"Av. Providencia 1234, Santiago\", \"coordinate\": { \"lat\": -33.43, \"lng\": -70.58 } },\n  \"data\": [{ \"variant\": { \"type\": \"variantSku\", \"value\": \"install_curtains_sku\", \"quantity\": 1 } }],\n  \"saleChannelId\": 1,\n  \"project\": {\n    \"type\": \"projectReference\",\n    \"value\": \"PROJ-EXT-100\",\n    \"shoppingCart\": {\n      \"type\": \"shoppingCartReference\",\n      \"value\": \"STAGE-ORDER-2025-001\"\n    }\n  }\n}\n\n</code></pre>\n<p>When no cart exists in the project with reference <code>STAGE-ORDER-2025-001</code>, Sodtrack creates a new shopping cart with that reference and attaches the bookings to it.</p>\n<h3 id=\"example-request-minimal\"><strong>Example Request (minimal)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": {\n    \"name\": \"Juan Pérez\"\n  },\n  \"address\": {\n    \"address\": \"Calle Principal 100, Ciudad\"\n  },\n  \"data\": [\n    {\n      \"variant\": {\n        \"type\": \"variantId\",\n        \"value\": \"321\",\n        \"quantity\": 1\n      }\n    }\n  ],\n  \"saleChannelId\": 1\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"bookings\": [\n    {\n      \"id\": 10452,\n      \"quantity\": 2,\n      \"variantSku\": [\"install_curtains_sku\"],\n      \"variantId\": 321\n    }\n  ]\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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>bookings</code></td>\n<td><code>array[object]</code></td>\n<td>List of created bookings.</td>\n</tr>\n<tr>\n<td><code>bookings[].id</code></td>\n<td><code>number</code></td>\n<td>Unique Sodtrack booking ID.</td>\n</tr>\n<tr>\n<td><code>bookings[].quantity</code></td>\n<td><code>number</code></td>\n<td>Quantity of services booked.</td>\n</tr>\n<tr>\n<td><code>bookings[].variantSku</code></td>\n<td><code>array[string]</code></td>\n<td>List of variant SKUs associated with the booking.</td>\n</tr>\n<tr>\n<td><code>bookings[].variantId</code></td>\n<td><code>number</code></td>\n<td>Internal variant identifier.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_SALES_CHANNEL</code></td>\n<td>The given <code>saleChannelId</code> was not found (in strict mode).</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>—</td>\n<td>A referenced variant, provider, project, or channel could not be found.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"project-and-shopping-cart-resolution\">Project and shopping cart resolution</h2>\n<p>You can target a <strong>project</strong> and optionally a <strong>shopping cart</strong> within it, or use a root-level <strong>shopping cart id</strong> for compatibility.</p>\n<ul>\n<li><p><strong><code>project</code></strong> (without <code>project.shoppingCart</code>): Send a project identifier (<code>projectId</code> or <code>projectReference</code>). Sodtrack resolves the project and then uses the <strong>latest shopping cart</strong> linked to that project. If the project has no shopping cart, a <strong>new shopping cart</strong> is created for that project and the bookings are attached to it.</p>\n</li>\n<li><p><strong><code>project</code></strong> with <strong><code>project.shoppingCart</code></strong>: In addition to the project, you can target a specific cart within that project:</p>\n<ul>\n<li><p><strong><code>type = \"shoppingCartId\"</code></strong>: Sodtrack looks up the shopping cart by project and cart ID. If no cart is found with that ID in the project, it <strong>falls back</strong> to the latest shopping cart of the project.</p>\n</li>\n<li><p><strong><code>type = \"shoppingCartReference\"</code></strong>: Sodtrack looks up the shopping cart by project and cart reference. If no cart is found with that reference, it <strong>creates a new shopping cart</strong> for the project with the given reference (and uses it for the bookings). The new cart’s stage name is derived from the project name and the reference.</p>\n</li>\n</ul>\n</li>\n</ul>\n<p>When <strong>neither</strong> <code>project</code> is not sent, Sodtrack creates the bookings without attaching them to a project; further behavior depends on your configuration.</p>\n<p>When <strong><code>project.shoppingCart</code></strong> is provided:</p>\n<ul>\n<li><p><strong><code>shoppingCartId</code>****:</strong> Sodtrack looks up the cart by project and cart ID. If not found, it falls back to the latest shopping cart of the project.</p>\n</li>\n<li><p><strong><code>shoppingCartReference</code>****:</strong> Sodtrack looks up the cart by project and cart reference. If not found, it creates a new shopping cart for that project with the given reference and uses it for the bookings.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"date-assignment\">Date assignment</h2>\n<p>When <strong><code>dateAssignment</code></strong> is sent, <code>type</code> determines how the booking date is handled. Scheduling (assigning date and provider) only runs when both <code>dateAssignment</code> and <code>providerAssignment</code> are present and the system can complete the assignment (see <strong>Booking or bundle scheduling logic</strong>).</p>\n<ul>\n<li><p><strong><code>direct</code></strong>: The booking is scheduled to a specific date and time. <strong><code>date</code></strong> is required when scheduling is performed (ISO 8601). Optionally, <strong><code>timeRange</code></strong> can be sent to specify a time slot within the day by <code>timeRangeId</code> or <code>timeRangeIndex</code>. If <code>date</code> is missing when the system attempts to schedule, the scheduling step is skipped and the information is stored in a note on the booking.</p>\n</li>\n<li><p><strong><code>userScheduling</code></strong>: The user will choose the date later (e.g. via web or app). No immediate date is assigned. <code>userScheduling</code> is the preferred value; <strong><code>date</code></strong> and <strong><code>timeRange</code></strong> are not used for scheduling when this type is set.</p>\n</li>\n<li><p><strong><code>onDemand</code></strong>: The service is on-demand; date assignment is handled accordingly by the platform. <strong><code>date</code></strong> and <strong><code>timeRange</code></strong> are not used for direct scheduling.</p>\n</li>\n<li><p><strong><code>providerScheduling</code></strong>: The provider will determine or propose the date to the client. No immediate date is assigned from the request. <strong><code>date</code></strong> and <strong><code>timeRange</code></strong> are not used for direct scheduling.</p>\n</li>\n</ul>\n<p>When date definition cannot be completed (e.g. address not geo-referenced, or provider assignment missing/failed), Sodtrack still creates the bookings and stores the scheduling information in a note so it is not lost.</p>\n<hr />\n<h2 id=\"address-resolution-process\">Address resolution process</h2>\n<p>If no valid coordinates are available for <code>address</code>, and for <code>originAddress</code> when provided, bookings remain unassigned until manually updated.</p>\n<p>Provided addresses go through a resolution process to determine coordinates depending on the <code>associateToCustomer</code> value and whether the geo-reference intent is part of your subscription.</p>\n<h4 id=\"when-geo-reference-intent-is-not-part-of-your-subscription\">When geo-reference intent is not part of your subscription:</h4>\n<p>The system does not call the partner geocoding API. Addresses are used as provided; coordinates remain unchanged. Bookings that require coverage validation follow the non-georeferenced flow (see Strict mode / Best effort mode).</p>\n<h4 id=\"when-geo-reference-intent-is-part-of-your-subscription\">When geo-reference intent is part of your subscription:</h4>\n<p>If no coordinates are provided for the address, the system uses the <code>address</code> attribute of the provided address object and requests a match with coordinates from a partner API.</p>\n<ul>\n<li><p>If exactly one match is returned, the system uses those coordinates for all subsequent validation steps, including the <code>associateToCustomer</code> = true step.</p>\n</li>\n<li><p>If no match is returned or the partner API errors, the address remains without coordinates; resolution does not retry and the request continues with the unresolved address.</p>\n</li>\n</ul>\n<h4 id=\"when-associatetocustomer--true\">When <code>associateToCustomer</code> = true:</h4>\n<p>If the provided customer already exists, the platform attempts to find an existing address for that customer and reuse it. Address matching requires <strong>exact match of</strong> <strong><code>extraInfo</code></strong> (after normalization: trim, null/undefined treated as empty) <strong>and</strong> at least one of the following:</p>\n<ul>\n<li><p>The <code>address</code> attribute of the provided address equals the existing address's address.</p>\n</li>\n<li><p>The provided <code>coordinates</code> are within a 3 meter radius of the existing address's coordinates.</p>\n</li>\n</ul>\n<p>If a matching existing address is found, its coordinates and address fields are used for coverage and validations. If not, the address is created or updated as provided (and optionally geocoded when geo-reference intent is enabled).</p>\n<h4 id=\"defaults-for-address-association\">Defaults for address association:</h4>\n<ul>\n<li><p>Destination address: <code>associateToCustomer</code> defaults to <strong>true</strong> when omitted.</p>\n</li>\n<li><p>Origin address: <code>associateToCustomer</code> defaults to <strong>false</strong> when omitted.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"booking-bundling-logic\">Booking bundling logic</h2>\n<p>When the bundling capability is part of your subscription and multiple bookings are created in a single request, Sodtrack validates and creates a single bundle when possible. Bundling is <strong>all-or-nothing</strong>: the criteria must be satisfied for <strong>all</strong> created bookings in the request for a bundle to be created.</p>\n<p>Bundling validation rules:</p>\n<ul>\n<li><p>The provided <code>address</code> has coordinates after the address resolution process.</p>\n</li>\n<li><p>At least one technician is correctly configured to execute all bookings at that <code>address</code>.</p>\n</li>\n</ul>\n<p>If bundle creation fails (e.g. validation or provider constraints) bookings are still created and returned, and scheduling or note creation still runs.</p>\n<hr />\n<h2 id=\"booking-or-bundle-scheduling-logic\">Booking or bundle scheduling logic</h2>\n<p>Scheduling a booking (or the head of a bundle) requires <strong>both</strong> <code>dateAssignment</code> and <code>providerAssignment</code> in the request when the system is able to assign date and provider (see below).</p>\n<p>When the date definition for a booking or bundle cannot be completed or fails, and <code>dateAssignment</code> was provided, Sodtrack creates a <strong>note</strong> on that booking with the scheduling information so it is not lost. This happens when:</p>\n<ul>\n<li><p><code>providerAssignment</code> is missing.</p>\n</li>\n<li><p><code>providerAssignment</code> was provided but date/provider assignment fails (e.g. no availability for the given technician).</p>\n</li>\n<li><p>The destination <code>address</code> is not geo-referenced (no coordinates after resolution).</p>\n</li>\n<li><p><code>originAddress</code> is provided and is not geo-referenced (no coordinates after resolution).</p>\n</li>\n</ul>\n<p>In all of the above cases, <strong>bookings are already created</strong>; only the assignment step is skipped and replaced by the note.</p>\n<hr />\n<h2 id=\"coverage-validation-behavior\">Coverage Validation Behavior</h2>\n<p>The behavior of the booking creation flow depends on two factors:</p>\n<ol>\n<li><p>Whether the required addresses were successfully resolved with coordinates.</p>\n</li>\n<li><p>The configured mode (<code>useStrictCoverageValidationMode</code>).</p>\n</li>\n</ol>\n<hr />\n<h3 id=\"1-when-coordinates-are-not-resolved\">1. When Coordinates Are NOT Resolved</h3>\n<p>If a required address (destination and/or origin, depending on the variant rules) is <strong>not resolved with coordinates</strong>:</p>\n<ul>\n<li><p><strong>Coverage validations are not executed.</strong></p>\n</li>\n<li><p>Bookings are still created.</p>\n</li>\n<li><p>These bookings are expected to be managed later through the web administrator.</p>\n</li>\n</ul>\n<p>This behavior is the same in both <strong>Strict</strong> and <strong>Best Effort</strong> modes.<br />The selected mode does <strong>not</strong> affect this scenario.</p>\n<blockquote>\n<p>&lt;h4 &gt;Bookings created without address coordinates will require manual resolution and add operational overhead for each case.&lt;/h4&gt; </p>\n</blockquote>\n<hr />\n<h3 id=\"2-when-coordinates-are-resolved\">2. When Coordinates ARE Resolved</h3>\n<p>If the required addresses are successfully resolved with coordinates, full validation is executed (variant existence, operation areas, coverage by destination/origin when required, addons, etc.).</p>\n<p>At this point, the behavior depends on the selected mode.</p>\n<hr />\n<h4 id=\"strict-mode\">Strict Mode</h4>\n<p><code>useStrictCoverageValidationMode: true</code> (default)</p>\n<ul>\n<li><p><strong>All-or-nothing behavior.</strong></p>\n</li>\n<li><p>If any validation fails (for example, no coverage for a georeferenced address):</p>\n<ul>\n<li><p><strong>No bookings are created.</strong></p>\n</li>\n<li><p>The request returns a 400 error.</p>\n</li>\n</ul>\n</li>\n<li><p>No partial creation is allowed.</p>\n</li>\n</ul>\n<p>This mode guarantees that:</p>\n<ul>\n<li><p>All requested variants exist.</p>\n</li>\n<li><p>All variants have an operation area.</p>\n</li>\n<li><p>Georeferenced addresses have coverage when required.</p>\n</li>\n<li><p>Addons are valid, applicable and have coverage.</p>\n</li>\n</ul>\n<p>If any of these conditions fail, the entire request is rejected.</p>\n<blockquote>\n<p>This mode mirrors the creation through the administrator web UI, preventing the creation of bookings that could not be satisfied with the current state of configurations. </p>\n</blockquote>\n<hr />\n<h4 id=\"best-effort-mode\">Best Effort Mode</h4>\n<p><code>useStrictCoverageValidationMode: false</code></p>\n<ul>\n<li><p><strong>Partial success is allowed.</strong></p>\n</li>\n<li><p>Validation and coverage checks are executed, but failures do not abort the entire request.</p>\n</li>\n</ul>\n<p>When coordinates are resolved:</p>\n<ul>\n<li><p>If a variant does not exist → it is skipped.</p>\n</li>\n<li><p>If a variant has no operation area → it is skipped.</p>\n</li>\n<li><p>If a variant has no coverage → that booking may be skipped.</p>\n</li>\n<li><p>If an addon does not exist or has no coverage → it is not added to the booking.</p>\n</li>\n<li><p>The process continues with all other valid lines.</p>\n</li>\n</ul>\n<p>Only successfully created bookings are returned in the response.</p>\n<blockquote>\n<p>This mode allows the consumer to create as many valid bookings and their addons as possible, even if there is no coverage and operational overhead will be needed to handle some cases. </p>\n</blockquote>\n<hr />\n<h3 id=\"conceptual-summary\">Conceptual Summary</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Coordinates Resolved?</th>\n<th>Strict Mode</th>\n<th>Best Effort Mode</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>❌ No</td>\n<td>Bookings are created without coverage validation</td>\n<td>Bookings are created without coverage validation</td>\n</tr>\n<tr>\n<td>✅ Yes</td>\n<td>If any validation fails, nothing is created</td>\n<td>Only valid bookings are created</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"stakeholder\">Stakeholder</h2>\n<ul>\n<li><p>Optional <code>stakeholders</code> array; only the <strong>first element</strong> is used and is applied to <strong>all</strong> created bookings.</p>\n</li>\n<li><p><strong>Link existing:</strong> If <code>stakeholderId</code> is provided, Sodtrack resolves it. If the stakeholder is not found, an error is logged and no stakeholder is set on the bookings; the request is not aborted (strict and best effort).</p>\n</li>\n<li><p><strong>Create new:</strong> If <code>stakeholderId</code> is omitted but identifying data (e.g. <code>name</code>) is provided, a new stakeholder is created and its ID is used for all created bookings.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li><p>Dynamic form data is stored and linked to each booking for later retrieval.</p>\n</li>\n<li><p>All timestamps follow the ISO 8601 format (UTC).</p>\n</li>\n</ul>\n","urlObject":{"path":["api","integration","booking","v2"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"3e859c34-053f-4978-b2c2-c61942bbedd0","name":"Create booking","originalRequest":{"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"García\",\n    \"identificationNumber\": \"12345678-9\",\n    \"identificationNumberCountry\": \"CL\",\n    \"phoneNumber\": \"+56912345678\",\n    \"email\": \"maria.garcia@example.com\",\n    \"reference\": \"CUST-EXT-001\"\n  },\n  \"address\": {\n    \"address\": \"Av. Providencia 1234, Santiago\",\n    \"extraInfo\": \"Depto 501\",\n    \"coordinate\": {\n      \"lat\": -33.43324794409109,\n      \"lng\": -70.58645659063548\n    },\n    \"associateToCustomer\": true\n  },\n  \"originAddress\": {\n    \"address\": \"Av. Apoquindo 4500, Las Condes\",\n    \"extraInfo\": \"Bodega 2\",\n    \"coordinate\": {\n      \"lat\": -33.4105,\n      \"lng\": -70.5725\n    },\n    \"associateToCustomer\": false\n  },\n  \"stakeholders\": [\n    {\n      \"name\": \"Carlos\",\n      \"lastName\": \"López\",\n      \"identificationNumber\": \"98765432-1\",\n      \"identificationNumberCountry\": \"CL\",\n      \"phoneNumber\": \"+56987654321\",\n      \"email\": \"carlos.lopez@example.com\",\n      \"reference\": \"STK-EXT-001\"\n    }\n  ],\n  \"data\": [\n    {\n      \"variant\": {\n        \"type\": \"variantSku\",\n        \"value\": \"8472\",\n        \"quantity\": 1,\n        \"price\": 150000,\n        \"cost\": 80000\n      },\n      \"addons\": [\n        {\n          \"type\": \"addonReference\",\n          \"value\": \"addon_installation_extra\",\n          \"quantity\": 1,\n          \"price\": 25000,\n          \"cost\": 12000\n        }\n      ],\n      \"transport\": {\n        \"cost\": 15000\n      },\n      \"dynamicForms\": [\n        {\n          \"formReference\": \"installation_survey\",\n          \"values\": [\n            {\n              \"fieldReference\": \"window_type\",\n              \"value\": \"sliding\"\n            },\n            {\n              \"fieldReference\": \"notes\",\n              \"value\": \"Cliente prefiere horario matinal\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"dateAssignment\": {\n    \"type\": \"direct\",\n    \"date\": \"2025-03-15T09:00:00.000Z\",\n    \"timeRange\": {\n      \"type\": \"timeRangeId\",\n      \"value\": 5\n    }\n  },\n  \"providerAssignment\": {\n    \"type\": \"direct\",\n    \"provider\": {\n      \"type\": \"providerId\",\n      \"value\": \"42\"\n    }\n  },\n  \"reference\": \"ORD-2025-001\",\n  \"saleChannelId\": 1,\n  \"project\": {\n    \"type\": \"projectReference\",\n    \"value\": \"PROJ-EXT-100\"\n  },\n  \"createPaymentTransaction\": true,\n  \"useStrictCoverageValidationMode\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/booking/v2"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"bookings\": [\n        {\n            \"id\": 302,\n            \"quantity\": 1,\n            \"variantId\": 2,\n            \"variantSku\": [\"8472\"]\n        }\n    ]\n}\n"}],"_postman_id":"c399461e-27df-4154-a940-43a6b7b8f3a9"},{"name":"Update reference","id":"bf3ca6aa-a0d9-43fe-b449-7ae480e770ba","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"reference\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/booking/:bookingId/reference","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"859666ca-6988-492d-8578-94d0b6272424","id":"859666ca-6988-492d-8578-94d0b6272424","name":"Bookings","type":"folder"}},"urlObject":{"path":["api","integration","booking",":bookingId","reference"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[{"description":{"content":"<p>Id of the booking of which the referece should be updated</p>\n","type":"text/plain"},"type":"any","value":"2343","key":"bookingId"}]}},"response":[{"id":"38452203-659f-44b3-85c3-1aef0e921e74","name":"Update reference","originalRequest":{"method":"PATCH","header":[{"key":"Origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"reference\": \"2441242KKDSD-DSFS984\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/booking/:bookingId/reference","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["api","integration","booking",":bookingId","reference"],"variable":[{"key":"bookingId","value":"2343","description":"Id of the booking of which the referece should be updated"}]}},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"bf3ca6aa-a0d9-43fe-b449-7ae480e770ba"},{"name":"Cancel Booking","id":"4f87a878-8bab-48ce-8eaa-d9d2a877a132","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"token":""},"isInherited":false},"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/booking/cancel","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint cancels an existing booking through the Integration API. The booking is identified in the request body by either booking ID or booking reference.</p>\n<p>The endpoint optionally accepts dynamic form answers, for forms associated to the booking cancellation flow.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationcancelbookingrequestdto\">Request Body: ExternalIntegrationCancelBookingRequestDTO</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>booking</code></td>\n<td>ExternalIntegrationBookingIdentifierRequestDTO</td>\n<td>Yes</td>\n<td>Booking identifier object. Supports lookup by booking ID or booking reference.</td>\n</tr>\n<tr>\n<td><code>dynamicForms</code></td>\n<td>CreateDynamicFormSnapshotFromExternalIntegrationRequestDTO[]</td>\n<td>No</td>\n<td>Optional list of dynamic form answers to store as booking dynamic form snapshots on cancellation flow.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationbookingidentifierrequestdto\">ExternalIntegrationBookingIdentifierRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of booking identifier. Must be one of: <code>bookingId</code> or <code>bookingReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The booking ID (if type is <code>bookingId</code>) or booking reference (if type is <code>bookingReference</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"createdynamicformsnapshotfromexternalintegrationrequestdto\">CreateDynamicFormSnapshotFromExternalIntegrationRequestDTO</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>formReference</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Dynamic form reference configured in Sodtrack.</td>\n</tr>\n<tr>\n<td><code>values</code></td>\n<td>CreateBookingDynamicFormFieldValueV2RequestDTO[]</td>\n<td>Yes</td>\n<td>List of dynamic field answers for the form.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"createbookingdynamicformfieldvaluev2requestdto\">CreateBookingDynamicFormFieldValueV2RequestDTO</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>fieldReference</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Dynamic form field reference to answer.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Value to persist for the selected field.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"success-response\">Success 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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>-</td>\n<td>-</td>\n<td>-</td>\n<td><code>200 OK</code>. Response body is the cancelled booking (BookingDTO).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h2>\n<ul>\n<li><p>The booking must exist (<code>bookingId</code> or <code>bookingReference</code> lookup). If not found, the endpoint returns <code>BOOKING_NOT_FOUND_FOR_ID</code> (when identifying by ID) or <code>BOOKING_NOT_FOUND_FOR_REFERENCE</code> (when identifying by reference).</p>\n</li>\n<li><p>When identifying by <code>bookingReference</code>, the reference must resolve to exactly one booking. If multiple bookings share the same reference, the endpoint returns <code>MULTIPLE_BOOKINGS_FOUND_FOR_REFERENCE</code>.</p>\n</li>\n<li><p>When identifying by <code>bookingId</code>, the value must be a valid numeric ID. Invalid values return <code>INVALID_BOOKING_ID</code>.</p>\n</li>\n<li><p>The booking must be in a cancellable status. Bookings in any of the following statuses cannot be cancelled: <code>ON_MY_WAY_TO_ORIGIN</code>, <code>ARRIVED_TO_ORIGIN</code>, <code>ON_MY_WAY</code>, <code>ARRIVED_TO_DESTINATION</code>, <code>DONE</code>, <code>CANCELLED</code>. If the booking is in one of these statuses, the endpoint returns <code>400 Bad Request</code> with message \"Booking cannot be cancelled\".</p>\n</li>\n<li><p><code>dynamicForms</code> is optional, and need an actual dynamic form configured in the platform. The dynamic form has to be associated to the booking cancellation flow and must to have references, at form and fields level, for each of the fields sent in the payload.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"booking\": {\n    \"type\": \"bookingReference\",\n    \"value\": \"BOOK-EXT-789\"\n  },\n  \"dynamicForms\": [\n    {\n      \"formReference\": \"booking-cancel-reasons-v1\",\n      \"values\": [\n        {\n          \"fieldReference\": \"cancel_reason\",\n          \"value\": \"customer_request\"\n        },\n        {\n          \"fieldReference\": \"cancel_details\",\n          \"value\": \"Customer requested cancellation via external system.\"\n        }\n      ]\n    }\n  ]\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\nContent-Type: application/json\n\n</code></pre>\n<h2 id=\"example-error-responses\">Example Error Responses</h2>\n<p><strong>Booking not found (by ID):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 404,\n  \"message\": \"BOOKING_NOT_FOUND_FOR_ID\",\n  \"error\": \"Not Found\"\n}\n\n</code></pre>\n<p><strong>Booking not found (by reference):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 404,\n  \"message\": \"BOOKING_NOT_FOUND_FOR_REFERENCE\",\n  \"error\": \"Not Found\"\n}\n\n</code></pre>\n<p><strong>Multiple bookings for same reference:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"MULTIPLE_BOOKINGS_FOUND_FOR_REFERENCE\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<p><strong>Invalid booking ID (non-numeric):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"INVALID_BOOKING_ID\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<p><strong>Booking cannot be cancelled (status not allowed):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"Booking cannot be cancelled\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","integration","booking","cancel"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"955d6f67-7568-472a-aaa3-ad321bce68e0","name":"Cancel Booking","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"booking\": {\n    \"type\": \"bookingReference\",\n    \"value\": \"BOOK-356\"\n  },\n  \"dynamicForms\": [\n    {\n      \"formReference\": \"booking_cancel_form\",\n      \"values\": [\n        {\n          \"fieldReference\": \"cancel_reason\",\n          \"value\": \"customer_request\"\n        },\n        {\n          \"fieldReference\": \"cancel_details\",\n          \"value\": \"Customer requested cancellation via external system.\"\n        }\n      ]\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/booking/cancel"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"4f87a878-8bab-48ce-8eaa-d9d2a877a132"}],"id":"859666ca-6988-492d-8578-94d0b6272424","description":"<p>The bookings section is a key component of Sodtrack's flow and API. Here, you will find the endpoint for creating reservations, an essential process for managing your operations. Make sure to follow the required parameters and structure to ensure successful requests.</p>\n","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"3bcfd603-cfdc-4dfb-990e-2144ac4fb271","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"3adee320-3a19-4667-8945-cbaf0c7c0bd1","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"859666ca-6988-492d-8578-94d0b6272424"},{"name":"Projects","item":[{"name":"Project Creation","id":"041b6b56-2265-4810-90ed-7ffe5a267541","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/project","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new project in Sodtrack linked to a customer.</p>\n<p>The project is created with the provided <strong>name</strong>, <strong>reference</strong>, and optional <strong>description</strong>. The <strong>customer</strong> is resolved by reference or email: if an existing customer matches, that customer is linked to the project; otherwise a new customer is created and then linked.</p>\n<p>Projects created through this endpoint can later be targeted when creating bookings, so that bookings are attached to a stage of that project.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"📁-project\">📁 Project</h4>\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><code>string</code></td>\n<td>✅</td>\n<td>Project name.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Optional project description.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>External system reference for the project. Must be unique across projects.</td>\n</tr>\n<tr>\n<td><code>customer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Customer to associate with the project. Used to find an existing customer or to create a new one.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧍-customer\">🧍 Customer</h4>\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>customer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Customer information.</td>\n</tr>\n<tr>\n<td><code>customer.name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer's first name.</td>\n</tr>\n<tr>\n<td><code>customer.lastName</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Customer's last name.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>National ID or tax identification number.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>ISO 3166-1 alpha-2 country code for the identification number.</td>\n</tr>\n<tr>\n<td><code>customer.phoneNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Contact phone number in international format.</td>\n</tr>\n<tr>\n<td><code>customer.email</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Customer's email address. When creating a new customer, if missing or invalid a temporary email may be generated.</td>\n</tr>\n<tr>\n<td><code>customer.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External reference of the customer. Used together with email to resolve an existing customer.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>&lt;h4 &gt;If customer is new, one of email, reference or identification numbers should be provided, in order to generate a temporary email for that customer&lt;/h4&gt; </p>\n</blockquote>\n<hr />\n<h3 id=\"example-request-with-full-customer\"><strong>Example Request (with full customer)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Instalación cortinas - Av. Providencia\",\n  \"description\": \"Proyecto creado desde sistema externo\",\n  \"reference\": \"PROJ-EXT-100\",\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"García\",\n    \"identificationNumber\": \"12345678-9\",\n    \"identificationNumberCountry\": \"CL\",\n    \"phoneNumber\": \"+56912345678\",\n    \"email\": \"maria.garcia@example.com\",\n    \"reference\": \"CUST-EXT-001\"\n  }\n}\n\n</code></pre>\n<h3 id=\"example-request-minimal\"><strong>Example Request (minimal)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Proyecto ejemplo\",\n  \"reference\": \"PROJ-EXT-101\",\n  \"customer\": {\n    \"name\": \"Juan Pérez\",\n    \"email\": \"juanperez@example.com\"\n  }\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 502,\n  \"reference\": \"PROJ-EXT-100\"\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Unique Sodtrack project ID.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>The project reference as stored (same as requested).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>PROJECT_REFERENCE_ALREADY_USED: {reference}</code></td>\n<td>A project with the given <code>reference</code> already exists. The reference must be unique.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>MULTIPLE_CUSTOMERS_FOUND_FOR_REFERENCE</code></td>\n<td>More than one customer matches the provided reference/email; resolution is ambiguous. Use a unique reference or contact.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"project-reference-uniqueness\">Project reference uniqueness</h2>\n<ul>\n<li><p>The <strong><code>reference</code></strong> must be unique across all projects in Sodtrack.</p>\n</li>\n<li><p>If a project with the same <code>reference</code> already exists, the request is rejected with <code>PROJECT_REFERENCE_ALREADY_USED</code> and no project is created.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"customer-resolution\">Customer resolution</h2>\n<p>The <strong>customer</strong> object is used to either link an existing customer or create a new one:</p>\n<ul>\n<li><p><strong>Existing customer:</strong> Sodtrack searches by <strong>reference</strong> and <strong>email</strong> (from the request).</p>\n<ul>\n<li><p>If <strong>exactly one</strong> customer is found, that customer is linked to the new project.</p>\n</li>\n<li><p>If <strong>more than one</strong> customer matches, the request fails with <code>MULTIPLE_CUSTOMERS_FOUND_FOR_REFERENCE</code>. Ensure your external references or emails uniquely identify a single customer.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>New customer:</strong> If no customer is found, a new customer is created with the provided data. If <code>email</code> is missing or invalid, the system may generate a temporary email so the user can be created; the customer can be updated later (e.g. via the administrator or other APIs).</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li>All timestamps follow the ISO 8601 format (UTC) where applicable.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","project"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"b3dce0fc-23a9-4b74-92ee-88f1913d2d30","name":"Project Creation","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Proyecto ejemplo\",\n  \"description\": \"Proyecto creado desde sistema externo\",\n  \"reference\": \"PROJ-EXT-100\",\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"García\",\n    \"identificationNumber\": \"12345678-9\",\n    \"identificationNumberCountry\": \"CL\",\n    \"phoneNumber\": \"+56912345678\",\n    \"email\": \"maria.garcia@example.com\",\n    \"reference\": \"CUST-EXT-001\"\n  }\n}\n","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/project"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"name\": \"Proyecto ejemplo\",\n    \"reference\": \"PROJ-EXT-100\",\n    \"customer\": {\n        \"name\": \"María\"\n    }\n}"}],"_postman_id":"041b6b56-2265-4810-90ed-7ffe5a267541"}],"id":"a8d9734d-9cde-45a4-b10b-5d3812d966d6","_postman_id":"a8d9734d-9cde-45a4-b10b-5d3812d966d6","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Leads","item":[{"name":"Create Lead","id":"d3ea073a-b404-4db3-a19f-f7cedccf60f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new lead in Sodtrack for a given <strong>service</strong>.</p>\n<p>The lead is created with <strong>customer</strong> information, required <strong>qualifying questions</strong> (dynamic form field values tied to the service’s lead form), and optional <strong>provider assignment</strong> and <strong>dynamic forms</strong> (additional info). <strong>Address</strong> is optional only for <strong>in-store services</strong>; for non in-store services, a valid location input is required (see <strong>Address and coordinates</strong> in Business Rules).</p>\n<p>When <strong>address</strong> is sent without coordinates, Sodtrack may attempt to geocode it automatically (when auto-geocoding is enabled for external integration). For services that are not in-store, the lead creation requires a valid location input: <strong>coordinates</strong>, <strong>address text</strong>, or <strong>zip code</strong>; otherwise the request fails with <code>REQUIRES_ADDRESS_OR_ZIP_CODE</code> (see <strong>Address and coordinates</strong> in Business Rules).</p>\n<p><strong>Provider assignment</strong> and <strong>dynamic form</strong> snapshots are applied after the lead is created; failures in those steps do not fail the request—the lead is still returned.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧍-customer\">🧍 <strong>Customer</strong></h4>\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>customer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Customer or contact information for the lead.</td>\n</tr>\n<tr>\n<td><code>customer.name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer's first name.</td>\n</tr>\n<tr>\n<td><code>customer.lastName</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Customer's last name.</td>\n</tr>\n<tr>\n<td><code>customer.phoneNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Contact phone number in international format.</td>\n</tr>\n<tr>\n<td><code>customer.email</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Customer's email address.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>National ID or tax identification number.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>ISO 3166-1 alpha-2 country code for the identification number.</td>\n</tr>\n<tr>\n<td><code>customer.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External reference of the customer.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🏠-address\">🏠 <strong>Address</strong></h4>\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>address</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Service or lead location. Required for non in-store services (see Business Rules).</td>\n</tr>\n<tr>\n<td><code>address.address</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Main address or street. Used for geocoding when coordinates are not provided.</td>\n</tr>\n<tr>\n<td><code>address.extraInfo</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Additional address details (e.g., apartment, suite number).</td>\n</tr>\n<tr>\n<td><code>address.coordinate</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Geographic coordinates of the service location.</td>\n</tr>\n<tr>\n<td><code>address.coordinate.lat</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Latitude. When provided, must be between -90 and 90.</td>\n</tr>\n<tr>\n<td><code>address.coordinate.lng</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Longitude. When provided, must be between -180 and 180.</td>\n</tr>\n<tr>\n<td><code>address.associateAddressToCustomer</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Whether the address should be stored and associated to the customer. Defaults to <strong>true</strong> when omitted.</td>\n</tr>\n<tr>\n<td><code>address.zipCode</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Optional zip/postal code. Can be used as location input for non in-store services.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>If coordinates are not provided but <code>address.address</code> is sent, Sodtrack may attempt to geocode the address automatically if its part of your active features.<br />If the service is not in-store and the request has no coordinates, no address text, and no zip code, the request fails with <code>REQUIRES_ADDRESS_OR_ZIP_CODE</code>. </p>\n</blockquote>\n<hr />\n<h4 id=\"📋-lead-context\">📋 <strong>Lead context</strong></h4>\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>salesChannelId</code></td>\n<td><code>number</code></td>\n<td>✅</td>\n<td>Sodtrack sales channel ID. Must exist and be valid.</td>\n</tr>\n<tr>\n<td><code>serviceId</code></td>\n<td><code>number</code></td>\n<td>✅</td>\n<td>Sodtrack service ID. Must exist and have an associated lead form.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External reference for the lead. Stored for your tracking; uniqueness is not enforced by this endpoint.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧩-qualifying-questions\">🧩 <strong>Qualifying questions</strong></h4>\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>qualifyingQuestions</code></td>\n<td><code>array[object]</code></td>\n<td>✅</td>\n<td>Answers to the lead form’s qualifying (dynamic) fields. Each entry must reference a dynamic field of the service’s lead form.</td>\n</tr>\n<tr>\n<td><code>qualifyingQuestions[].fieldReference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Field reference of the dynamic field in the lead form. Must match a field belonging to the lead form of the given <code>serviceId</code>.</td>\n</tr>\n<tr>\n<td><code>qualifyingQuestions[].value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Value for the field.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Each <code>fieldReference</code> must correspond to a dynamic field of the lead form associated with the request’s <strong>service</strong>. Invalid or mismatched references cause the request to fail with <code>INVALID_QUALIFYING_QUESTION_WITH_ID_REFERENCE</code>. </p>\n</blockquote>\n<hr />\n<h4 id=\"📄-dynamic-forms-additional-info\">📄 <strong>Dynamic forms (additional info)</strong></h4>\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>dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Additional dynamic form snapshots to attach to the lead after creation. Processed after the lead is created; errors are logged and do not fail the request.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].formReference</code></td>\n<td><code>string</code></td>\n<td>✅ when dynamic form sent</td>\n<td>Reference of the form.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values</code></td>\n<td><code>array[object]</code></td>\n<td>✅ when dynamic form sent</td>\n<td>Field values for the form.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values[].fieldReference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Reference of the field.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values[].value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Value for the field.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"👷-provider-assignment\">👷 <strong>Provider assignment</strong></h4>\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>providerAssignment</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>How to assign a provider to the lead. Applied after the lead is created; errors are logged and do not fail the request.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.type</code></td>\n<td><code>string</code></td>\n<td>✅ when providerAssignment sent</td>\n<td>Assignment type: <code>\"direct\"</code> (specific provider) or <code>\"automatic\"</code>.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.provider</code></td>\n<td><code>object</code></td>\n<td>✅ when type = \"direct\"</td>\n<td>Provider to assign. Omitted when <code>type</code> is <code>\"automatic\"</code>.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.provider.type</code></td>\n<td><code>string</code></td>\n<td>✅ when direct</td>\n<td>Identifier type: <code>\"providerId\"</code> or <code>\"providerReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>providerAssignment.provider.value</code></td>\n<td><code>string</code></td>\n<td><code>number</code></td>\n<td>✅ when direct</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request-with-address-and-provider-assignment\"><strong>Example Request (with address and provider assignment)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"García\",\n    \"phoneNumber\": \"+56912345678\",\n    \"email\": \"maria.garcia@example.com\",\n    \"reference\": \"CUST-EXT-001\"\n  },\n  \"address\": {\n    \"address\": \"Av. Providencia 1234, Santiago\",\n    \"extraInfo\": \"Depto 501\",\n    \"coordinate\": {\n      \"lat\": -33.4372,\n      \"lng\": -70.6506\n    },\n    \"zipCode\": \"7500000\"\n  },\n  \"salesChannelId\": 1,\n  \"serviceId\": 42,\n  \"reference\": \"LEAD-EXT-200\",\n  \"qualifyingQuestions\": [\n    {\n      \"fieldReference\": \"1\",\n      \"value\": \"high\"\n    }\n  ],\n  \"providerAssignment\": {\n    \"type\": \"direct\",\n    \"provider\": {\n      \"type\": \"providerId\",\n      \"value\": 10\n    }\n  }\n}\n\n</code></pre>\n<h3 id=\"example-request-with-zip_code\"><strong>Example Request (with zip_code)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"García\",\n    \"phoneNumber\": \"+56912345678\",\n    \"email\": \"maria.garcia@example.com\",\n    \"reference\": \"CUST-EXT-001\"\n  },\n  \"address\": {\n    \"zipCode\": \"7500000\"\n  },\n  \"salesChannelId\": 1,\n  \"serviceId\": 42,\n  \"reference\": \"LEAD-EXT-201\",\n  \"qualifyingQuestions\": [\n    {\n      \"fieldReference\": \"1\",\n      \"value\": \"high\"\n    }\n  ]\n}\n\n</code></pre>\n<h3 id=\"example-request-minimal\"><strong>Example Request (minimal)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": {\n    \"name\": \"Juan Pérez\"\n  },\n  \"salesChannelId\": 1,\n  \"serviceId\": 42,\n  \"qualifyingQuestions\": [\n    {\n      \"fieldReference\": \"1\",\n      \"value\": \"high\"\n    }\n  ]\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 1001,\n  \"customer_id\": 502\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Unique Sodtrack lead ID.</td>\n</tr>\n<tr>\n<td><code>customer_id</code></td>\n<td><code>number</code></td>\n<td>Sodtrack customer ID associated with the lead.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_SERVICE</code></td>\n<td>The given <code>serviceId</code> does not exist or has no associated lead form.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_SALES_CHANNEL</code></td>\n<td>The given <code>salesChannelId</code> does not exist or is invalid.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_LATITUDE_OR_LONGITUDE</code></td>\n<td><code>address.coordinate</code> was sent with lat/lng outside valid ranges (lat -90–90, lng -180–180).</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>REQUIRES_ADDRESS_OR_ZIP_CODE</code></td>\n<td>The service is not an in-store service and the request did not include coordinates, address text, or zip code.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_QUALIFYING_QUESTION_WITH_ID_REFERENCE: {fieldReference}</code></td>\n<td>A qualifying question <code>fieldReference</code> does not match any dynamic field for the service’s lead form.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>FIELD_REFERENCE_IS_REQUIRED</code></td>\n<td>A qualifying question entry is missing <code>fieldReference</code>.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid (e.g. validation pipeline).</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"service-and-sales-channel\">Service and sales channel</h2>\n<ul>\n<li><p><strong><code>serviceId</code></strong> must identify an existing Sodtrack service that has an associated lead form. Otherwise the request fails with <code>INVALID_SERVICE</code>.</p>\n</li>\n<li><p><strong><code>salesChannelId</code></strong> must identify an existing sales channel. Otherwise the request fails with <code>INVALID_SALES_CHANNEL</code>.</p>\n</li>\n<li><p>For <strong>in-store services</strong>, Sodtrack uses the sales channel address and the request <code>address</code> can be omitted.</p>\n</li>\n<li><p>For <strong>non in-store services</strong>, a valid location input is required: coordinates, address text, or zip code.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"address-and-coordinates\">Address and coordinates</h2>\n<ul>\n<li><p><strong>When</strong> <strong><code>address</code></strong> <strong>is sent with</strong> <strong><code>coordinate</code>****:</strong> The system validate those to be valid coordinates. Otherwise the request fails with <code>INVALID_LATITUDE_OR_LONGITUDE</code>.</p>\n</li>\n<li><p><strong>When</strong> <strong><code>address</code></strong> <strong>is sent with</strong> <strong><code>address</code></strong> <strong>(street) but no coordinates:</strong> Sodtrack may attempt to geocode the address automatically when enabled for external integration. If geocoding succeeds, coordinates are filled in; if it fails, they remain missing.</p>\n</li>\n<li><p><strong>When the service is not an in-store service:</strong> The lead creation step requires <strong>at least one</strong> valid location input: <strong>coordinates</strong> (<code>address.coordinate</code>), <strong>address text</strong> (<code>address.address</code>), or <strong>zip code</strong> (<code>address.zip_code</code>). If <strong>none</strong> of these are provided, the request fails with <code>REQUIRES_ADDRESS_OR_ZIP_CODE</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"qualifying-questions\">Qualifying questions</h2>\n<ul>\n<li><p>Each element in <strong><code>qualifyingQuestions</code></strong> must have a <strong><code>fieldReference</code></strong> that matches a dynamic field of the <strong>lead form</strong> associated with the request’s <strong>service</strong>.</p>\n</li>\n<li><p>If a <code>fieldReference</code> does not exist or belongs to a different form, the request fails with <code>INVALID_QUALIFYING_QUESTION_WITH_ID_REFERENCE</code> (including the invalid reference or a message that the field is not associated with the service’s lead form).</p>\n</li>\n<li><p>The array can be empty if the lead form has no required qualifying fields.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"provider-assignment-and-dynamic-forms\">Provider assignment and dynamic forms</h2>\n<ul>\n<li><p><strong>Provider assignment</strong> and <strong>dynamic form</strong> snapshots are applied <strong>after</strong> the lead is created.</p>\n</li>\n<li><p>Failures during provider assignment or dynamic form creation are <strong>logged</strong> but do <strong>not</strong> cause the endpoint to return an error; the response still returns the created lead (<code>id</code> and <code>customer_id</code>).</p>\n</li>\n<li><p>For <strong>direct</strong> provider assignment, <code>provider</code> with <code>type</code> and <code>value</code> must be provided; for <strong>automatic</strong>, no <code>provider</code> object is needed.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"lead-reference\">Lead reference</h2>\n<ul>\n<li><strong><code>reference</code></strong> is an optional external identifier stored with the lead. This endpoint does not enforce uniqueness on <code>reference</code>.</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li><p>All timestamps follow the ISO 8601 format (UTC) where applicable.</p>\n</li>\n<li><p>Customer and address data are stored as provided; identification country should be ISO 3166-1 alpha-2 where applicable.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","lead"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"a6bc99bf-fc19-4a07-89e7-e37b14920fcf","name":"Create Lead","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"address\": {\n        \"address\": \"Hernán Cortés 2624\",\n        \"address_extra_info\": \"Casa con muralla amarilla\",\n        \"coordinate\": {\n            \"lat\": -33.446725547942364,\n            \"lng\": -70.60396818964483\n        }\n    },\n    \"customer\": {\n        \"name\": \"Felipe\",\n        \"lastName\": \"Hanckes\",\n        \"email\": \"felipe@sodtrack.com\",\n        \"phoneNumber\": \"+56978993325\",\n        \"identificationNumber\": \"19081637-0\",\n        \"identificationNumberCountry\": \"CL\"\n    },\n    \"dynamicForms\": [\n        {\n            \"formReference\": \"RF-0001\",\n            \"values\": [\n                {\n                    \"fieldReference\": \"1001\",\n                    \"value\": \"true\"\n                }\n            ]\n        }\n    ],\n    \"QualifyingQuestions\": [\n        {\n            \"fieldReference\": 8,\n            \"value\": \"Aire Acondicionado Split - 9.000 BTU\"\n        },\n        {\n            \"fieldReference\": 15,\n            \"value\": \"3 - 6 meses\"\n        },\n        {\n            \"fieldReference\": 10,\n            \"value\": \"700043234331\"\n        }\n    ],\n    \"reference\": \"00QU900000JCs8CMAT\",\n    \"serviceId\": 2,\n    \"salesChannelId\": 9\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 4,\n    \"customer_id\": 15\n}"}],"_postman_id":"d3ea073a-b404-4db3-a19f-f7cedccf60f0"},{"name":"Cancel Lead","id":"59187350-27e1-425f-8263-96a4ac81a0fd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"lead\": {\n        \"type\": \"string\", // one off: \"leadId\" or \"leadReference\",\n        \"value\": \"string\" // value of the leadId or leadReference\n    },\n    \"comment\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/cancel","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint cancels an existing lead throug## General Description</p>\n<p>This endpoint cancels an existing lead through the Integration API. The lead is identified in the request body by either lead ID or lead reference.</p>\n<p>In addition to the cancellation comment, the endpoint optionally accepts dynamic form answers in the same external integration format used in booking/lead flows (<code>formReference</code> + <code>values[]</code> with <code>fieldReference</code> and <code>value</code>).</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationcancelleadrequestdto\">Request Body: ExternalIntegrationCancelLeadRequestDTO</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>lead</code></td>\n<td>ExternalIntegrationLeadIdentifierRequestDTO</td>\n<td>Yes</td>\n<td>Lead identifier object. Supports lookup by lead ID or lead reference.</td>\n</tr>\n<tr>\n<td><code>comment</code></td>\n<td>string</td>\n<td>No</td>\n<td>Cancellation reason/comment persisted as lead cancel reason.</td>\n</tr>\n<tr>\n<td><code>dynamicForms</code></td>\n<td>CreateDynamicFormSnapshotFromExternalIntegrationRequestDTO[]</td>\n<td>No</td>\n<td>Optional list of dynamic form answers to store as lead dynamic form snapshots on cancellation flow.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationleadidentifierrequestdto\">ExternalIntegrationLeadIdentifierRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of lead identifier. Must be one of: <code>leadId</code> or <code>leadReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The lead ID (if type is <code>leadId</code>) or lead reference (if type is <code>leadReference</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"createdynamicformsnapshotfromexternalintegrationrequestdto\">CreateDynamicFormSnapshotFromExternalIntegrationRequestDTO</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>formReference</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Dynamic form reference configured in Sodtrack.</td>\n</tr>\n<tr>\n<td><code>values</code></td>\n<td>CreateBookingDynamicFormFieldValueV2RequestDTO[]</td>\n<td>Yes</td>\n<td>List of dynamic field answers for the form.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"createbookingdynamicformfieldvaluev2requestdto\">CreateBookingDynamicFormFieldValueV2RequestDTO</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>fieldReference</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Dynamic form field reference to answer.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Value to persist for the selected field.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"success-response\">Success 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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>-</td>\n<td>-</td>\n<td>-</td>\n<td><code>200 OK</code>. Lead cancellation operation completed.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h2>\n<ul>\n<li><p>The lead must exist (<code>leadId</code> or <code>leadReference</code> lookup). If not found, the endpoint returns <code>LEAD_NOT_FOUND</code>.</p>\n</li>\n<li><p><code>comment</code> is required and is used as the lead cancellation reason.</p>\n</li>\n<li><p><code>dynamicForms</code> is optional. When present, each item is transformed into a dynamic form snapshot</p>\n</li>\n<li><p>Dynamic form snapshot validation is executed before persistence. Invalid form references or invalid values for the fields, return validation/business errors (<code>400 Bad Request</code>).</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadReference\",\n    \"value\": \"LEAD-EXT-342\"\n  },\n  \"comment\": \"Customer canceled due to schedule conflict.\",\n  \"dynamicForms\": [\n    {\n      \"formReference\": \"lead-cancel-reasons-v1\",\n      \"values\": [\n        {\n          \"fieldReference\": \"cancel_reason\",\n          \"value\": \"customer_unavailable\"\n        },\n        {\n          \"fieldReference\": \"cancel_details\",\n          \"value\": \"Customer requested cancellation by phone.\"\n        }\n      ]\n    }\n  ]\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\n\n</code></pre>\n<h2 id=\"example-error-response\">Example Error Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"LEAD_NOT_FOUND\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","lead","cancel"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"b5534d6e-80f2-4b82-b8c5-7ea5df5f78c7","name":"Cancel Lead","originalRequest":{"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\n    \"lead\": {\n        \"type\": \"leadId\", // one off: \"leadId\" or \"leadReference\",\n        \"value\": \"102\" // value of the leadId or leadReference\n    },\n    \"comment\": \"Clien has requested to cancel the lead. Please check with the sales team.\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/cancel"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"59187350-27e1-425f-8263-96a4ac81a0fd"},{"name":"Assign provider","id":"935f9896-5576-4bf5-ac83-d4e1ffb6d9be","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"lead\": {\n    \"type\": \"leadReference\",\n    \"value\": \"LEAD-EXT-342\"\n  },\n  \"providerAssignment\": {\n    \"type\": \"direct\",\n    \"provider\": {\n      \"type\": \"providerReference\",\n      \"value\": \"PROV-001\"\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/assign-provider","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint assigns a lead to a specific provider (<code>direct</code>) or switches the lead to automatic provider assignment (<code>automatic</code>). The lead is identified in the request body by either lead ID or lead reference.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationassignproviderleadrequestdto\">Request Body: ExternalIntegrationAssignProviderLeadRequestDTO</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>lead</code></td>\n<td>ExternalIntegrationLeadIdentifierRequestDTO</td>\n<td>Yes</td>\n<td>Lead identifier object. Supports lookup by lead ID or lead reference.</td>\n</tr>\n<tr>\n<td><code>providerAssignment</code></td>\n<td>ProviderAssignmentFromExternalIntegrationRequestDTO</td>\n<td>Yes</td>\n<td>Provider assignment strategy. Use <code>direct</code> to assign a specific provider or <code>automatic</code> to trigger automatic provider flow.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationleadidentifierrequestdto\">ExternalIntegrationLeadIdentifierRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of lead identifier. Must be one of: <code>leadId</code> or <code>leadReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The lead ID (if type is <code>leadId</code>) or lead reference (if type is <code>leadReference</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"providerassignmentfromexternalintegrationrequestdto\">ProviderAssignmentFromExternalIntegrationRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Assignment strategy. Must be one of: <code>direct</code> or <code>automatic</code>.</td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td>providerInputToSearchInExternalIntegrationRequestDTO</td>\n<td>No</td>\n<td>Provider selector. Required when <code>type</code> is <code>direct</code>; ignored when <code>type</code> is <code>automatic</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"providerinputtosearchinexternalintegrationrequestdto\">providerInputToSearchInExternalIntegrationRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of provider identifier. Must be one of: <code>providerId</code> or <code>providerReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>number</td>\n<td>Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h2>\n<ul>\n<li><p>The lead must exist (<code>leadId</code> or <code>leadReference</code> lookup). If not found, the endpoint returns <code>LEAD_NOT_FOUND</code>.</p>\n</li>\n<li><p>For <code>direct</code> assignment:</p>\n<ul>\n<li><p>Provider must be resolvable from <code>provider.type</code> + <code>provider.value</code>.</p>\n</li>\n<li><p><code>provider.type</code> must be one of: <code>providerId</code>, <code>providerReference</code>.</p>\n</li>\n<li><p>Lead status must not be <code>CANCELLED</code> or <code>DONE</code>.</p>\n</li>\n</ul>\n</li>\n<li><p>For <code>automatic</code> assignment:</p>\n<ul>\n<li><p>Lead status must not be <code>CANCELLED</code> or <code>DONE</code>.</p>\n</li>\n<li><p>Lead must not already have a booking or project.</p>\n</li>\n</ul>\n</li>\n<li><p>If lead assignment constraints fail, the endpoint returns <code>400 Bad Request</code> with the corresponding validation/business error.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"example-request-direct-assignment\">Example Request (Direct Assignment)</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadReference\",\n    \"value\": \"LEAD-EXT-001\"\n  },\n  \"providerAssignment\": {\n    \"type\": \"direct\",\n    \"provider\": {\n      \"type\": \"providerReference\",\n      \"value\": \"PROV-001\"\n    }\n  }\n}\n\n</code></pre>\n<h2 id=\"example-request-automatic-assignment\">Example Request (Automatic Assignment)</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadId\",\n    \"value\": \"342\"\n  },\n  \"providerAssignment\": {\n    \"type\": \"automatic\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\n\n</code></pre>\n<h2 id=\"example-error-response\">Example Error Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"Lead cannot be updated to automatic provider assignment, it has a booking already\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","lead","assign-provider"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"2762c32b-c587-4d72-bed5-1346fc495731","name":"Assign provider","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"lead\": {\n    \"type\": \"leadReference\",\n    \"value\": \"LEAD-EXT-342\"\n  },\n  \"providerAssignment\": {\n    \"type\": \"direct\",\n    \"provider\": {\n      \"type\": \"providerReference\",\n      \"value\": \"PROV-001\"\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/assign-provider"},"status":"No Content","code":204,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"935f9896-5576-4bf5-ac83-d4e1ffb6d9be"},{"name":"Create Note","id":"27d9199b-4a6c-470d-bdf5-e0ebba6f9386","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/note","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new note associated with an existing lead in Sodtrack.</p>\n<p>The lead is identified in the request body by either <strong>lead ID</strong> or <strong>lead reference</strong>.<br />The note is created in the context of the <strong>issuer</strong> user when possible, and an optional <strong>reference</strong> can be used to correlate the note with an external system.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧾-request-body\">🧾 Request Body</h4>\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>lead</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Lead identifier object. Supports lookup by lead ID or lead reference.</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Note text to create on the lead.</td>\n</tr>\n<tr>\n<td><code>issuer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Issuer payload. <code>email</code> is used to resolve an existing user if possible.</td>\n</tr>\n<tr>\n<td><code>isShareable</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Visibility flag for the note. Defaults to <strong>true</strong> when omitted.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Optional external reference for the note (e.g. from an external system).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🎯-lead-identifier\">🎯 Lead Identifier</h4>\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>lead.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Type of lead identifier. Must be one of: <code>\"leadId\"</code> or <code>\"leadReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>lead.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The lead ID (if <code>type = \"leadId\"</code>) or lead reference (if <code>type = \"leadReference\"</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"👤-issuer\">👤 Issuer</h4>\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>issuer.name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Issuer first name.</td>\n</tr>\n<tr>\n<td><code>issuer.lastName</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Issuer last name.</td>\n</tr>\n<tr>\n<td><code>issuer.email</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Issuer email used to search an existing Sodtrack user.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request-issuer-user-found\"><strong>Example Request (issuer user found)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadReference\",\n    \"value\": \"LEAD-EXT-342\"\n  },\n  \"note\": \"Customer requested a callback in the afternoon.\",\n  \"issuer\": {\n    \"name\": \"Maria\",\n    \"lastName\": \"Fernandez\",\n    \"email\": \"maria.fernandez@example.com\"\n  },\n  \"isShareable\": true,\n  \"reference\": \"NOTE-EXT-001\"\n}\n</code></pre>\n<h3 id=\"example-request-minimal\"><strong>Example Request (minimal)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadId\",\n    \"value\": \"5678\"\n  },\n  \"note\": \"Follow-up call completed.\",\n  \"issuer\": {\n    \"name\": \"Support\",\n    \"lastName\": \"Team\",\n    \"email\": \"support@example.com\"\n  }\n}\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\n</code></pre>\n<hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>LEAD_NOT_FOUND</code></td>\n<td>The lead could not be found for the given <code>leadId</code> or <code>leadReference</code>.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"lead-resolution\">Lead resolution</h2>\n<ul>\n<li>The lead is resolved from the <strong><code>lead</code></strong> object:<ul>\n<li><strong><code>type = \"leadId\"</code></strong>: <code>value</code> must be a valid lead ID.</li>\n<li><strong><code>type = \"leadReference\"</code></strong>: <code>value</code> must be a valid lead reference.</li>\n</ul>\n</li>\n<li>If the lead is not found, the endpoint returns <strong><code>LEAD_NOT_FOUND</code></strong> and no note is created.</li>\n</ul>\n<hr />\n<h2 id=\"issuer-resolution\">Issuer resolution</h2>\n<p>The issuer is resolved using <strong><code>issuer.email</code></strong>:</p>\n<ul>\n<li><strong>If a user with that email exists in Sodtrack:</strong><ul>\n<li>The note is linked to that user (<code>note.user_id = user.id</code>).</li>\n<li>The note text is augmented with contextual information (e.g. <code>Created via API</code>).</li>\n</ul>\n</li>\n<li><strong>If no user is found for <code>issuer.email</code>:</strong><ul>\n<li>The note is created <strong>without</strong> a linked user (<code>note.user_id = null</code>).</li>\n<li>The issuer full name (<code>name</code> + <code>lastName</code>) is embedded in the note text (e.g. <code>Note by {name} {lastName}: ...</code>).</li>\n</ul>\n</li>\n</ul>\n<p><code>name</code> and <code>lastName</code> should still be provided even when the issuer might not exist in Sodtrack, so the platform can record who authored the note from the external system.</p>\n<hr />\n<h2 id=\"visibility-isshareable\">Visibility (isShareable)</h2>\n<ul>\n<li><strong><code>isShareable</code></strong> controls whether the note is shareable/visible according to your Sodtrack configuration.</li>\n<li>When <strong><code>isShareable</code></strong> is omitted, it defaults to <strong>true</strong>.</li>\n</ul>\n<hr />\n<h2 id=\"reference\">Reference</h2>\n<ul>\n<li><strong><code>reference</code></strong> is optional and stored as-is to help correlate notes with external or upstream systems (e.g. ticket IDs, case IDs).</li>\n<li>Sodtrack does <strong>not</strong> enforce uniqueness or any specific format for <code>reference</code>.</li>\n<li>You can use this field for idempotency or traceability on your side.</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li>All timestamps in responses (when present) follow the ISO 8601 format (UTC).</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","lead","note"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"39ad96dd-edf4-42f5-87d1-c7e211217682","name":"Create Note","originalRequest":{"method":"POST","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"lead\": {\n    \"type\": \"leadId\",\n    \"value\": \"342\"\n  },\n  \"note\": \"Customer requested a callback in the afternoon.\",\n  \"issuer\": {\n    \"name\": \"Maria\",\n    \"lastName\": \"Fernandez\",\n    \"email\": \"maria.fernandez@example.com\"\n  },\n  \"isShareable\": true,\n  \"reference\": \"NOTE-23423\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/note"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"27d9199b-4a6c-470d-bdf5-e0ebba6f9386"},{"name":"Reinstate Lead","id":"c4c831e7-421f-400b-98ba-c613efe8acb5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"lead\": {\n    \"type\": \"leadId\",\n    \"value\": \"252\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/reinstate","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint reinstates a previously cancelled lead. The lead is identified in the request body by either lead ID or lead reference.</p>\n<p>Reinstating a lead rolls it back to its latest non-cancelled status found in lead status history. The lead cancel reason is cleared.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationreinstateleadrequestdto\">Request Body: ExternalIntegrationReinstateLeadRequestDTO</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>lead</code></td>\n<td>ExternalIntegrationLeadIdentifierRequestDTO</td>\n<td>Yes</td>\n<td>Lead identifier object (ID or reference lookup).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationleadidentifierrequestdto\">ExternalIntegrationLeadIdentifierRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of lead identifier. Must be one of: <code>leadId</code> or <code>leadReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The lead ID (if type is <code>leadId</code>) or lead reference (if type is <code>leadReference</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"success-response\">Success 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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>-</td>\n<td>-</td>\n<td>-</td>\n<td><code>200 OK</code>. Lead reinstate operation completed.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h2>\n<ul>\n<li><p>The lead must exist (<code>leadId</code> or <code>leadReference</code> lookup). If not found, the endpoint returns <code>LEAD_NOT_FOUND</code>.</p>\n</li>\n<li><p>The lead must currently be in status <code>CANCELLED</code>. Otherwise, the endpoint returns <code>LEAD_NOT_IN_CANCELLED_STATUS</code>.</p>\n</li>\n<li><p>The lead must have at least one non-cancelled status in <code>lead_status_history</code>. Otherwise, the endpoint returns <code>LEAD_HAS_NO_PREVIOUS_STATUS</code>.</p>\n</li>\n<li><p>On success, the lead status is set to the latest non-cancelled history status and <code>cancelReason</code> is cleared.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"example-request-lead-reference\">Example Request (Lead reference)</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadReference\",\n    \"value\": \"LEAD-EXT-252\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-request-lead-id\">Example Request (Lead id)</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"lead\": {\n    \"type\": \"leadId\",\n    \"value\": \"252\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\n\n</code></pre>\n<h2 id=\"example-error-response-lead-not-found\">Example Error Response: Lead Not Found</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"LEAD_NOT_FOUND\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<h2 id=\"example-error-response-lead-not-in-cancelled-status\">Example Error Response: Lead Not In Cancelled Status</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"LEAD_NOT_IN_CANCELLED_STATUS\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<h2 id=\"example-error-response-no-previous-status\">Example Error Response: No Previous Status</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"LEAD_HAS_NO_PREVIOUS_STATUS\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","lead","reinstate"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"7b74c49f-45c7-4c85-987c-f62808b6f6f5","name":"Reinstate Lead","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"lead\": {\n    \"type\": \"leadId\",\n    \"value\": \"252\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead/reinstate"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"c4c831e7-421f-400b-98ba-c613efe8acb5"}],"id":"37ea4797-00ff-4bf3-9c76-4982c7f95652","_postman_id":"37ea4797-00ff-4bf3-9c76-4982c7f95652","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Work orders","item":[{"name":"Create work order","id":"803330f2-7377-4798-83fa-4593772b8ebc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/work-order","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new work order in Sodtrack linked to a customer, a provider, and a service variant, and associated with a product (and optionally a product unit).</p>\n<p>This endpoint is intended for external systems that manage work-order style operations (e.g. workshop/maintenance) and want to register them in Sodtrack.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧾-request-body\">🧾 Request Body</h4>\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>reference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>External reference for the work order.</td>\n</tr>\n<tr>\n<td><code>customer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Customer basic information.</td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Provider payload.</td>\n</tr>\n<tr>\n<td><code>stakeholder</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>Optional stakeholder payload.</td>\n</tr>\n<tr>\n<td><code>workOrderServiceVariant</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Work-order service variant identifier (by id or sku).</td>\n</tr>\n<tr>\n<td><code>product</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Product identifier (sku, id, or serial number).</td>\n</tr>\n<tr>\n<td><code>executionDateTime</code></td>\n<td><code>string</code> (ISO 8601)</td>\n<td>❌</td>\n<td>Optional execution date/time for the work order.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧍-customer-basic-information\">🧍 Customer (basic information)</h4>\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>customer.name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer’s first name.</td>\n</tr>\n<tr>\n<td><code>customer.lastName</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer’s last name.</td>\n</tr>\n<tr>\n<td><code>customer.phoneType</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Phone type</td>\n</tr>\n<tr>\n<td><code>customer.phoneNumber</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Contact phone number.</td>\n</tr>\n<tr>\n<td><code>customer.email</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer email address.</td>\n</tr>\n<tr>\n<td><code>customer.identificationType</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Identification type.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumber</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>National ID / tax identification number.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>ISO 3166-1 alpha-2 country code.</td>\n</tr>\n<tr>\n<td><code>customer.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External customer reference.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧰-provider\">🧰 Provider</h4>\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>provider.basicInformation</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Provider basic information (same structure as customer basic info).</td>\n</tr>\n<tr>\n<td><code>provider.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External provider reference.</td>\n</tr>\n<tr>\n<td><code>provider.isCompany</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Provider is a company flag.</td>\n</tr>\n<tr>\n<td><code>provider.isMainProviderEligible</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Eligibility flag.</td>\n</tr>\n<tr>\n<td><code>provider.isLeadAssignmentEligible</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Eligibility flag.</td>\n</tr>\n<tr>\n<td><code>provider.workOnHolidays</code></td>\n<td><code>boolean</code></td>\n<td>❌</td>\n<td>Work-on-holidays flag.</td>\n</tr>\n<tr>\n<td><code>provider.parentId</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Parent provider id (when applicable).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧍-stakeholder-optional\">🧍 Stakeholder (optional)</h4>\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>stakeholder.name</code></td>\n<td><code>string</code></td>\n<td>✅ when stakeholder sent</td>\n<td>Stakeholder name.</td>\n</tr>\n<tr>\n<td><code>stakeholder.lastname</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Stakeholder last name.</td>\n</tr>\n<tr>\n<td><code>stakeholder.identificationNumber</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Identification number.</td>\n</tr>\n<tr>\n<td><code>stakeholder.identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Country code for identification number.</td>\n</tr>\n<tr>\n<td><code>stakeholder.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External stakeholder reference.</td>\n</tr>\n<tr>\n<td><code>stakeholder.email</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Stakeholder email.</td>\n</tr>\n<tr>\n<td><code>stakeholder.phone</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Stakeholder phone.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧩-work-order-service-variant\">🧩 Work order service variant</h4>\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>workOrderServiceVariant.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Variant identifier type: <code>\"variantId\"</code> or <code>\"variantSku\"</code>.</td>\n</tr>\n<tr>\n<td><code>workOrderServiceVariant.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Variant id or sku according to the type.</td>\n</tr>\n<tr>\n<td><code>workOrderServiceVariant.quantity</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Quantity (optional).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"📦-product-identifier\">📦 Product identifier</h4>\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>product.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>How the product is identified: <code>\"productSku\"</code>, <code>\"productId\"</code>, or <code>\"productSerialNumber\"</code>.</td>\n</tr>\n<tr>\n<td><code>product.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The SKU, product ID, or serial number according to <code>product.type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request---with-product-unit\"><strong>Example Request - with product unit</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"reference\": \"WO-EXT-0001\",\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"Gómez\",\n    \"phoneNumber\": \"+541155551111\",\n    \"email\": \"maria.gomez@example.com\",\n    \"identificationNumber\": \"23456789\",\n    \"identificationNumberCountry\": \"AR\",\n    \"reference\": \"EXT-CUSTOMER-REF-002\"\n  },\n  \"provider\": {\n    \"basicInformation\": {\n      \"name\": \"Taller Motos Racing SRL\",\n      \"lastName\": \"Sucursal Centro\",\n      \"phoneNumber\": \"+541155552222\",\n      \"email\": \"contacto@motosracing.example.com\",\n      \"identificationNumber\": \"30555111222\",\n      \"identificationNumberCountry\": \"AR\",\n      \"reference\": \"PROV-MOTOS-RACING\"\n    },\n    \"reference\": \"PROV-MOTOS-RACING\",\n    \"isCompany\": true\n  },\n  \"stakeholder\": {\n    \"name\": \"Carlos\",\n    \"lastname\": \"Mecánico\",\n    \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\",\n    \"email\": \"carlos@example.com\",\n    \"phone\": \"+541155553333\"\n  },\n  \"workOrderServiceVariant\": {\n    \"type\": \"variantSku\",\n    \"value\": \"SERVICE-MOTO-10000KM\",\n    \"quantity\": 1\n  },\n  \"product\": {\n    \"type\": \"productSerialNumber\",\n    \"value\": \"VIN-MOTO-NAKED-650-XYZ-1234\"\n  },\n  \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 9001,\n  \"externalReference\": \"WO-EXT-0001\",\n  \"customer\": {\n    \"id\": 2001,\n    \"name\": \"María\",\n    \"last_name\": \"Gómez\",\n    \"email\": \"maria.gomez@motos-example.com\",\n    \"phone\": \"+54 11 5555-1111\",\n    \"reference\": \"EXT-CUSTOMER-REF-002\"\n  },\n  \"provider\": {\n    \"id\": 3001,\n    \"name\": \"Taller Motos Racing SRL\",\n    \"reference\": \"PROV-MOTOS-RACING\",\n    \"tradeName\": \"Motos Racing\"\n  },\n  \"stakeholder\": {\n    \"id\": \"stakeholder-mecanico-01\",\n    \"name\": \"Carlos\",\n    \"lastName\": \"Mecánico\",\n    \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\"\n  },\n  \"workOrderServiceVariant\": {\n    \"id\": 4001,\n    \"reference\": \"SERVICE-MOTO-10000KM\",\n    \"name\": \"Service 10.000 km motocicleta\",\n    \"estimatedDurationMinutes\": 90\n  },\n  \"product\": {\n    \"id\": 5001,\n    \"sku\": \"MOTO-NAKED-650\",\n    \"name\": \"Yamaha MT-07\",\n    \"brand\": \"Yamaha\",\n    \"category\": \"MOTOCICLETA\",\n    \"description\": \"Service completo de motocicleta naked 650cc\"\n  },\n  \"productUnit\": {\n    \"id\": 6001,\n    \"serialNumber\": \"VIN-MOTO-NAKED-650-XYZ-1234\"\n  },\n  \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}\n\n</code></pre>\n<h3 id=\"example-request---with-product\"><strong>Example Request - with product</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"reference\": \"WO-EXT-0001\",\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"Gómez\",\n    \"phoneNumber\": \"+541155551111\",\n    \"email\": \"maria.gomez@example.com\",\n    \"identificationNumber\": \"23456789\",\n    \"identificationNumberCountry\": \"AR\",\n    \"reference\": \"EXT-CUSTOMER-REF-002\"\n  },\n  \"provider\": {\n    \"basicInformation\": {\n      \"name\": \"Taller Motos Racing SRL\",\n      \"lastName\": \"Sucursal Centro\",\n      \"phoneNumber\": \"+541155552222\",\n      \"email\": \"contacto@motosracing.example.com\",\n      \"identificationNumber\": \"30555111222\",\n      \"identificationNumberCountry\": \"AR\",\n      \"reference\": \"PROV-MOTOS-RACING\"\n    },\n    \"reference\": \"PROV-MOTOS-RACING\",\n    \"isCompany\": true\n  },\n  \"stakeholder\": {\n    \"name\": \"Carlos\",\n    \"lastname\": \"Mecánico\",\n    \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\",\n    \"email\": \"carlos@example.com\",\n    \"phone\": \"+541155553333\"\n  },\n  \"workOrderServiceVariant\": {\n    \"type\": \"variantSku\",\n    \"value\": \"SERVICE-MOTO-10000KM\",\n    \"quantity\": 1\n  },\n  \"product\": {\n    \"type\": \"productId\",\n    \"value\": \"5001\"\n  },\n  \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example-1\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 9001,\n  \"externalReference\": \"WO-EXT-0001\",\n  \"customer\": {\n    \"id\": 2001,\n    \"name\": \"María\",\n    \"last_name\": \"Gómez\",\n    \"email\": \"maria.gomez@motos-example.com\",\n    \"phone\": \"+54 11 5555-1111\",\n    \"reference\": \"EXT-CUSTOMER-REF-002\"\n  },\n  \"provider\": {\n    \"id\": 3001,\n    \"name\": \"Taller Motos Racing SRL\",\n    \"reference\": \"PROV-MOTOS-RACING\",\n    \"tradeName\": \"Motos Racing\"\n  },\n  \"stakeholder\": {\n    \"id\": \"stakeholder-mecanico-01\",\n    \"name\": \"Carlos\",\n    \"lastName\": \"Mecánico\",\n    \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\"\n  },\n  \"workOrderServiceVariant\": {\n    \"id\": 4001,\n    \"reference\": \"SERVICE-MOTO-10000KM\",\n    \"name\": \"Service 10.000 km motocicleta\",\n    \"estimatedDurationMinutes\": 90\n  },\n  \"product\": {\n    \"id\": 5001,\n    \"sku\": \"MOTO-NAKED-650\",\n    \"name\": \"Yamaha MT-07\",\n    \"brand\": \"Yamaha\",\n    \"category\": \"MOTOCICLETA\",\n    \"description\": \"Service completo de motocicleta naked 650cc\"\n  },\n  \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}\n\n</code></pre>\n<hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"identifier-patterns\">Identifier patterns</h2>\n<ul>\n<li><p><code>workOrderServiceVariant</code> uses the same variant identifier pattern as other external integration endpoints: <code>variantId</code> or <code>variantSku</code>.</p>\n</li>\n<li><p><code>product</code> uses the external integration product identifier pattern: <code>productSku</code>, <code>productId</code>, or <code>productSerialNumber</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li>All timestamps follow ISO 8601 format (UTC) where applicable.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","work-order"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"b1f1bddb-ed02-4988-9b68-5941d6db67d0","name":"Create work order","originalRequest":{"method":"POST","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"reference\": \"WO-EXT-0001\",\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"Gómez\",\n    \"phoneNumber\": \"+541155551111\",\n    \"email\": \"maria.gomez@example.com\",\n    \"identificationNumber\": \"23456789\",\n    \"identificationNumberCountry\": \"AR\",\n    \"reference\": \"EXT-CUSTOMER-REF-002\"\n  },\n  \"provider\": {\n    \"basicInformation\": {\n      \"name\": \"Taller Motos Racing SRL\",\n      \"lastName\": \"Sucursal Centro\",\n      \"phoneNumber\": \"+541155552222\",\n      \"email\": \"contacto@motosracing.example.com\",\n      \"identificationNumber\": \"30555111222\",\n      \"identificationNumberCountry\": \"AR\",\n      \"reference\": \"PROV-MOTOS-RACING\"\n    },\n    \"reference\": \"PROV-MOTOS-RACING\",\n    \"isCompany\": true\n  },\n  \"stakeholder\": {\n    \"name\": \"Carlos\",\n    \"lastname\": \"Mecánico\",\n    \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\",\n    \"email\": \"carlos@example.com\",\n    \"phone\": \"+541155553333\"\n  },\n  \"workOrderServiceVariant\": {\n    \"type\": \"variantSku\",\n    \"value\": \"SERVICE-MOTO-10000KM\",\n    \"quantity\": 1\n  },\n  \"product\": {\n    \"type\": \"productSerialNumber\",\n    \"value\": \"VIN-MOTO-NAKED-650-XYZ-1234\"\n  },\n  \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}\n","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/work-order"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 9001,\n    \"externalReference\": \"WO-EXT-0001\",\n    \"customer\": {\n        \"id\": 2001,\n        \"name\": \"María\",\n        \"last_name\": \"Gómez\",\n        \"email\": \"maria.gomez@motos-example.com\",\n        \"phone\": \"+54 11 5555-1111\",\n        \"reference\": \"EXT-CUSTOMER-REF-002\"\n    },\n    \"provider\": {\n        \"id\": 3001,\n        \"name\": \"Taller Motos Racing SRL\",\n        \"reference\": \"PROV-MOTOS-RACING\",\n        \"tradeName\": \"Motos Racing\"\n    },\n    \"stakeholder\": {\n        \"id\": \"stakeholder-mecanico-01\",\n        \"name\": \"Carlos\",\n        \"lastName\": \"Mecánico\",\n        \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\"\n    },\n    \"workOrderServiceVariant\": {\n        \"id\": 4001,\n        \"reference\": \"SERVICE-MOTO-10000KM\",\n        \"name\": \"Service 10.000 km motocicleta\",\n        \"estimatedDurationMinutes\": 90\n    },\n    \"product\": {\n        \"id\": 5001,\n        \"sku\": \"MOTO-NAKED-650\",\n        \"name\": \"Yamaha MT-07\",\n        \"brand\": \"Yamaha\",\n        \"category\": \"MOTOCICLETA\",\n        \"description\": \"Service completo de motocicleta naked 650cc\"\n    },\n    \"productUnit\": {\n        \"id\": 6001,\n        \"serialNumber\": \"VIN-MOTO-NAKED-650-XYZ-1234\"\n    },\n    \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}"},{"id":"c86a77b1-922a-4a2c-8e6d-7bef81f669e1","name":"Create work order with product","originalRequest":{"method":"POST","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"reference\": \"WO-EXT-0001\",\n  \"customer\": {\n    \"name\": \"María\",\n    \"lastName\": \"Gómez\",\n    \"phoneNumber\": \"+541155551111\",\n    \"email\": \"maria.gomez@example.com\",\n    \"identificationNumber\": \"23456789\",\n    \"identificationNumberCountry\": \"AR\",\n    \"reference\": \"EXT-CUSTOMER-REF-002\"\n  },\n  \"provider\": {\n    \"basicInformation\": {\n      \"name\": \"Taller Motos Racing SRL\",\n      \"lastName\": \"Sucursal Centro\",\n      \"phoneNumber\": \"+541155552222\",\n      \"email\": \"contacto@motosracing.example.com\",\n      \"identificationNumber\": \"30555111222\",\n      \"identificationNumberCountry\": \"AR\",\n      \"reference\": \"PROV-MOTOS-RACING\"\n    },\n    \"reference\": \"PROV-MOTOS-RACING\",\n    \"isCompany\": true\n  },\n  \"stakeholder\": {\n    \"name\": \"Carlos\",\n    \"lastname\": \"Mecánico\",\n    \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\",\n    \"email\": \"carlos@example.com\",\n    \"phone\": \"+541155553333\"\n  },\n  \"workOrderServiceVariant\": {\n    \"type\": \"variantSku\",\n    \"value\": \"SERVICE-MOTO-10000KM\",\n    \"quantity\": 1\n  },\n  \"product\": {\n    \"type\": \"productId\",\n    \"value\": \"5001\"\n  },\n  \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/work-order"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 9001,\n    \"externalReference\": \"WO-EXT-0001\",\n    \"customer\": {\n        \"id\": 2001,\n        \"name\": \"María\",\n        \"last_name\": \"Gómez\",\n        \"email\": \"maria.gomez@motos-example.com\",\n        \"phone\": \"+54 11 5555-1111\",\n        \"reference\": \"EXT-CUSTOMER-REF-002\"\n    },\n    \"provider\": {\n        \"id\": 3001,\n        \"name\": \"Taller Motos Racing SRL\",\n        \"reference\": \"PROV-MOTOS-RACING\",\n        \"tradeName\": \"Motos Racing\"\n    },\n    \"stakeholder\": {\n        \"id\": \"stakeholder-mecanico-01\",\n        \"name\": \"Carlos\",\n        \"lastName\": \"Mecánico\",\n        \"reference\": \"MECHANIC-CARLOS-MOTOS-RACING\"\n    },\n    \"workOrderServiceVariant\": {\n        \"id\": 4001,\n        \"reference\": \"SERVICE-MOTO-10000KM\",\n        \"name\": \"Service 10.000 km motocicleta\",\n        \"estimatedDurationMinutes\": 90\n    },\n    \"product\": {\n        \"id\": 5001,\n        \"sku\": \"MOTO-NAKED-650\",\n        \"name\": \"Yamaha MT-07\",\n        \"brand\": \"Yamaha\",\n        \"category\": \"MOTOCICLETA\",\n        \"description\": \"Service completo de motocicleta naked 650cc\"\n    },\n    \"executionDateTime\": \"2026-03-03T15:30:00.000Z\"\n}"}],"_postman_id":"803330f2-7377-4798-83fa-4593772b8ebc"}],"id":"7dd0b798-23de-4eb0-a44d-28b8fc51f894","_postman_id":"7dd0b798-23de-4eb0-a44d-28b8fc51f894","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Product","item":[{"name":"Create product","id":"5dd51dd9-f1db-457f-92c6-9d83fdd4f335","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new product in Sodtrack using an external integration.</p>\n<p>This endpoint is typically used to keep the Sodtrack catalog synchronized with an external product source by creating products by <strong>SKU</strong> and basic descriptive fields.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧾-request-body\">🧾 Request Body</h4>\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>sku</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Product SKU (unique identifier from the external system).</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Product name.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Product description.</td>\n</tr>\n<tr>\n<td><code>category</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Product category name.</td>\n</tr>\n<tr>\n<td><code>brand</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Product brand name.</td>\n</tr>\n<tr>\n<td><code>tags</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional list of tags to associate with the product.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🏷️-tag\">🏷️ Tag</h4>\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>tags[].name</code></td>\n<td><code>string</code></td>\n<td>✅ when tag sent</td>\n<td>Tag display name.</td>\n</tr>\n<tr>\n<td><code>tags[].value</code></td>\n<td><code>string</code></td>\n<td>✅ when tag sent</td>\n<td>Tag value (external identifier/value).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\"><strong>Example Request</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"sku\": \"MOTO-ADV-790\",\n  \"name\": \"KTM Adventure 790\",\n  \"description\": \"Moto adventure para rutas y ciudad\",\n  \"category\": \"MOTOCICLETA\",\n  \"brand\": \"KTM\",\n  \"tags\": [\n    { \"name\": \"segment\", \"value\": \"adventure\" },\n    { \"name\": \"engine_cc\", \"value\": \"790\" }\n  ]\n}\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 7001,\n  \"sku\": \"MOTO-ADV-790\",\n  \"name\": \"KTM Adventure 790\",\n  \"description\": \"Moto adventure para rutas y ciudad\",\n  \"category\": \"MOTOCICLETA\",\n  \"brand\": \"KTM\",\n  \"type\": \"product\"\n}\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Product ID in Sodtrack.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td><code>string</code></td>\n<td>Product SKU.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td><code>string</code></td>\n<td>Product name.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>Product description.</td>\n</tr>\n<tr>\n<td><code>category</code></td>\n<td><code>string</code></td>\n<td>Product category.</td>\n</tr>\n<tr>\n<td><code>brand</code></td>\n<td><code>string</code></td>\n<td>Product brand.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td><code>string</code></td>\n<td>Product type: <code>product</code> or <code>component</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","product"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"fa24e12e-273f-4719-b948-5a8f8dba7c3b","name":"Create product","originalRequest":{"method":"POST","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"sku\": \"MOTO-ADV-790\",\n  \"name\": \"KTM Adventure 790\",\n  \"description\": \"Moto adventure para rutas y ciudad\",\n  \"category\": \"MOTOCICLETA\",\n  \"brand\": \"KTM\",\n  \"tags\": [\n    { \"name\": \"segment\", \"value\": \"adventure\" },\n    { \"name\": \"engine_cc\", \"value\": \"790\" }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 7001,\n    \"sku\": \"MOTO-ADV-790\",\n    \"name\": \"KTM Adventure 790\",\n    \"description\": \"Moto adventure para rutas y ciudad\",\n    \"category\": \"MOTOCICLETA\",\n    \"brand\": \"KTM\",\n    \"type\": \"product\"\n}"}],"_postman_id":"5dd51dd9-f1db-457f-92c6-9d83fdd4f335"},{"name":"Update product","id":"a63f410e-05e4-4557-ab57-8527fadbc64f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Updates an existing product in Sodtrack.</p>\n<p>The target product is identified by a polymorphic identifier object (<code>product</code>) using either <strong>SKU</strong>, <strong>product id</strong>, or <strong>serial number</strong>, depending on <code>product.type</code>.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧾-request-body\">🧾 Request Body</h4>\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>product</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Product identifier object (SKU, id, or serial number).</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Updated product name.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Updated description.</td>\n</tr>\n<tr>\n<td><code>category</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Updated category.</td>\n</tr>\n<tr>\n<td><code>brand</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Updated brand.</td>\n</tr>\n<tr>\n<td><code>tags</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Updated tags list (when provided).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🎯-product-identifier\">🎯 Product Identifier</h4>\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>product.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>How the product is identified: <code>\"productSku\"</code>, <code>\"productId\"</code>, or <code>\"productSerialNumber\"</code>.</td>\n</tr>\n<tr>\n<td><code>product.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The SKU, product ID, or serial number according to <code>product.type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request-by-sku\"><strong>Example Request (by SKU)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"product\": {\n    \"type\": \"productSku\",\n    \"value\": \"MOTO-ADV-790\"\n  },\n  \"name\": \"KTM Adventure 790 (Updated)\",\n  \"description\": \"Actualización de descripción\",\n  \"category\": \"MOTOCICLETA\",\n  \"brand\": \"KTM\",\n  \"tags\": [\n    { \"name\": \"segment\", \"value\": \"adventure\" }\n  ]\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 8001,\n  \"sku\": \"MOTO-ADV-790\",\n  \"name\": \"KTM Adventure 790 (Updated)\",\n  \"description\": \"Actualización de descripción\",\n  \"category\": \"MOTOCICLETA\",\n  \"brand\": \"KTM\",\n  \"type\": \"product\"\n}\n\n</code></pre>\n<hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"identifier-resolution\">Identifier resolution</h2>\n<ul>\n<li>For update, <code>product.type</code> determines how the product is resolved:<ul>\n<li><p><code>productSku</code>: resolve by SKU</p>\n</li>\n<li><p><code>productId</code>: resolve by numeric ID</p>\n</li>\n<li><p><code>productSerialNumber</code>: resolve by unit serial number</p>\n</li>\n</ul>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li>All timestamps follow ISO 8601 format (UTC) where applicable.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","product"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"106e55c4-7c08-4049-aa25-ce56e0e67b34","name":"Update product","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"product\": {\n    \"type\": \"productSku\",\n    \"value\": \"MOTO-ADV-790\"\n  },\n  \"name\": \"KTM Adventure 790 (Updated)\",\n  \"description\": \"Actualización de descripción\",\n  \"category\": \"MOTOCICLETA\",\n  \"brand\": \"KTM\",\n  \"tags\": [\n    { \"name\": \"segment\", \"value\": \"adventure\" }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 8001,\n    \"sku\": \"MOTO-ADV-790\",\n    \"name\": \"KTM Adventure 790 (Updated)\",\n    \"description\": \"Actualización de descripción\",\n    \"category\": \"MOTOCICLETA\",\n    \"brand\": \"KTM\",\n    \"type\": \"product\"\n}"}],"_postman_id":"a63f410e-05e4-4557-ab57-8527fadbc64f"},{"name":"Update product area","id":"5f9e4c77-2592-4c5c-990b-1f55f89bd47f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product-area","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Updates the list of areas and prices per area associated with a product.</p>\n<p>The target product is identified by a polymorphic identifier object (<code>product</code>). The request then provides an array of <code>areas</code>, each identifying an area (by id or reference) and its <code>price</code>.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧾-request-body\">🧾 Request Body</h4>\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>product</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Product identifier object.</td>\n</tr>\n<tr>\n<td><code>areas</code></td>\n<td><code>array[object]</code></td>\n<td>✅</td>\n<td>List of areas to apply to the product.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🎯-product-identifier\">🎯 Product Identifier</h4>\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>product.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>How the product is identified: <code>\"productSku\"</code>, <code>\"productId\"</code>, or <code>\"productSerialNumber\"</code>.</td>\n</tr>\n<tr>\n<td><code>product.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The SKU, product ID, or serial number according to <code>product.type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🗺️-area-entry\">🗺️ Area Entry</h4>\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>areas[].type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>How the area is identified: <code>\"areaId\"</code> or <code>\"areaReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>areas[].value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Area ID or area reference, according to <code>areas[].type</code>.</td>\n</tr>\n<tr>\n<td><code>areas[].price</code></td>\n<td><code>number</code></td>\n<td>✅</td>\n<td>Price for this product in this area.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\"><strong>Example Request</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"product\": {\n    \"type\": \"productSku\",\n    \"value\": \"MOTO-REPUESTO-AREA-0001\"\n  },\n  \"areas\": [\n    { \"type\": \"areaReference\", \"value\": \"AREA-MOTO-1\", \"price\": 15000 },\n    { \"type\": \"areaReference\", \"value\": \"AREA-MOTO-2\", \"price\": 17500 }\n  ]\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 9001,\n  \"sku\": \"MOTO-REPUESTO-AREA-0001\",\n  \"name\": \"Coberturas por área para servicio de motocicleta\",\n  \"description\": \"Mock de áreas y precios por zona para servicios de motos\",\n  \"category\": \"SERVICIO_MOTO\",\n  \"brand\": \"Marca Mock Motos\",\n  \"type\": \"product\",\n  \"areas\": [\n    {\n      \"id\": 10000,\n      \"price\": 15000,\n      \"area\": {\n        \"id\": 20000,\n        \"name\": \"Zona servicio moto 1\",\n        \"reference\": \"AREA-MOTO-1\",\n        \"currency\": {\n          \"id\": 1,\n          \"code\": \"ARS\",\n          \"name\": \"Peso argentino\",\n          \"symbol\": \"$\"\n        }\n      }\n    }\n  ]\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Product ID.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td><code>string</code></td>\n<td>Product SKU.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td><code>string</code></td>\n<td>Product name.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>Product description.</td>\n</tr>\n<tr>\n<td><code>category</code></td>\n<td><code>string</code></td>\n<td>Product category.</td>\n</tr>\n<tr>\n<td><code>brand</code></td>\n<td><code>string</code></td>\n<td>Product brand.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td><code>string</code></td>\n<td>Product type: <code>product</code> or <code>component</code>.</td>\n</tr>\n<tr>\n<td><code>areas</code></td>\n<td><code>array[object]</code></td>\n<td>Updated areas list for the product.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"areas-application\">Areas application</h2>\n<ul>\n<li><p>The request provides the <code>areas</code> list to be applied to the product. Depending on configuration, this may replace or update the current list of areas.</p>\n</li>\n<li><p><code>areas[].price</code> is interpreted in the area’s configured currency.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li>All timestamps follow ISO 8601 format (UTC) where applicable.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","product-area"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"42d3d5e4-f708-4382-b370-f906e56056c6","name":"Update product area","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"product\": {\n    \"type\": \"productSku\",\n    \"value\": \"MOTO-REPUESTO-AREA-0001\"\n  },\n  \"areas\": [\n    { \"type\": \"areaReference\", \"value\": \"AREA-MOTO-1\", \"price\": 15000 },\n    { \"type\": \"areaReference\", \"value\": \"AREA-MOTO-2\", \"price\": 17500 }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product-area"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 9001,\n    \"sku\": \"MOTO-REPUESTO-AREA-0001\",\n    \"name\": \"Coberturas por área para servicio de motocicleta\",\n    \"description\": \"Mock de áreas y precios por zona para servicios de motos\",\n    \"category\": \"SERVICIO_MOTO\",\n    \"brand\": \"Marca Mock Motos\",\n    \"type\": \"product\",\n    \"areas\": [\n        {\n            \"id\": 10000,\n            \"price\": 15000,\n            \"area\": {\n                \"id\": 20000,\n                \"name\": \"Zona servicio moto 1\",\n                \"reference\": \"AREA-MOTO-1\",\n                \"currency\": {\n                    \"id\": 1,\n                    \"code\": \"ARS\",\n                    \"name\": \"Peso argentino\",\n                    \"symbol\": \"$\"\n                }\n            }\n        }\n    ]\n}"}],"_postman_id":"5f9e4c77-2592-4c5c-990b-1f55f89bd47f"}],"id":"018a9698-2a2e-42f5-ac07-de504f458239","_postman_id":"018a9698-2a2e-42f5-ac07-de504f458239","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Acquisition","item":[{"name":"Create acquisition","id":"5fccd666-1127-4a05-9509-a049568a34fa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/acquisition","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new acquisition in Sodtrack linked to a customer, a serial number, and an area.</p>\n<p>This endpoint also supports optional <strong>dynamic forms</strong> data, which can be used to capture additional structured information alongside the acquisition.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"🧾-request-body\">🧾 Request Body</h4>\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>customer</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Customer information for the acquisition.</td>\n</tr>\n<tr>\n<td><code>acquisitionDate</code></td>\n<td><code>string</code> (ISO 8601)</td>\n<td>✅</td>\n<td>Acquisition date/time.</td>\n</tr>\n<tr>\n<td><code>serialNumber</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Serial number / VIN / unique unit identifier.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>External reference for the acquisition (from the integrating system).</td>\n</tr>\n<tr>\n<td><code>dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional form data (if configured in Sodtrack).</td>\n</tr>\n<tr>\n<td><code>area</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Area identifier (by ID or reference).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🧍-customer\">🧍 Customer</h4>\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>customer.name</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer’s first name.</td>\n</tr>\n<tr>\n<td><code>customer.lastName</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer’s last name.</td>\n</tr>\n<tr>\n<td><code>customer.phoneType</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Phone type.</td>\n</tr>\n<tr>\n<td><code>customer.phoneNumber</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Contact phone number.</td>\n</tr>\n<tr>\n<td><code>customer.email</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Customer email address.</td>\n</tr>\n<tr>\n<td><code>customer.identificationType</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Identification type.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumber</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>National ID / tax identification number.</td>\n</tr>\n<tr>\n<td><code>customer.identificationNumberCountry</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>ISO 3166-1 alpha-2 country code.</td>\n</tr>\n<tr>\n<td><code>customer.reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External customer reference.</td>\n</tr>\n<tr>\n<td><code>customer.dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional form data (if configured in Sodtrack).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"🗺️-area-identifier\">🗺️ Area identifier</h4>\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>area.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>How the area is identified: <code>\"areaId\"</code> or <code>\"areaReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>area.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Area ID (if <code>type = \"areaId\"</code>) or area reference (if <code>type = \"areaReference\"</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\"><strong>Example Request</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"customer\": {\n    \"name\": \"Juan\",\n    \"lastName\": \"Pérez\",\n    \"phoneNumber\": \"+541155550000\",\n    \"email\": \"juan.perez@example.com\",\n    \"identificationNumber\": \"12345678\",\n    \"identificationNumberCountry\": \"AR\",\n    \"reference\": \"EXT-CUSTOMER-REF-001\"\n  },\n  \"acquisitionDate\": \"2026-03-03T12:00:00.000Z\",\n  \"serialNumber\": \"VIN-MOTO-XYZ-0001\",\n  \"reference\": \"ACQ-EXT-0001\",\n  \"area\": {\n    \"type\": \"areaReference\",\n    \"value\": \"AREA-MOTO-1\"\n  },\n  \"dynamicForms\": [\n    {\n      \"formReference\": \"acquisition_form\",\n      \"values\": [\n        { \"fieldReference\": \"purchase_channel\", \"value\": \"online\" },\n        { \"fieldReference\": \"comments\", \"value\": \"Entrega coordinada con cliente\" }\n      ]\n    }\n  ]\n}\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 1,\n  \"customer\": {\n    \"id\": 1001,\n    \"name\": \"Juan\",\n    \"last_name\": \"Pérez\",\n    \"email\": \"juan.perez@motos-example.com\",\n    \"phone\": \"+54 11 5555-0000\",\n    \"reference\": \"EXT-CUSTOMER-REF-001\"\n  },\n  \"acquisitionDate\": \"2026-03-03T12:00:00.000Z\",\n  \"productUnit\": {\n    \"id\": 501,\n    \"serialNumber\": \"VIN-MOTO-XYZ-0001\",\n    \"product\": {\n      \"id\": 300,\n      \"sku\": \"MOTO-ADV-790\",\n      \"name\": \"KTM Adventure 790\",\n      \"brand\": \"KTM\",\n      \"category\": \"MOTOCICLETA\",\n      \"description\": \"Moto adventure para rutas y ciudad\"\n    }\n  }\n}\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Acquisition ID.</td>\n</tr>\n<tr>\n<td><code>customer</code></td>\n<td><code>object</code></td>\n<td>Customer associated with the acquisition.</td>\n</tr>\n<tr>\n<td><code>acquisitionDate</code></td>\n<td><code>string</code> (ISO 8601)</td>\n<td>Acquisition date/time.</td>\n</tr>\n<tr>\n<td><code>productUnit</code></td>\n<td><code>object</code></td>\n<td>Product unit created/linked by the acquisition (when applicable).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"dynamic-forms\">Dynamic forms</h2>\n<ul>\n<li>When <code>dynamicForms</code> is provided, form references and field references must match the configuration for the acquisition flow in Sodtrack.</li>\n<li>Field values are stored as strings; numeric values are accepted and converted to string.</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li>All timestamps follow ISO 8601 format (UTC) where applicable.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","acquisition"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"e2729269-ff96-48e0-a5d3-bb9ed49ed774","name":"Create acquisition","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"customer\": {\n    \"name\": \"Juan\",\n    \"lastName\": \"Pérez\",\n    \"phoneNumber\": \"+541155550000\",\n    \"email\": \"juan.perez@example.com\",\n    \"identificationNumber\": \"12345678\",\n    \"identificationNumberCountry\": \"AR\",\n    \"reference\": \"EXT-CUSTOMER-REF-001\"\n  },\n  \"acquisitionDate\": \"2026-03-03T12:00:00.000Z\",\n  \"serialNumber\": \"VIN-MOTO-XYZ-0001\",\n  \"reference\": \"ACQ-EXT-0001\",\n  \"area\": {\n    \"type\": \"areaReference\",\n    \"value\": \"AREA-MOTO-1\"\n  },\n  \"dynamicForms\": [\n    {\n      \"formReference\": \"acquisition_form\",\n      \"values\": [\n        { \"fieldReference\": \"purchase_channel\", \"value\": \"online\" },\n        { \"fieldReference\": \"comments\", \"value\": \"Entrega coordinada con cliente\" }\n      ]\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/acquisition"},"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"5fccd666-1127-4a05-9509-a049568a34fa"}],"id":"800b333d-5ee2-4641-b32d-cabb623bc505","_postman_id":"800b333d-5ee2-4641-b32d-cabb623bc505","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Transactions","item":[{"name":"Create Transaction","id":"7890c784-9696-4c92-ad46-3702ab15c9cf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"type\": \"string\", // Possible values: payment | refund\n    \"extra_info\": \"string\", // ej. \"Payment from client in store\"\n    \"reference\": \"string\", // external reference, like: invoice number, credit note number or others.\n    \"booking\": {\n        \"type\": \"string\", // bookingReference | bookingId\n        \"value\": \"string\", // value of the type\n        \"variant\": {\n            \"type\": \"string\",\n            \"value\": \"string\"\n        }\n    },\n    \"transactionDetail\": {\n        \"variant\": {\n            \"quantityAdjustment\": \"number\", //Optional. Only applies to refund type of the transaction. A decimal number greater than 0 less or equals than the total quantity of the variant of the booking  \n            \"amount\": \"number\" //decimal number greater than 0 less or equals than the total price of the variant\n        },\n        \"addon\": [\n            {\n                \"type\": \"string\", // Possible values: addonId | addonReference\n                \"value\": \"string\", // value of the type\n                \"quantityAdjustment\": \"number\", //Optional. Only applies to refund type of the transaction. A decimal number greater than 0 less or equals than the total quantity of the addon of the booking  \n                \"amount\": \"number\" //decimal number greater than 0 less or equals than the total price of the addon\n            }\n        ]\n    },\n    \"cancelBookingIfTotallyRefunded\": \"boolean\" // If transaction type is refund and is a total refund, the booking will be canceled after the refund creation.\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/transaction","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a transaction (payment or refund) associated with a booking. Optionally breaks down amounts by variant (main service) and addons. The shopping cart is determined from the specified booking.</p>\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"booking\">Booking</h4>\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>booking</td>\n<td>object</td>\n<td>✅</td>\n<td>Object that identifies the booking</td>\n</tr>\n<tr>\n<td>booking.type</td>\n<td>enum</td>\n<td>✅</td>\n<td>Identifier: bookingId, bookingReference, shoppingCartId, subscriptionId</td>\n</tr>\n<tr>\n<td>booking.value</td>\n<td>string</td>\n<td>✅</td>\n<td>Value by type (numeric ID or reference)</td>\n</tr>\n<tr>\n<td>booking.variant</td>\n<td>object</td>\n<td>❌</td>\n<td>Variant information to specify if booking referene is used</td>\n</tr>\n<tr>\n<td>booking.variant.type</td>\n<td>string</td>\n<td>✅</td>\n<td>Identifier: variantId or variantSku</td>\n</tr>\n<tr>\n<td>booking.variant.value</td>\n<td>string</td>\n<td>✅</td>\n<td>Value by type (numeric ID or reference)</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"transaction-detail\">Transaction Detail</h4>\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>transactionDetail</td>\n<td>object</td>\n<td>❌</td>\n<td>Breakdown by variant and addons</td>\n</tr>\n<tr>\n<td>transactionDetail.variant</td>\n<td>object</td>\n<td>✅</td>\n<td>Variant details</td>\n</tr>\n<tr>\n<td>transactionDetail.variant.ammount</td>\n<td>number</td>\n<td>✅</td>\n<td>Variant amount</td>\n</tr>\n<tr>\n<td>transactionDetail.variant.quantityAdjustment</td>\n<td>number</td>\n<td>❌</td>\n<td>Variant quantity adjustment</td>\n</tr>\n<tr>\n<td>transactionDetail.addon</td>\n<td>array</td>\n<td>❌</td>\n<td>Addons array</td>\n</tr>\n<tr>\n<td>transactionDetail.addon[].type</td>\n<td>enum</td>\n<td>✅</td>\n<td>addonId or addonReference</td>\n</tr>\n<tr>\n<td>transactionDetail.addon[].value</td>\n<td>string</td>\n<td>✅</td>\n<td>Addon ID or SKU</td>\n</tr>\n<tr>\n<td>transactionDetail.addon[].ammount</td>\n<td>number</td>\n<td>❌</td>\n<td>Addon amount</td>\n</tr>\n<tr>\n<td>transactionDetail.addon[].quantityAdjustment</td>\n<td>number</td>\n<td>❌</td>\n<td>Addon quantity adjustment</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"metadata\">Metadata</h4>\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>type</td>\n<td>enum</td>\n<td>✅</td>\n<td>Transaction type: payment or refund</td>\n</tr>\n<tr>\n<td>reference</td>\n<td>string</td>\n<td>❌</td>\n<td>External reference</td>\n</tr>\n<tr>\n<td>extraInfo</td>\n<td>string</td>\n<td>❌</td>\n<td>Additional info</td>\n</tr>\n<tr>\n<td>cancelBookingIfTotallyRefunded</td>\n<td>boolean</td>\n<td>❌</td>\n<td>Defines cancel policy for total refund of a booking</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 346,\n    \"type\": \"refund\",\n    \"reference\": \"NR-00000000003\",\n    \"amount\": 5000\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Unique Sodtrack transaction ID.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td><code>number</code></td>\n<td>Transaction type: payment or refund</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>External reference</td>\n</tr>\n<tr>\n<td><code>ammount</code></td>\n<td><code>number</code></td>\n<td>Total transaction amount</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"business-logic-notes\"><strong>Business Logic Notes</strong></h3>\n<ul>\n<li><p>If transaction type is refund and cancelBookingIfTotallyRefunded is set to true:</p>\n<ul>\n<li>If the refund is for the total payment amount of the booking, it will cancel the booking after the transaction creation.</li>\n</ul>\n</li>\n<li><p>The quantityAdjustment only works for refund type transactions with the following constraints:</p>\n<ul>\n<li><p>The quantityAdjustment for the booking's variant, has always to be less than the quantity of the booking.</p>\n</li>\n<li><p>The quantityAdjustmen for an addon has to be equal or less than the quantity of that addon in the booking.</p>\n</li>\n</ul>\n</li>\n<li><p>Constraints:</p>\n<ul>\n<li><p>A payment cannot exeed the amount that remains unpaid for each element; variant or addon.</p>\n</li>\n<li><p>In order to post a refund, there should exist a previous payment transaction.</p>\n<ul>\n<li>The amount of a refund cannot exceed the already payed amount for each instance.</li>\n</ul>\n</li>\n<li><p>The quantity of a booking variant cannot be 0 as a result of the transaction.</p>\n</li>\n<li><p>The quantity of a booking addon can go to 0, eliminating the relation between addon and booking.</p>\n</li>\n</ul>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","transaction"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"a687f8b6-af32-4d69-8b61-4da10597eff4","name":"Payment","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n   \"type\":\"payment\",\n   \"extra_info\":\"Payment of client\",\n   \"reference\":\"TRX_12223114217\",\n   \"booking\": {\n      \"type\": \"bookingId\",\n       \"value\": 282\n    },\n    \"transactionDetail\": {\n       \"variant\": {\n           \"quantityAdjustment\": 0, \n           \"amount\": 10000 \n       },\n       \"addon\":[{\n            \"type\": \"addonReference\",\n            \"value\": \"0000903942\",\n            \"quantityAdjustment\": 0, \n            \"amount\": 10000\n       }]\n   },\n   \"cancelBookingIfTotallyRefunded\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/transaction"},"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":null},{"id":"56fffbf0-33b9-4a39-93f4-90a9b9232a8e","name":"Refund","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n   \"type\":\"refund\",\n   \"extra_info\":\"Client request for refund\",\n   \"reference\":\"TRX_12223114219\",\n   \"booking\": {\n      \"type\": \"bookingId\",\n       \"value\": 282\n    },\n    \"transactionDetail\": {\n       \"variant\": {\n           \"quantityAdjustment\": 0, \n           \"amount\": 10000 \n       },\n       \"addon\":[{\n            \"quantityAdjustment\": 0,\n            \"type\": \"addonReference\",\n            \"value\": \"0000903942\",\n            \"amount\": 10000\n       }]\n   },\n   \"cancelBookingIfTotallyRefunded\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/transaction"},"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":null}],"_postman_id":"7890c784-9696-4c92-ad46-3702ab15c9cf"}],"id":"186f50f6-94e6-4ae2-8297-b0223763d5b1","_postman_id":"186f50f6-94e6-4ae2-8297-b0223763d5b1","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Payment requests","item":[{"name":"Change Status","id":"24d4828e-8a66-4e80-b115-ec193dde4135","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/payment-request/change-status","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint updates the status of a payment request. The payment request can be identified by its internal ID or by its external reference. It is intended for use by external integration systems to sync payment state (e.g. mark as paid or cancelled).</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body\">Request Body:</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>paymentRequest</td>\n<td>PaymentRequestIdentifierDto</td>\n<td>Yes</td>\n<td>Object identifying the payment request by ID or reference.</td>\n</tr>\n<tr>\n<td>status</td>\n<td>enum</td>\n<td>Yes</td>\n<td>New status. Must be one of: pending, paid, cancelled.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"paymentrequestidentifierdto\">PaymentRequestIdentifierDto</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>type</td>\n<td>enum</td>\n<td>Yes</td>\n<td>Identifier type. Must be one of: paymentRequestId or paymentRequestReference.</td>\n</tr>\n<tr>\n<td>value</td>\n<td>string</td>\n<td>Yes</td>\n<td>The payment request ID (if type is paymentRequestId) or reference (if type is paymentRequestReference).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"paymentRequest\": {\n    \"type\": \"paymentRequestId\",\n    \"value\": \"342\"\n  },\n  \"status\": \"cancelled\"\n}\n\n</code></pre>\n<p>Or by reference:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"paymentRequest\": {\n    \"type\": \"paymentRequestId\",\n    \"value\": \"PAY-EXT-001\"\n  },\n  \"status\": \"cancelled\"\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<p>Success (200 OK): Returns the updated payment request.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"342\",\n  \"status\": \"paid\",\n  \"entityType\": \"lead\",\n  \"entityTypeId\": 123,\n  \"amount\": 150.50,\n  \"description\": \"Lead payment\",\n  \"reference\": \"PAY-EXT-001\",\n  \"createdDate\": \"2025-02-01T10:00:00.000Z\",\n  \"updatedDate\": \"2025-02-12T14:30:00.000Z\",\n  \"currency\": {\n    \"id\": \"8\",\n    \"code\": \"USD\",\n    \"symbol\": \"$\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-error-response\">Example Error Response</h2>\n<p>Payment request not found (404 Not Found):</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 404,\n  \"message\": \"PAYMENT_REQUEST_NOT_FOUND\",\n  \"error\": \"Not Found\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","payment-request","change-status"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"50814287-5a0e-468e-86c2-fb04425b34b0","name":"Change Status","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"paymentRequest\": {\n    \"type\": \"paymentRequestId\",\n    \"value\": \"PAY-EXT-001\"\n  },\n  \"status\": \"cancelled\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/payment-request/change-status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": \"342\",\n    \"status\": \"paid\",\n    \"entityType\": \"lead\",\n    \"entityTypeId\": 123,\n    \"amount\": 150.5,\n    \"description\": \"Lead payment\",\n    \"reference\": \"PAY-EXT-001\",\n    \"createdDate\": \"2025-02-01T10:00:00.000Z\",\n    \"updatedDate\": \"2025-02-12T14:30:00.000Z\",\n    \"currency\": {\n        \"id\": \"8\",\n        \"code\": \"USD\",\n        \"symbol\": \"$\"\n    }\n}"}],"_postman_id":"24d4828e-8a66-4e80-b115-ec193dde4135"}],"id":"a86dfb3e-e8a5-4814-b668-c7b7019171e0","_postman_id":"a86dfb3e-e8a5-4814-b668-c7b7019171e0","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Users","item":[{"name":"Providers","item":[{"name":"Create provider","id":"988b6df7-6d4a-4916-8610-6b9b265d068d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"dev.api.cl.sodtrack.sodtrack.com","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"basicInformation\":{\n        \"name\":\"John\",\n        \"lastName\":\"Contractor\",\n        \"email\":\"johncontractor@gmail.com\",\n        \"phoneNumber\":\"+56978993325\",\n        \"identificationNumber\":\"19081637-0\",\n        \"identificationNumberCountry\":\"CL\"\n        },\n    \"reference\":\"A244923DSR\",\n    \"workOnHolidays\":false,\n    \"isCompany\":true,\n    \"isMainProviderEligible\":true,\n    \"isLeadAssignmentEligible\":true\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider","description":"<ul>\n<li><p><code>basicInformation (object) - required</code><strong><code>:</code></strong> Objetc that represent the main information of the user</p>\n<ul>\n<li><p><code>name (string) - required</code>: Name of the technician or network</p>\n</li>\n<li><p><code>lastName (string) - required</code>: Lastname of the technician or network</p>\n</li>\n<li><p><code>email (string) - required</code>: Access email for the technician or network to the platforms</p>\n</li>\n<li><p><code>phoneNumber (string) - required</code>: Phone number</p>\n</li>\n<li><p><code>identificationNumber (string) - required</code>: Fiscal number of the the technician or network</p>\n</li>\n<li><p><code>identificationNumberCountry (string) - required</code>: ISO-2 country string</p>\n</li>\n</ul>\n</li>\n<li><p><code>isCompany (boolean) - required</code>: true if it is a network false if it is a single technician.</p>\n</li>\n<li><p><code>workOnHolidays (boolean)</code>: If the avaialbility algorithm should take into account the general holidays as holidays for this provider</p>\n</li>\n<li><p><code>isMainProviderEligible (boolean)</code>: Select if the technitian is elleggible to be main provider of projects</p>\n</li>\n<li><p><code>isLeadAssignmentEligible (boolean)</code>: Select if the technitian is elleggible to be main provider of leads.</p>\n</li>\n<li><p><code>reference (string)</code>: External reference of the provider, generally the identifier of the provider in your integrated platform</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["integration","api","provider"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"7a2ae081-f21b-4704-ba43-df0c77720e17","name":"Create provider","originalRequest":{"method":"POST","header":[{"key":"origin","value":"dev.api.cl.sodtrack.sodtrack.com","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"basicInformation\":{\n        \"name\":\"John\",\n        \"lastName\":\"Contractor\",\n        \"email\":\"johncontractor@gmail.com\",\n        \"phoneNumber\":\"+56978993325\",\n        \"identificationNumber\":\"19081637-0\",\n        \"identificationNumberCountry\":\"CL\"\n        },\n    \"reference\":\"A244923DSR\",\n    \"workOnHolidays\":false,\n    \"isCompany\":true,\n    \"isMainProviderEligible\":true,\n    \"isLeadAssignmentEligible\":true\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 90,\n    \"status\": \"created\",\n    \"reference\": \"A244923DS11\"\n}"}],"_postman_id":"988b6df7-6d4a-4916-8610-6b9b265d068d"},{"name":"Create provider of network","id":"5c8f16a9-5e23-4690-a75f-2f1158080ec5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"provider\":{\n        \"id\": 90,\n        \"reference\": \"A244923DS11\"\n    },\n    \"basicInformation\":{\n        \"name\":\"John\",\n        \"lastName\":\"Contractor\",\n        \"email\":\"johncontractor@gmail.com\",\n        \"phoneNumber\":\"+56978993325\",\n        \"identificationNumber\":\"19081637-0\",\n        \"identificationNumberCountry\":\"CL\"\n        },\n    \"reference\":\"A244923DSR\",\n    \"workOnHolidays\":false\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/technician","description":"<ul>\n<li><p><code>provider (object) - required:</code> Object with the information of the company provider that will have this technician. At least one of the attributes should be provided</p>\n<ul>\n<li><p><code>id (number):</code> Id of the company provider.</p>\n</li>\n<li><p><code>reference (string):</code> Reference of the company provider.</p>\n</li>\n</ul>\n</li>\n<li><p><code>basicInformation (object) - required</code><strong><code>:</code></strong> Object that represent the main information of the user</p>\n<ul>\n<li><p><code>name (string) - required</code>: Name of the technician or network</p>\n</li>\n<li><p><code>lastName (string) - required</code>: Lastname of the technician or network</p>\n</li>\n<li><p><code>email (string) - required</code>: Access email for the technician or network to the platforms</p>\n</li>\n<li><p><code>phoneNumber (string) - required</code>: Phone number</p>\n</li>\n<li><p><code>identificationNumber (string) - required</code>: Fiscal number of the the technician or network</p>\n</li>\n<li><p><code>identificationNumberCountry (string) - required</code>: ISO-2 country string</p>\n</li>\n</ul>\n</li>\n<li><p><code>reference (string)</code>: External reference of the provider, generally the identifier of the provider in your integrated platform</p>\n</li>\n<li><p><code>workOnHolidays (boolean)</code>: If the avaialbility algorithm should take into account the general holidays as holidays for this provider</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["integration","api","provider","technician"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"6d766fdb-1a02-4529-b452-eec4cdbba8e1","name":"Create provider of network","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"provider\":{\n        \"id\": 90,\n        \"reference\": \"A244923DS11\"\n    },\n    \"basicInformation\":{\n        \"name\":\"John\",\n        \"lastName\":\"Contractor\",\n        \"email\":\"johncontractor@gmail.com\",\n        \"phoneNumber\":\"+56978993325\",\n        \"identificationNumber\":\"19081637-0\",\n        \"identificationNumberCountry\":\"CL\"\n        },\n    \"reference\":\"A244923DSR\",\n    \"workOnHolidays\":false\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/technician"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 91,\n    \"status\": \"created\",\n    \"reference\": \"A244923DSR\",\n    \"parentId\": 90\n}"}],"_postman_id":"5c8f16a9-5e23-4690-a75f-2f1158080ec5"},{"name":"Associate catalog area","id":"4e5d8e42-8e20-4a03-b67d-d3c74d8f4f0c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"area_id\": 2,\n    \"name\": \"Chile\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/:providerId/working-area","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["integration","api","provider",":providerId","working-area"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[{"description":{"content":"<p>Id of the provider</p>\n","type":"text/plain"},"type":"any","value":"35","key":"providerId"}]}},"response":[{"id":"37d87cf3-ac65-4778-a012-b3ff20fadd37","name":"Associate catalog area","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"area_id\": 2,\n    \"name\": \"Chile\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/:providerId/working-area","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["integration","api","provider",":providerId","working-area"],"variable":[{"key":"providerId","value":"35","description":"Id of the provider"}]}},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 36,\n    \"polygon\": [\n        [\n            -69.49145636744048,\n            -17.524454208590498\n        ],\n        [\n            -70.41651464873773,\n            -18.43140911217968\n        ],\n        [\n            -71.71159620256485,\n            -29.090749609320724\n        ],\n        [\n            -72.02347277458331,\n            -32.64678792810332\n        ],\n        [\n            -74.22937416964527,\n            -37.525756033853256\n        ],\n        [\n            -75.25405245631103,\n            -43.84000131913486\n        ],\n        [\n            -75.97986356657732,\n            -46.826966622631474\n        ],\n        [\n            -75.88978523420398,\n            -50.96513891871673\n        ],\n        [\n            -74.83540304363899,\n            -53.235587066754405\n        ],\n        [\n            -72.40178818053451,\n            -55.417682610057696\n        ],\n        [\n            -66.68065805148703,\n            -56.20139767058807\n        ],\n        [\n            -66.41025701391436,\n            -55.10139261266371\n        ],\n        [\n            -68.61689415694578,\n            -54.69163913736025\n        ],\n        [\n            -68.48880916415042,\n            -52.25288828726699\n        ],\n        [\n            -71.93287230374929,\n            -51.96444971553152\n        ],\n        [\n            -72.27444015854566,\n            -50.63471807205209\n        ],\n        [\n            -73.09987677878024,\n            -50.67081063456212\n        ],\n        [\n            -73.38451009610218,\n            -49.31686315682273\n        ],\n        [\n            -72.27444015854566,\n            -48.86017741439368\n        ],\n        [\n            -71.06331668093691,\n            -44.480488241551384\n        ],\n        [\n            -71.73221494479843,\n            -44.358511994590636\n        ],\n        [\n            -71.53297162267307,\n            -43.64190966581542\n        ],\n        [\n            -71.97415326452254,\n            -42.498347501523774\n        ],\n        [\n            -71.67528828133403,\n            -41.93974900566139\n        ],\n        [\n            -71.83660508187808,\n            -40.671174133522044\n        ],\n        [\n            -70.82615637310904,\n            -38.566617284233104\n        ],\n        [\n            -71.09075390141633,\n            -37.27480130742069\n        ],\n        [\n            -70.25108561531616,\n            -35.83443033667401\n        ],\n        [\n            -70.36495298038459,\n            -35.1275145667756\n        ],\n        [\n            -69.72452801640976,\n            -34.202807328073106\n        ],\n        [\n            -69.78145467987413,\n            -33.31542867584144\n        ],\n        [\n            -70.45036940485912,\n            -31.428457636234185\n        ],\n        [\n            -69.78148110915207,\n            -30.181673563530126\n        ],\n        [\n            -69.61070111875891,\n            -28.469488994834535\n        ],\n        [\n            -68.18626445368861,\n            -26.89303829233763\n        ],\n        [\n            -68.32858111235007,\n            -24.611622274987567\n        ],\n        [\n            -67.27546623134006,\n            -24.041033147993986\n        ],\n        [\n            -66.91967458468716,\n            -22.957793275767912\n        ],\n        [\n            -67.81628181272994,\n            -22.485218164779013\n        ],\n        [\n            -68.4709384425709,\n            -20.60563892137594\n        ],\n        [\n            -68.37131678150821,\n            -19.348388561513673\n        ],\n        [\n            -69.49145636744048,\n            -17.524454208590498\n        ]\n    ],\n    \"name\": \"Chile\",\n    \"fromCatalog\": true\n}"}],"_postman_id":"4e5d8e42-8e20-4a03-b67d-d3c74d8f4f0c"},{"name":"Associate variants","id":"8cc4c4f1-f352-45d4-a293-f15672ae302b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"service_variant_to_add\":[848,846,850,851,849,852],\n    \"service_variant_to_remove\":[847]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/:providerId/service-variant","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["integration","api","provider",":providerId","service-variant"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[{"description":{"content":"<p>Id of the provider</p>\n","type":"text/plain"},"type":"any","value":"35","key":"providerId"}]}},"response":[{"id":"ca3503ad-fd2f-4c75-98b6-44d67f2c43e0","name":"New Request","originalRequest":{"method":"POST","header":[{"key":"","value":"","type":"text","disabled":true}],"body":{"mode":"raw","raw":"{\n    \"service_variant_to_add\":[848,846,850,851,849,852],\n    \"service_variant_to_remove\":[847]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/:providerId/service-variant","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["integration","api","provider",":providerId","service-variant"],"variable":[{"key":"providerId","value":"35","description":"Id of the provider"}]}},"status":"Created","code":201,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":null}],"_postman_id":"8cc4c4f1-f352-45d4-a293-f15672ae302b"},{"name":"Add daily availability","id":"ab3879be-6640-4e21-ad2f-466b4d9998bd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"end_time\":\"20:00\",\n    \"start_time\":\"08:00\",\n    \"day_of_week\":1\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/:providerId/availability","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["integration","api","provider",":providerId","availability"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[{"description":{"content":"<p>Id of the provider</p>\n","type":"text/plain"},"type":"any","value":"35","key":"providerId"}]}},"response":[{"id":"b7e959bc-8bda-43a8-81c7-59d911e45718","name":"Add daily availability","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"end_time\":\"20:00\",\n    \"start_time\":\"08:00\",\n    \"day_of_week\":1\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/provider/:providerId/availability","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["integration","api","provider",":providerId","availability"],"variable":[{"key":"providerId","value":"35","description":"Id of the provider"}]}},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\":171,\n    \"day_of_week\":1,\n    \"start_time\":\"08:00\",\n    \"end_time\":\"20:00\"\n}"}],"_postman_id":"ab3879be-6640-4e21-ad2f-466b4d9998bd"},{"name":"Change provider status","id":"e670d353-5ffb-43f2-bccc-4438a0ddb90a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\n    \"status\":\"accepted\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/provider/36","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","provider","36"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"d43d7f60-caa8-4533-aad4-a7b60fa92c69","name":"Change provider status","originalRequest":{"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\n    \"status\":\"accepted\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/provider/36"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 36,\n    \"owns_transportation\": false,\n    \"work_on_holidays\": false,\n    \"reference\": \"4433\",\n    \"status\": \"accepted\",\n    \"reviews_count\": 0,\n    \"rating\": \"0.00\",\n    \"priority\": 3,\n    \"user\": {\n        \"id\": 7191,\n        \"name\": \"Felipe\",\n        \"reference\": null,\n        \"lastname\": \"Piter Hijo 2\",\n        \"summary\": null,\n        \"identification_number\": \"190816370\",\n        \"identification_number_decrypted\": \"190816370\",\n        \"identificationNumberCountry\": \"CL\",\n        \"phone\": \"+56978993325\",\n        \"authentication_provider_id\": null,\n        \"email\": \"felipe+piter_hijo2@sodtrack.com\",\n        \"email_verified\": false,\n        \"affiliation_code\": \"LISQE9\",\n        \"referred_by\": null,\n        \"birthdate\": null,\n        \"created_date\": \"2025-05-23T18:46:51.838Z\",\n        \"parent_id\": null\n    },\n    \"created_date\": \"2025-05-23T18:46:51.838Z\",\n    \"boarding_step\": null,\n    \"isCompany\": false,\n    \"fundingType\": null,\n    \"network\": {\n        \"id\": 10,\n        \"name\": null\n    },\n    \"isMainProviderEligible\": true,\n    \"isLeadAssignmentEligible\": true\n}"}],"_postman_id":"e670d353-5ffb-43f2-bccc-4438a0ddb90a"}],"id":"70911813-cd36-4236-a6f7-f9f1f52f85ae","description":"<p>This segment has the API to mange the creation and configuration of network and their technicians, as well as for mono technicians</p>\n","_postman_id":"70911813-cd36-4236-a6f7-f9f1f52f85ae","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Customers","item":[{"name":"Create customer","id":"119e9362-98d8-48c5-8d78-74119da6f9c3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"name\":\"Felipe\",\n    \"lastname\":\"Hanckes\",\n    \"email\":\"felipe+customer@sodtrack.com\",\n    \"phone\":\"+56978993325\",\n    \"identification_number\":\"190816370\",\n    \"identification_number_country\":\"CL\",\n    \"reference\":\"12323\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/user","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["integration","api","user"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"634edebc-fc4e-4deb-8889-6ffc5e6f22bb","name":"Create customer","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"name\":\"Felipe\",\n    \"lastname\":\"Hanckes\",\n    \"email\":\"felipe+customer@sodtrack.com\",\n    \"phone\":\"+56978993325\",\n    \"identification_number\":\"190816370\",\n    \"identification_number_country\":\"CL\",\n    \"reference\":\"12323\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/integration/api/user"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 7189,\n    \"name\": \"Felipe\",\n    \"reference\": \"12323\",\n    \"lastname\": \"Hanckes\",\n    \"summary\": null,\n    \"identification_number\": \"190816370\",\n    \"identification_number_decrypted\": \"190816370\",\n    \"identificationNumberCountry\": \"CL\",\n    \"phone\": \"+56978993325\",\n    \"authentication_provider_id\": null,\n    \"email\": \"felipe+customer@sodtrack.com\",\n    \"email_verified\": false,\n    \"affiliation_code\": \"3EI91S\",\n    \"referred_by\": null,\n    \"birthdate\": null,\n    \"created_date\": \"2025-05-23T18:26:33.946Z\",\n    \"parent_id\": null\n}"}],"_postman_id":"119e9362-98d8-48c5-8d78-74119da6f9c3"}],"id":"599d8472-61b7-415f-85cf-b875c35ddc9a","_postman_id":"599d8472-61b7-415f-85cf-b875c35ddc9a","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}}],"id":"9ac659f6-3e60-4487-823e-2aa6177cde0e","_postman_id":"9ac659f6-3e60-4487-823e-2aa6177cde0e","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Incidents","item":[{"name":"Get Entity Incident","id":"c32f9c19-4277-47ee-a28f-9d7c5e39e220","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/incident?entity=booking&entityId=135","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint returns the list of incidents associated with a given entity (booking or lead). The entity is identified by query parameters <code>entity</code> and <code>entityId</code>. Only <strong>booking</strong> and <strong>lead</strong> entities are supported for incident detail; <strong>project</strong> is not supported and returns an error.</p>\n<hr />\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>entity</code></td>\n<td>enum</td>\n<td>Yes</td>\n<td>Entity type. Must be one of: <code>booking</code>, <code>lead</code>, <code>project</code>. Only <code>booking</code> and <code>lead</code> are supported for incident detail.</td>\n</tr>\n<tr>\n<td><code>entityId</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>ID of the booking or lead to fetch incidents for.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"success-response\">Success Response</h2>\n<p>Returns an array of incident objects. Each item includes:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Incident ID.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Incident description.</td>\n</tr>\n<tr>\n<td><code>entityType</code></td>\n<td>string</td>\n<td>Entity type (booking or lead).</td>\n</tr>\n<tr>\n<td><code>entityId</code></td>\n<td>number</td>\n<td>Entity ID.</td>\n</tr>\n<tr>\n<td><code>bookingIncidentReason</code></td>\n<td>object</td>\n<td><code>{ id, name, description }</code>.</td>\n</tr>\n<tr>\n<td><code>bookingIncidentStatus</code></td>\n<td>object</td>\n<td><code>{ id, name, description }</code>.</td>\n</tr>\n<tr>\n<td><code>userReporter</code></td>\n<td>object</td>\n<td><code>{ id, name, lastName, email, reference }</code>.</td>\n</tr>\n<tr>\n<td><code>userCreator</code></td>\n<td>object</td>\n<td><code>{ id, name, lastName, email, reference }</code>.</td>\n</tr>\n<tr>\n<td><code>userAccountable</code></td>\n<td>object</td>\n<td><code>{ id, name, lastName, email, reference }</code> (nullable).</td>\n</tr>\n<tr>\n<td><code>bookingIncidentAttachments</code></td>\n<td>array</td>\n<td>Attachments linked to the incident.</td>\n</tr>\n<tr>\n<td><code>tasks</code></td>\n<td>array</td>\n<td>Tasks linked to the incident.</td>\n</tr>\n<tr>\n<td><code>offlineCreatedDate</code></td>\n<td>string</td>\n<td>Offline creation date (when applicable).</td>\n</tr>\n<tr>\n<td><code>createdDate</code></td>\n<td>string</td>\n<td>Creation date.</td>\n</tr>\n<tr>\n<td><code>updatedDate</code></td>\n<td>string</td>\n<td>Last update date.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>External reference (optional).</td>\n</tr>\n<tr>\n<td><code>bookingId</code></td>\n<td>number</td>\n<td>Present when entity is booking.</td>\n</tr>\n<tr>\n<td><code>bookingVariantName</code></td>\n<td>string</td>\n<td>Present when entity is booking.</td>\n</tr>\n<tr>\n<td><code>bookingStatus</code></td>\n<td>string</td>\n<td>Present when entity is booking.</td>\n</tr>\n<tr>\n<td><code>bookingDate</code></td>\n<td>string</td>\n<td>Present when entity is booking.</td>\n</tr>\n<tr>\n<td><code>bookingReference</code></td>\n<td>string</td>\n<td>Present when entity is booking.</td>\n</tr>\n<tr>\n<td><code>leadId</code></td>\n<td>number</td>\n<td>Present when entity is lead.</td>\n</tr>\n<tr>\n<td><code>leadReference</code></td>\n<td>string</td>\n<td>Present when entity is lead (optional).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">GET /integration/api/incident?entity=booking&amp;entityId=73\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\nContent-Type: application/json\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": 1,\n    \"description\": \"Customer reported delay\",\n    \"entityType\": \"booking\",\n    \"entityId\": 12345,\n    \"bookingIncidentReason\": { \"id\": 1, \"name\": \"Delay\", \"description\": \"Service delay\" },\n    \"bookingIncidentStatus\": { \"id\": 1, \"name\": \"Open\", \"description\": \"Open\" },\n    \"userReporter\": { \"id\": 10, \"name\": \"John\", \"lastName\": \"Doe\", \"email\": \"john@example.com\", \"reference\": \"USR-001\" },\n    \"userCreator\": { \"id\": 10, \"name\": \"John\", \"lastName\": \"Doe\", \"email\": \"john@example.com\", \"reference\": \"USR-001\" },\n    \"userAccountable\": { \"id\": 11, \"name\": \"Jane\", \"lastName\": \"Smith\", \"email\": \"jane@example.com\", \"reference\": \"USR-002\" },\n    \"bookingIncidentAttachments\": [],\n    \"tasks\": [],\n    \"createdDate\": \"2025-02-20T10:00:00.000Z\",\n    \"updatedDate\": \"2025-02-20T10:00:00.000Z\",\n    \"reference\": \"INC-EXT-001\",\n    \"bookingId\": 12345,\n    \"bookingVariantName\": \"Installation\",\n    \"bookingStatus\": \"scheduled\",\n    \"bookingDate\": \"2025-02-25\",\n    \"bookingReference\": \"BKG-123\"\n  }\n]\n\n</code></pre>\n<h2 id=\"example-error-response\">Example Error Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"ENTITY_NOT_SUPPORTED: Only booking and lead entities are supported for incident detail.\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<hr />\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","incident"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[{"description":{"content":"<p>Entity for which the incident should be retrieved</p>\n","type":"text/plain"},"key":"entity","value":"booking"},{"description":{"content":"<p>Id of the entity of which all incidents should be fetched</p>\n","type":"text/plain"},"key":"entityId","value":"135"}],"variable":[]}},"response":[{"id":"e4b2521e-d666-4767-bf1a-78b9a7134ce4","name":"Get Entity Incident","originalRequest":{"method":"GET","header":[],"body":{"mode":"raw","raw":"{\n    \"incident\": {\n        \"type\": \"string\", // incidentId or incidentReference\n        \"value\": \"string\"\n    },\n    \"description\": \"string\",\n    \"statusId\": \"number\",\n    \"accountableUser\": {\n        \"type\": \"string\", // userId, userReference, userEmail\n        \"value\": \"string\"\n    }\n}"},"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/incident?entity=booking&entityId=135","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["api","integration","incident"],"query":[{"key":"entity","value":"booking","description":"Entity for which the incident should be retrieved"},{"key":"entityId","value":"135","description":"Id of the entity of which all incidents should be fetched"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"[\n    {\n        \"id\": 53,\n        \"description\": \"Prueba de inyección de un incidente vía integración. 17-11-2025 incidente 1\",\n        \"bookingId\": 2343,\n        \"bookingVariantName\": \"Presupuesto instalación Electrodomésticos\",\n        \"bookingStatus\": \"done\",\n        \"bookingDate\": \"2025-11-18T11:00:00.000Z\",\n        \"bookingReference\": \"UPDT-2-FROM-EXT-INT\",\n        \"bookingIncidentReason\": {\n            \"id\": 18,\n            \"name\": \"Incidentes naturales\",\n            \"description\": \"Árboles caídos, hoyos en el camino, agua en exceso, nieve, etc\"\n        },\n        \"bookingIncidentStatus\": {\n            \"id\": 1,\n            \"name\": \"Create\",\n            \"description\": \"Created status\"\n        },\n        \"userReporter\": {\n            \"id\": 15,\n            \"name\": \"Felipe\",\n            \"lastName\": \"Hanckes\",\n            \"email\": \"felipe@sodtrack.com\",\n            \"reference\": null\n        },\n        \"userCreator\": {\n            \"id\": 15,\n            \"name\": \"Felipe\",\n            \"lastName\": \"Hanckes\",\n            \"email\": \"felipe@sodtrack.com\",\n            \"reference\": null\n        },\n        \"userAccountable\": {\n            \"id\": 15,\n            \"name\": \"Felipe\",\n            \"lastName\": \"Hanckes\",\n            \"email\": \"felipe@sodtrack.com\",\n            \"reference\": null\n        },\n        \"bookingIncidentAttachments\": [],\n        \"offlineCreatedDate\": null,\n        \"createdDate\": \"2025-11-17T17:34:46.856Z\",\n        \"updatedDate\": \"2025-11-17T17:34:46.856Z\",\n        \"reference\": \"ext-int-creation#1\"\n    },\n    {\n        \"id\": 54,\n        \"description\": \"Prueba de inyección de un incidente vía integración. 17-11-2025 incidente 2 update 1\",\n        \"bookingId\": 2343,\n        \"bookingVariantName\": \"Presupuesto instalación Electrodomésticos\",\n        \"bookingStatus\": \"done\",\n        \"bookingDate\": \"2025-11-18T11:00:00.000Z\",\n        \"bookingReference\": \"UPDT-2-FROM-EXT-INT\",\n        \"bookingIncidentReason\": {\n            \"id\": 18,\n            \"name\": \"Incidentes naturales\",\n            \"description\": \"Árboles caídos, hoyos en el camino, agua en exceso, nieve, etc\"\n        },\n        \"bookingIncidentStatus\": {\n            \"id\": 2,\n            \"name\": \"resuelto\",\n            \"description\": \"El incidente fue resuelto\"\n        },\n        \"userReporter\": {\n            \"id\": 15,\n            \"name\": \"Felipe\",\n            \"lastName\": \"Hanckes\",\n            \"email\": \"felipe@sodtrack.com\",\n            \"reference\": null\n        },\n        \"userCreator\": {\n            \"id\": 15,\n            \"name\": \"Felipe\",\n            \"lastName\": \"Hanckes\",\n            \"email\": \"felipe@sodtrack.com\",\n            \"reference\": null\n        },\n        \"userAccountable\": {\n            \"id\": 16,\n            \"name\": \"Felipe\",\n            \"lastName\": \"Hanckes\",\n            \"email\": \"felipe+2@sodtrack.com\",\n            \"reference\": null\n        },\n        \"bookingIncidentAttachments\": [],\n        \"offlineCreatedDate\": null,\n        \"createdDate\": \"2025-11-17T17:38:59.290Z\",\n        \"updatedDate\": \"2025-11-20T03:55:46.668Z\",\n        \"reference\": \"ext-int-creation#2\"\n    }\n]"}],"_postman_id":"c32f9c19-4277-47ee-a28f-9d7c5e39e220"},{"name":"Create Incident","id":"b65b319c-3b81-4e03-896f-0cbc62dd59cf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/incident","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Creates a new incident in Sodtrack and associates it with a <strong>booking</strong> or a <strong>lead</strong>.</p>\n<p>The target entity is identified by <strong>entityType</strong> (<code>booking</code> or <code>lead</code>) and by <strong>entity</strong> (using <code>entityId</code> or <code>entityReference</code>). The incident requires a <strong>description</strong> and an <strong>incident reason</strong> (by ID; reference is not yet supported). You can optionally set the reporter, creator, and accountable users, an external <strong>reference</strong>, and <strong>dynamic forms</strong> data.</p>\n<p>Incidents are used to track issues, complaints, or follow-ups. Only <strong>booking</strong> and <strong>lead</strong> are supported for creation; <strong>project</strong> is not supported.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"📋-request-body\">📋 Request body</h4>\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>entityType</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Entity type the incident is associated with: <code>\"booking\"</code> or <code>\"lead\"</code>.</td>\n</tr>\n<tr>\n<td><code>entity</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Entity identifier: how to find the booking or lead (by ID or reference).</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Description of the incident.</td>\n</tr>\n<tr>\n<td><code>incidentReason</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Incident reason identifier. Only <code>reasonId</code> is supported; <code>reasonReference</code> is not yet supported.</td>\n</tr>\n<tr>\n<td><code>reporterUser</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>User who reported the incident. If provided and not resolved, the request fails.</td>\n</tr>\n<tr>\n<td><code>creatorUser</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>User who created the incident. If provided and not resolved, the request fails.</td>\n</tr>\n<tr>\n<td><code>accountableUser</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>User accountable for resolving the incident. Optional.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>External reference for the incident.</td>\n</tr>\n<tr>\n<td><code>dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional form data (if configured for incident creation). See <strong>Dynamic forms</strong> below.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"📝-dynamic-forms\">📝 Dynamic forms</h4>\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>dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>List of form snapshots to submit.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].formReference</code></td>\n<td><code>string</code></td>\n<td>✅ when form sent</td>\n<td>Identifier of the form (must match a form configured for the incident creation flow).</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values</code></td>\n<td><code>array[object]</code></td>\n<td>✅ when form sent</td>\n<td>List of field values for this form.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values[].fieldReference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Identifier of the form field (must match a field in the form).</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values[].value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Submitted value for the field. Numbers are accepted and converted to string.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"🔗-entity-identifier\">🔗 Entity identifier</h4>\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>entity.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>How the entity is identified: <code>\"entityId\"</code> or <code>\"entityReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>entity.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The booking/lead ID (if type is <code>entityId</code>) or the booking/lead reference (if type is <code>entityReference</code>). Must be non-empty.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"📌-incident-reason-identifier\">📌 Incident reason identifier</h4>\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>incidentReason.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Must be <code>\"reasonId\"</code>. <code>\"reasonReference\"</code> is not yet supported.</td>\n</tr>\n<tr>\n<td><code>incidentReason.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Numeric ID of the incident reason (must exist in Sodtrack).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"👤-user-information-reporter-creator-accountable\">👤 User information (reporter, creator, accountable)</h4>\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><code>string</code></td>\n<td>✅ when user object sent</td>\n<td>User identifier type: <code>\"userId\"</code>, <code>\"userEmail\"</code>, or <code>\"userReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td><code>string</code></td>\n<td>✅ when user object sent</td>\n<td>The user ID, email, or reference according to <code>type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"example-request-booking-by-reference\"><strong>Example Request (booking by reference)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"entityType\": \"booking\",\n  \"entity\": {\n    \"type\": \"entityReference\",\n    \"value\": \"BOOK-REF-001\"\n  },\n  \"description\": \"Técnico no llevó el equipo correcto.\",\n  \"incidentReason\": {\n    \"type\": \"reasonId\",\n    \"value\": \"2\"\n  },\n  \"reporterUser\": {\n    \"type\": \"userEmail\",\n    \"value\": \"soporte@example.com\"\n  },\n  \"creatorUser\": {\n    \"type\": \"userReference\",\n    \"value\": \"USER-EXT-001\"\n  },\n  \"reference\": \"INC-EXT-2025-001\"\n}\n\n</code></pre>\n<h3 id=\"example-request-lead-by-reference\"><strong>Example Request (lead by reference)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"entityType\": \"lead\",\n  \"entity\": {\n    \"type\": \"entityReference\",\n    \"value\": \"LEAD-EXT-342\"\n  },\n  \"description\": \"Queja por demora en agendamiento.\",\n  \"incidentReason\": {\n    \"type\": \"reasonId\",\n    \"value\": \"2\"\n  },\n  \"reporterUser\": {\n    \"type\": \"userEmail\",\n    \"value\": \"soporte@example.com\"\n  },\n  \"creatorUser\": {\n    \"type\": \"userEmail\",\n    \"value\": \"soporte@example.com\"\n  },\n  \"reference\": \"INC-LEAD-001\",\n  \"dynamicForms\": [\n    {\n      \"formReference\": \"incident_creation_form\",\n      \"values\": [\n        {\n          \"fieldReference\": \"incident_creation_form_field_1\",\n          \"value\": \"Yes\"\n        }\n      ]\n    }\n  ]\n}\n\n</code></pre>\n<h3 id=\"example-request-minimal\"><strong>Example Request (minimal)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"entityType\": \"booking\",\n  \"entity\": {\n    \"type\": \"entityId\",\n    \"value\": \"12345\"\n  },\n  \"description\": \"Incidente reportado por integración.\",\n  \"incidentReason\": {\n    \"type\": \"reasonId\",\n    \"value\": \"1\"\n  }\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 100,\n  \"entityType\": \"booking\",\n  \"entityId\": 12345,\n  \"bookingId\": 12345,\n  \"incidentStatus\": {\n    \"id\": 1,\n    \"name\": \"Open\",\n    \"description\": \"Incident is open\",\n    \"isFinalStatus\": false,\n    \"isInitialStatus\": true,\n    \"bookingStatusUpdate\": \"\"\n  },\n  \"reference\": \"INC-EXT-001\"\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Unique Sodtrack incident ID.</td>\n</tr>\n<tr>\n<td><code>entityType</code></td>\n<td><code>string</code></td>\n<td>Entity type: <code>\"booking\"</code> or <code>\"lead\"</code>.</td>\n</tr>\n<tr>\n<td><code>entityId</code></td>\n<td><code>number</code></td>\n<td>Entity ID (booking id or lead id).</td>\n</tr>\n<tr>\n<td><code>bookingId</code></td>\n<td><code>number</code></td>\n<td>Present only when <code>entityType</code> is <code>\"booking\"</code>.</td>\n</tr>\n<tr>\n<td><code>incidentStatus</code></td>\n<td><code>object</code></td>\n<td>Initial incident status (id, name, description, isFinalStatus, isInitialStatus, bookingStatusUpdate).</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td><code>string</code></td>\n<td>External reference if provided in the request.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>ENTITY_IDENTIFIER_REQUIRED</code></td>\n<td><code>entity.value</code> is missing or empty.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>ENTITY_TYPE_NOT_SUPPORTED</code></td>\n<td><code>entityType</code> is not supported for creation (e.g. <code>project</code>). Only <code>booking</code> and <code>lead</code> are supported.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>BOOKING_NOT_FOUND_FOR_ID</code></td>\n<td>No booking found for the given entity ID.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>BOOKING_NOT_FOUND_FOR_REFERENCE</code></td>\n<td>No booking found for the given entity reference.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>MULTIPLE_BOOKINGS_FOUND_FOR_REFERENCE</code></td>\n<td>More than one booking shares the given reference.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>LEAD_NOT_FOUND_FOR_ID</code></td>\n<td>No lead found for the given entity ID.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>LEAD_NOT_FOUND_FOR_REFERENCE</code></td>\n<td>No lead found for the given entity reference.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_REPORTER_USER</code></td>\n<td><code>reporterUser</code> was provided but could not be resolved.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_CREATOR_USER</code></td>\n<td><code>creatorUser</code> was provided but could not be resolved.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_USER_TYPE</code></td>\n<td>Invalid user identifier type.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_INCIDENT_REASON_ID</code></td>\n<td>Reason id must be a number.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INCIDENT_REASON_NOT_FOUND</code></td>\n<td>The incident reason ID does not exist in Sodtrack.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INCIDENT_REASON_REFERENCE_NOT_SUPPORTED</code></td>\n<td>Resolution by <code>reasonReference</code> is not yet supported. Use <code>reasonId</code>.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_INCIDENT_REASON_TYPE</code></td>\n<td>Invalid incident reason identifier type.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"entity-identification\">Entity identification</h2>\n<ul>\n<li><p><strong>entityType</strong> and <strong>entity</strong> are required. Supported values for creation are <strong><code>booking</code></strong> and <strong><code>lead</code></strong>. The enum may include <code>project</code>; it is <strong>not supported</strong> for this endpoint and returns <code>ENTITY_TYPE_NOT_SUPPORTED</code>.</p>\n</li>\n<li><p><strong>entity.value</strong> must be non-empty (after trim). Otherwise the request fails with <code>ENTITY_IDENTIFIER_REQUIRED</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"booking-resolution\">Booking resolution</h2>\n<p>When <strong>entityType</strong> is <code>booking</code>:</p>\n<ul>\n<li><p><strong>entity.type = entityId:</strong> <code>value</code> is the booking ID. The booking must exist; otherwise the API returns <code>BOOKING_NOT_FOUND_FOR_ID</code>.</p>\n</li>\n<li><p><strong>entity.type = entityReference:</strong> <code>value</code> is the booking reference. No match returns <code>BOOKING_NOT_FOUND_FOR_REFERENCE</code>; multiple matches return <code>MULTIPLE_BOOKINGS_FOUND_FOR_REFERENCE</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"lead-resolution\">Lead resolution</h2>\n<p>When <strong>entityType</strong> is <code>lead</code>:</p>\n<ul>\n<li><p><strong>entity.type = entityId:</strong> <code>value</code> is the lead ID. The lead must exist; otherwise the API returns <code>LEAD_NOT_FOUND_FOR_ID</code>.</p>\n</li>\n<li><p><strong>entity.type = entityReference:</strong> <code>value</code> is the lead reference. The lead must exist; otherwise the API returns <code>LEAD_NOT_FOUND_FOR_REFERENCE</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"user-resolution\">User resolution</h2>\n<ul>\n<li><p><strong>reporterUser</strong> and <strong>creatorUser</strong> are optional and can be sent as <code>null</code>. When either is provided with a non-null value, it must resolve to an existing user by the given identifier (<code>userId</code>, <code>userEmail</code>, or <code>userReference</code>). If the user cannot be resolved, the request fails with <code>INVALID_REPORTER_USER</code> or <code>INVALID_CREATOR_USER</code> respectively.</p>\n</li>\n<li><p><strong>accountableUser</strong> is optional. When provided, it is resolved if possible; if it cannot be resolved, the incident may be created without an accountable user (behavior may depend on configuration).</p>\n</li>\n<li><p>Invalid user identifier <strong>type</strong> returns <code>INVALID_USER_TYPE</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"incident-reason\">Incident reason</h2>\n<ul>\n<li><p><strong>incidentReason</strong> is required. Only <strong>type = reasonId</strong> is supported; <strong>reasonReference</strong> is not yet supported and returns <code>INCIDENT_REASON_REFERENCE_NOT_SUPPORTED</code>.</p>\n</li>\n<li><p><strong>value</strong> must be a valid numeric reason ID that exists in Sodtrack. Invalid number returns <code>INVALID_INCIDENT_REASON_ID</code>; non-existent reason returns <code>INCIDENT_REASON_NOT_FOUND</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li><p>Dynamic form data (when provided) is validated and stored for the incident according to the incident creation flow configuration.</p>\n</li>\n<li><p>All timestamps in responses follow ISO 8601 format (UTC) where applicable.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","incident"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"2f54f1f3-5204-494a-aa5f-bed1ede3baf8","name":"Create Incident","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"entityType\": \"booking\",\n  \"entity\": {\n    \"type\": \"entityReference\",\n    \"value\": \"BKG-EXT-100\"\n  },\n  \"description\": \"Technician did not have correct equipment on site.\",\n  \"incidentReason\": {\n    \"type\": \"reasonId\",\n    \"value\": \"1\"\n  },\n  \"reporterUser\": { \"type\": \"userEmail\", \"value\": \"reporter@example.com\" },\n  \"creatorUser\": { \"type\": \"userReference\", \"value\": \"USR-INT-01\" },\n  \"accountableUser\": { \"type\": \"userId\", \"value\": \"42\" },\n  \"reference\": \"INC-EXT-2025-001\",\n  \"dynamicForms\": [\n        {\n            \"formReference\": \"incident_creation_form\",\n            \"values\": [\n                {\n                    \"fieldReference\": \"incident_creation_form_field_1\",\n                    \"value\": \"Yes\"\n                }\n            ]\n        }\n    ]\n}\n","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/incident"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 71,\n    \"entityType\": \"lead\",\n    \"entityId\": 278,\n    \"incidentStatus\": {\n        \"id\": 1,\n        \"name\": \"Create\",\n        \"description\": \"Created status\",\n        \"isFinalStatus\": false,\n        \"isInitialStatus\": true,\n        \"bookingStatusUpdate\": \"\"\n    },\n    \"reference\": \"INC-EXT-2026-001\"\n}"}],"_postman_id":"b65b319c-3b81-4e03-896f-0cbc62dd59cf"},{"name":"Update Incident","id":"e64bea44-f315-45c5-999e-8a5f0c52c8b5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/incident","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Updates an existing incident in Sodtrack.</p>\n<p>The incident is identified by <strong>incident</strong> (by <code>incidentId</code> or <code>incidentReference</code>). Only the fields you send are updated; omitted fields keep their current values. You can update the <strong>description</strong>, <strong>incident status</strong>, <strong>accountable user</strong>, and <strong>dynamic forms</strong> data.</p>\n<hr />\n<h3 id=\"field-definitions\"><strong>Field Definitions</strong></h3>\n<h4 id=\"📋-request-body\">📋 Request body</h4>\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>incident</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Incident identifier (by ID or reference).</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>New incident description. Only sent if you want to change it.</td>\n</tr>\n<tr>\n<td><code>incidentStatus</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>New incident status identifier. Only <strong>statusId</strong> is supported; <strong>statusReference</strong> is not yet supported.</td>\n</tr>\n<tr>\n<td><code>accountableUser</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>New user accountable for the incident. If provided, must resolve to an existing user.</td>\n</tr>\n<tr>\n<td><code>dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>Optional form data (if configured for incident status change). See <strong>Dynamic forms</strong> below.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"📝-dynamic-forms\">📝 Dynamic forms</h4>\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>dynamicForms</code></td>\n<td><code>array[object]</code></td>\n<td>❌</td>\n<td>List of form snapshots to submit.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].formReference</code></td>\n<td><code>string</code></td>\n<td>✅ when form sent</td>\n<td>Identifier of the form (must match a form configured for the incident status change flow).</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values</code></td>\n<td><code>array[object]</code></td>\n<td>✅ when form sent</td>\n<td>List of field values for this form.</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values[].fieldReference</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Identifier of the form field (must match a field in the form).</td>\n</tr>\n<tr>\n<td><code>dynamicForms[].values[].value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Submitted value for the field. Numbers are accepted and converted to string.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"📌-incident-status-identifier\">📌 Incident status identifier</h4>\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>incidentStatus.type</code></td>\n<td><code>string</code></td>\n<td>✅ when incidentStatus sent</td>\n<td>Must be <code>\"statusId\"</code>. <code>\"statusReference\"</code> is not yet supported.</td>\n</tr>\n<tr>\n<td><code>incidentStatus.value</code></td>\n<td><code>string</code></td>\n<td>✅ when incidentStatus sent</td>\n<td>Numeric ID of the incident status (must exist in Sodtrack).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"👤-user-information-accountable\">👤 User information (accountable)</h4>\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><code>string</code></td>\n<td>✅ when accountableUser sent</td>\n<td>User identifier type: <code>\"userId\"</code>, <code>\"userEmail\"</code>, or <code>\"userReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td><code>string</code></td>\n<td>✅ when accountableUser sent</td>\n<td>The user ID, email, or reference according to <code>type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request-by-incident-reference\"><strong>Example Request (by incident reference)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"incident\": {\n    \"type\": \"incidentReference\",\n    \"value\": \"INC-EXT-2025-001\"\n  },\n  \"description\": \"Actualizado: resolución en progreso.\",\n  \"incidentStatus\": {\n    \"type\": \"statusId\",\n    \"value\": \"2\"\n  },\n  \"accountableUser\": {\n    \"type\": \"userEmail\",\n    \"value\": \"manager@example.com\"\n  }\n}\n\n</code></pre>\n<h3 id=\"example-request-by-incident-id\"><strong>Example Request (by incident ID)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"incident\": {\n    \"type\": \"incidentId\",\n    \"value\": \"101\"\n  },\n  \"description\": \"Descripción actualizada del incidente.\",\n  \"incidentStatus\": {\n    \"type\": \"statusId\",\n    \"value\": \"3\"\n  },\n  \"dynamicForms\": [\n        {\n            \"formReference\": \"incident_status_update_form\",\n            \"values\": [\n                {\n                    \"fieldReference\": \"incident_status_update_form_field_1\",\n                    \"value\": \"yesterday\"\n                }\n            ]\n        }\n    ]\n}\n\n</code></pre>\n<h3 id=\"example-request-minimal--change-status-only\"><strong>Example Request (minimal — change status only)</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"incident\": {\n    \"type\": \"incidentId\",\n    \"value\": \"101\"\n  },\n  \"incidentStatus\": {\n    \"type\": \"statusId\",\n    \"value\": \"2\"\n  }\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-example\"><strong>Response Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 101,\n  \"entityType\": \"booking\",\n  \"entityId\": 12345,\n  \"bookingId\": 12345,\n  \"incidentStatus\": {\n    \"id\": 2,\n    \"name\": \"In Progress\",\n    \"description\": \"In Progress\",\n    \"isFinalStatus\": false,\n    \"isInitialStatus\": false,\n    \"bookingStatusUpdate\": \"\"\n  }\n}\n\n</code></pre>\n<h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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><code>number</code></td>\n<td>Incident ID.</td>\n</tr>\n<tr>\n<td><code>entityType</code></td>\n<td><code>string</code></td>\n<td>Entity type: <code>\"booking\"</code> or <code>\"lead\"</code>.</td>\n</tr>\n<tr>\n<td><code>entityId</code></td>\n<td><code>number</code></td>\n<td>Entity ID (booking id or lead id).</td>\n</tr>\n<tr>\n<td><code>bookingId</code></td>\n<td><code>number</code></td>\n<td>Present only when <code>entityType</code> is <code>\"booking\"</code>.</td>\n</tr>\n<tr>\n<td><code>incidentStatus</code></td>\n<td><code>object</code></td>\n<td>Updated incident status (id, name, description, isFinalStatus, isInitialStatus, bookingStatusUpdate).</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INCIDENT_NOT_FOUND</code></td>\n<td>No incident found for the given ID or reference.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>MULTIPLE_INCIDENTS_FOUND_FOR_REFERENCE</code></td>\n<td>More than one incident matches the given reference.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_INCIDENT_TYPE</code></td>\n<td>Invalid incident identifier type (must be <code>incidentId</code> or <code>incidentReference</code>).</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_ACCOUNTABLE_USER</code></td>\n<td><code>accountableUser</code> was provided but could not be resolved to an existing user.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_INCIDENT_STATUS_ID</code></td>\n<td>Status id must be a number.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INCIDENT_STATUS_NOT_FOUND</code></td>\n<td>The incident status ID does not exist in Sodtrack.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INCIDENT_STATUS_REFERENCE_NOT_SUPPORTED</code></td>\n<td>Resolution by <code>statusReference</code> is not yet supported. Use <code>statusId</code>.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>INVALID_INCIDENT_STATUS_TYPE</code></td>\n<td>Invalid incident status identifier type.</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>One or more required fields are missing or invalid.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication token missing or expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<h2 id=\"incident-identification\">Incident identification</h2>\n<ul>\n<li><p><strong>incident</strong> is required, with <strong>type</strong> and <strong>value</strong>.</p>\n</li>\n<li><p><strong>type</strong> must be <code>incidentId</code> or <code>incidentReference</code>. Any other value returns <code>INVALID_INCIDENT_TYPE</code>.</p>\n</li>\n<li><p>If no incident is found for the given ID or reference, the API returns <code>INCIDENT_NOT_FOUND</code>.</p>\n</li>\n<li><p>When <strong>type = incidentReference</strong>, if more than one incident matches the reference, the API returns <code>MULTIPLE_INCIDENTS_FOUND_FOR_REFERENCE</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"update-behavior\">Update behavior</h2>\n<ul>\n<li><p><strong>description</strong>, <strong>incidentStatus</strong>, and <strong>accountableUser</strong> are optional. Only provided fields are updated; omitted fields leave existing values unchanged.</p>\n</li>\n<li><p>You can send only <strong>incident</strong> plus one or more of description, status, and accountable user.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"accountable-user\">Accountable user</h2>\n<ul>\n<li>When <strong>accountableUser</strong> is provided, it must resolve to an existing user (by <code>userId</code>, <code>userEmail</code>, or <code>userReference</code>). If the user cannot be resolved, the request fails with <code>INVALID_ACCOUNTABLE_USER</code>.</li>\n</ul>\n<hr />\n<h2 id=\"incident-status\">Incident status</h2>\n<ul>\n<li><p><strong>incidentStatus</strong> (when provided) must use <strong>type = statusId</strong>. <strong>statusReference</strong> is not yet supported and returns <code>INCIDENT_STATUS_REFERENCE_NOT_SUPPORTED</code>.</p>\n</li>\n<li><p><strong>value</strong> must be a valid numeric status ID that exists in Sodtrack. Invalid number returns <code>INVALID_INCIDENT_STATUS_ID</code>; non-existent status returns <code>INCIDENT_STATUS_NOT_FOUND</code>.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"data-and-format\">Data and format</h2>\n<ul>\n<li><p>Dynamic form data (when provided) is validated and stored according to the incident status change flow configuration.</p>\n</li>\n<li><p>All timestamps in responses follow ISO 8601 format (UTC) where applicable.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","incident"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"fb18f9be-0081-419b-bb49-284fa3ba762f","name":"Create Incident","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"incident\": { \n    \"type\": \"incidentReference\", \n    \"value\": \"INC-EXT-2025-001\" \n  },\n  \"description\": \"Updated: resolution in progress.\",\n  \"incidentStatus\": {\n    \"type\": \"statusId\",\n    \"value\": \"2\"\n  },\n  \"accountableUser\": { \"type\": \"userEmail\", \"value\": \"manager@example.com\" }\n}\n","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/incident"},"status":"Created","code":201,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 45,\n    \"bookingId\": 1515,\n    \"incidentStatus\": {\n        \"id\": 1\n    }\n}"}],"_postman_id":"e64bea44-f315-45c5-999e-8a5f0c52c8b5"}],"id":"471cabe2-7de4-45a2-a1a8-97eafd1e1f34","_postman_id":"471cabe2-7de4-45a2-a1a8-97eafd1e1f34","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Attachment","item":[{"name":"Find attachments by ids","id":"eb0526aa-15c4-4b03-a87e-3f53167ef216","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Origin","value":"dev.api.cl.sodtrack.sodtrack.com","type":"text"}],"body":{"mode":"raw","raw":"{\"attachmentIds\":[21]}","options":{"raw":{"language":"json"}}},"url":"https://dev.integration.cl.sodtrack-shared.sodtrack.com/api/integration/attachment/find-by-ids","description":"<h3 id=\"field-definitions\">Field Definitions</h3>\n<h4 id=\"top-level\">Top-level</h4>\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>customer</td>\n<td>object</td>\n<td>✅</td>\n<td>Basic customer information.</td>\n</tr>\n<tr>\n<td>serviceId</td>\n<td>number</td>\n<td>✅</td>\n<td>ID of the service associated with the lead.</td>\n</tr>\n<tr>\n<td>salesChannelId</td>\n<td>number</td>\n<td>✅</td>\n<td>ID of the originating sales channel.</td>\n</tr>\n<tr>\n<td>qualifyingQuestions</td>\n<td>array</td>\n<td>✅</td>\n<td>Answers to the lead’s qualifying questions.</td>\n</tr>\n<tr>\n<td>addressData</td>\n<td>object</td>\n<td>✅</td>\n<td>Customer address data; required if the service variant must be performed at the customer location.</td>\n</tr>\n<tr>\n<td>dynamicForm</td>\n<td>array</td>\n<td>❌</td>\n<td>Forms (and values) to associate with the lead creation.</td>\n</tr>\n<tr>\n<td>reference</td>\n<td>string</td>\n<td>❌</td>\n<td>Optional reference identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"customer\">customer</h4>\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>customer.name</td>\n<td>string</td>\n<td>✅</td>\n<td>Customer first name.</td>\n</tr>\n<tr>\n<td>customer.lastName</td>\n<td>string</td>\n<td>✅</td>\n<td>Customer last name.</td>\n</tr>\n<tr>\n<td>customer.phoneNumber</td>\n<td>string</td>\n<td>✅</td>\n<td>Client phone number including “+” and country code.</td>\n</tr>\n<tr>\n<td>customer.email</td>\n<td>string</td>\n<td>✅</td>\n<td>Customer email.</td>\n</tr>\n<tr>\n<td>customer.identificationNumber</td>\n<td>string</td>\n<td>✅</td>\n<td>Customer fiscal/tax ID.</td>\n</tr>\n<tr>\n<td>customer.identificationNumberCountry</td>\n<td>string</td>\n<td>✅</td>\n<td>Country code in ISO‑2 format (e.g., US, CL).</td>\n</tr>\n<tr>\n<td>customer.reference</td>\n<td>string</td>\n<td>❌</td>\n<td>Optional reference identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"qualifyingquestions\">qualifyingQuestions</h4>\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>qualifyingQuestions[].fieldReference</td>\n<td>number</td>\n<td>✅</td>\n<td>ID of the question to be answered.</td>\n</tr>\n<tr>\n<td>qualifyingQuestions[].value</td>\n<td>string</td>\n<td>✅</td>\n<td>Answer to the question.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"addressdata\">addressData</h4>\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>addressData.extra_info</td>\n<td>string</td>\n<td>❌</td>\n<td>Additional info to locate the address (e.g., “apt 34”, “office 83”).</td>\n</tr>\n<tr>\n<td>addressData.address</td>\n<td>string</td>\n<td>✅</td>\n<td>Written customer address.</td>\n</tr>\n<tr>\n<td>addressData.coordinate</td>\n<td>object</td>\n<td>✅</td>\n<td>Geolocation of the customer address.</td>\n</tr>\n<tr>\n<td>addressData.coordinate.lat</td>\n<td>number</td>\n<td>✅</td>\n<td>Latitude.</td>\n</tr>\n<tr>\n<td>addressData.coordinate.lng</td>\n<td>number</td>\n<td>✅</td>\n<td>Longitude.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"dynamicform\">dynamicForm</h4>\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>dynamicForm[].externalReference</td>\n<td>string</td>\n<td>✅</td>\n<td>Reference of the form to be completed.</td>\n</tr>\n<tr>\n<td>dynamicForm[].values</td>\n<td>array</td>\n<td>✅</td>\n<td>Array of responses for that form.</td>\n</tr>\n<tr>\n<td>dynamicForm[].values[].FieldReference</td>\n<td>string</td>\n<td>✅</td>\n<td>Dynamic Form field reference</td>\n</tr>\n<tr>\n<td>dynamicForm[].values[].value</td>\n<td>string</td>\n<td>✅</td>\n<td>Field value.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"protocol":"https","path":["api","integration","attachment","find-by-ids"],"host":["dev","integration","cl","sodtrack-shared","sodtrack","com"],"query":[],"variable":[]}},"response":[{"id":"4361fda1-f5c7-4284-a93c-728d944f7d24","name":"Create Lead","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"address\": {\n        \"address\": \"Hernán Cortés 2624\",\n        \"address_extra_info\": \"Casa con muralla amarilla\",\n        \"coordinate\": {\n            \"lat\": -33.446725547942364,\n            \"lng\": -70.60396818964483\n        }\n    },\n    \"customer\": {\n        \"name\": \"Felipe\",\n        \"lastName\": \"Hanckes\",\n        \"email\": \"felipe@sodtrack.com\",\n        \"phoneNumber\": \"+56978993325\",\n        \"identificationNumber\": \"19081637-0\",\n        \"identificationNumberCountry\": \"CL\"\n    },\n    \"dynamicForms\": [\n        {\n            \"formReference\": \"RF-0001\",\n            \"values\": [\n                {\n                    \"fieldReference\": \"1001\",\n                    \"value\": \"true\"\n                }\n            ]\n        }\n    ],\n    \"QualifyingQuestions\": [\n        {\n            \"fieldReference\": 8,\n            \"value\": \"Aire Acondicionado Split - 9.000 BTU\"\n        },\n        {\n            \"fieldReference\": 15,\n            \"value\": \"3 - 6 meses\"\n        },\n        {\n            \"fieldReference\": 10,\n            \"value\": \"700043234331\"\n        }\n    ],\n    \"reference\": \"L3322241\",\n    \"serviceId\": 2,\n    \"salesChannelId\": 9\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/lead"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 4,\n    \"customer_id\": 15\n}"}],"_postman_id":"eb0526aa-15c4-4b03-a87e-3f53167ef216"}],"id":"626c40fa-10eb-4913-91fe-7e3d44cd2cba","_postman_id":"626c40fa-10eb-4913-91fe-7e3d44cd2cba","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Alerts","item":[{"name":"Create an Alert","id":"7d2c4235-c70a-42fa-9187-402448301f73","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"origin","value":"","type":"text"},{"key":"","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"entityType\": \"lead\",\n    \"entity\": {\n        \"type\": \"entityId\",\n        \"value\": \"503\"\n    },\n    \"name\": \"New - Lead Not Viewed\",\n    \"createdComment\": \"New leads must be contacted within 4 business hours. Please visit your lead record and log a call with your customer to resolve this alert.\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/alert","description":"<h2 id=\"general-description\">General Description</h2>\n<p>Creates a new alert for an entity resolved by polymorphic identifier (<code>entityId</code> or <code>entityReference</code>) plus <code>entityType</code>.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationcreatealertrequestdto\">Request Body: ExternalIntegrationCreateAlertRequestDTO</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>entityType</code></td>\n<td>enum</td>\n<td>Yes</td>\n<td>Entity type where alert is created can be one of <code>booking</code>, <code>lead</code>, <code>project</code> or <code>budget</code></td>\n</tr>\n<tr>\n<td><code>entity</code></td>\n<td><code>ExternalIntegrationEntityIdentifierRequestDTO</code></td>\n<td>Yes</td>\n<td>Entity identifier object.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Alert name.</td>\n</tr>\n<tr>\n<td><code>resolveType</code></td>\n<td>enum</td>\n<td>No</td>\n<td>Resolve behavior. Supported in this flow: <code>manual</code>, <code>sticky</code>.</td>\n</tr>\n<tr>\n<td><code>metricKey</code></td>\n<td>string</td>\n<td>No</td>\n<td>Optional metric key.</td>\n</tr>\n<tr>\n<td><code>metricValue</code></td>\n<td>string</td>\n<td>No</td>\n<td>Optional metric value.</td>\n</tr>\n<tr>\n<td><code>createdComment</code></td>\n<td>string</td>\n<td>No</td>\n<td>Optional creation comment.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>No</td>\n<td>Optional external alert reference (must be unique).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationentityidentifierrequestdto\"><code>ExternalIntegrationEntityIdentifierRequestDTO</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td>enum</td>\n<td>Yes</td>\n<td>Identifier type: <code>entityId</code> or <code>entityReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Entity ID value (when <code>entityId</code>) or reference value (when <code>entityReference</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"success-response\">Success Response</h2>\n<p>Returns <code>AlertDTO</code>.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Alert ID.</td>\n</tr>\n<tr>\n<td><code>uuid</code></td>\n<td>string</td>\n<td>Alert UUID.</td>\n</tr>\n<tr>\n<td><code>entityType</code></td>\n<td>enum</td>\n<td>Alert entity type.</td>\n</tr>\n<tr>\n<td><code>entityId</code></td>\n<td>number</td>\n<td>Resolved entity ID.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Alert name.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>enum</td>\n<td><code>active</code> or <code>resolved</code>.</td>\n</tr>\n<tr>\n<td><code>creationUserType</code></td>\n<td>enum</td>\n<td><code>integration_api</code> for this flow.</td>\n</tr>\n<tr>\n<td><code>createdByUserId</code></td>\n<td>number</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>creationType</code></td>\n<td>enum</td>\n<td>Creation mode.</td>\n</tr>\n<tr>\n<td><code>resolveType</code></td>\n<td>enum</td>\n<td>Resolve type of alert.</td>\n</tr>\n<tr>\n<td><code>metricKey</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>metricValue</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>createdComment</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>resolvedComment</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>resolvedByUserId</code></td>\n<td>number</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>resolvedDate</code></td>\n<td>Date</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>createdDate</code></td>\n<td>Date</td>\n<td>Created timestamp.</td>\n</tr>\n<tr>\n<td><code>updatedDate</code></td>\n<td>Date</td>\n<td>Updated timestamp.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"entityType\": \"booking\",\n  \"entity\": {\n    \"type\": \"entityReference\",\n    \"value\": \"BKG-EXT-100\"\n  },\n  \"name\": \"Technician unavailable\",\n  \"resolveType\": \"manual\",\n  \"metricKey\": \"capacity\",\n  \"metricValue\": \"0\",\n  \"createdComment\": \"Created from external monitoring\",\n  \"reference\": \"EXT-ALERT-100\"\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 201 Created\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 10,\n  \"uuid\": \"d73c51c5-3fbe-4d8e-8f24-2ecce2f8e8e1\",\n  \"entityType\": \"booking\",\n  \"entityId\": 12345,\n  \"name\": \"Technician unavailable\",\n  \"status\": \"active\",\n  \"creationUserType\": \"integration_api\",\n  \"createdByUserId\": null,\n  \"creationType\": \"manual\",\n  \"resolveType\": \"manual\",\n  \"metricKey\": \"capacity\",\n  \"metricValue\": \"0\",\n  \"createdComment\": \"Created from external monitoring\",\n  \"reference\": \"EXT-ALERT-100\",\n  \"resolvedComment\": null,\n  \"resolvedByUserId\": null,\n  \"resolvedDate\": null,\n  \"createdDate\": \"2026-02-24T10:00:00.000Z\",\n  \"updatedDate\": \"2026-02-24T10:00:00.000Z\"\n}\n\n</code></pre>\n<h2 id=\"example-error-responses\">Example Error Responses</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"INVALID_ENTITY_IDENTIFIER_TYPE\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"BUDGET_REFERENCE_NOT_SUPPORTED\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 409,\n  \"message\": \"ALERT_REFERENCE_ALREADY_EXISTS\",\n  \"error\": \"Conflict\"\n}\n\n</code></pre>\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<ul>\n<li><p><code>entity.type</code> must be exactly <code>entityId</code> or <code>entityReference</code>; otherwise returns <code>INVALID_ENTITY_IDENTIFIER_TYPE</code>.</p>\n</li>\n<li><p>Entity resolution requires exactly one identifier value that maps to exactly one instance of the entity.</p>\n<ul>\n<li><p>If entity cannot be resolved: <code>ENTITY_NOT_FOUND</code>.</p>\n</li>\n<li><p>If reference maps to multiple entities: <code>MULTIPLE_ENTITIES_FOUND</code>.</p>\n</li>\n</ul>\n</li>\n<li><p>For <code>entityType = budget</code>, reference-based resolution is not supported yet <code>BUDGET_REFERENCE_NOT_SUPPORTED</code>.</p>\n</li>\n<li><p><code>reference</code>, when provided, must be unique; duplicate returns <code>ALERT_REFERENCE_ALREADY_EXISTS</code>.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","alert"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"f6d58258-ebe8-4770-a524-6299722964f9","name":"Create an Alert","originalRequest":{"method":"POST","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"entityType\": \"booking\",\n  \"entity\": {\n    \"type\": \"entityId\",\n    \"value\": \"1\"\n  },\n  \"name\": \"Technician unavailable\",\n  \"resolveType\": \"manual\",\n  \"metricKey\": \"capacity\",\n  \"metricValue\": \"0\",\n  \"createdComment\": \"Created from external monitoring\",\n  \"reference\": \"EXT-ALERT-100\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/alert"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"id\": 10,\n    \"uuid\": \"d73c51c5-3fbe-4d8e-8f24-2ecce2f8e8e1\",\n    \"entityType\": \"booking\",\n    \"entityId\": 1,\n    \"name\": \"Technician unavailable\",\n    \"status\": \"active\",\n    \"creationUserType\": \"integration_api\",\n    \"createdByUserId\": null,\n    \"creationType\": \"manual\",\n    \"resolveType\": \"manual\",\n    \"metricKey\": \"capacity\",\n    \"metricValue\": \"0\",\n    \"createdComment\": \"Created from external monitoring\",\n    \"reference\": \"EXT-ALERT-100\",\n    \"resolvedComment\": null,\n    \"resolvedByUserId\": null,\n    \"resolvedDate\": null,\n    \"createdDate\": \"2026-02-24T10:00:00.000Z\",\n    \"updatedDate\": \"2026-02-24T10:00:00.000Z\"\n}"}],"_postman_id":"7d2c4235-c70a-42fa-9187-402448301f73"},{"name":"Resolve Alert","id":"0a29267b-cf6b-4c03-869d-294aaa6d5af6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/alert/resolve","description":"<h2 id=\"general-description\">General Description</h2>\n<p>Resolves an existing alert by <code>alertId</code> or <code>alertReference</code>.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationresolvealertrequestdto\">Request Body: ExternalIntegrationResolveAlertRequestDTO</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>alert</code></td>\n<td><code>ExternalIntegrationAlertIdentifierRequestDTO</code></td>\n<td>Yes</td>\n<td>Alert identifier object.</td>\n</tr>\n<tr>\n<td><code>resolvedComment</code></td>\n<td>string</td>\n<td>No</td>\n<td>Optional resolution comment.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationalertidentifierrequestdto\"><code>ExternalIntegrationAlertIdentifierRequestDTO</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td>enum</td>\n<td>Yes</td>\n<td><code>alertId</code> or <code>alertReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>ID or reference value according to <code>type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"alert\": {\n    \"type\": \"alertReference\",\n    \"value\": \"EXT-ALERT-100\"\n  },\n  \"resolvedComment\": \"Issue solved by integration workflow.\"\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 10,\n  \"uuid\": \"d73c51c5-3fbe-4d8e-8f24-2ecce2f8e8e1\",\n  \"entityType\": \"booking\",\n  \"entityId\": 12345,\n  \"name\": \"Technician unavailable\",\n  \"status\": \"resolved\",\n  \"creationUserType\": \"integration_api\",\n  \"createdByUserId\": null,\n  \"creationType\": \"manual\",\n  \"resolveType\": \"manual\",\n  \"metricKey\": \"capacity\",\n  \"metricValue\": \"0\",\n  \"createdComment\": \"Created from external monitoring\",\n  \"reference\": \"EXT-ALERT-100\",\n  \"resolvedComment\": \"Issue solved by integration workflow.\",\n  \"resolvedByUserId\": null,\n  \"resolvedDate\": \"2026-02-24T10:30:00.000Z\",\n  \"createdDate\": \"2026-02-24T10:00:00.000Z\",\n  \"updatedDate\": \"2026-02-24T10:30:00.000Z\"\n}\n\n</code></pre>\n<h2 id=\"example-error-responses\">Example Error Responses</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"INVALID_ALERT_IDENTIFIER_TYPE\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"ONLY_ACTIVE_ALERT_CAN_BE_RESOLVED\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"STICKY_ALERT_CANNOT_BE_RESOLVED\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 404,\n  \"message\": \"ALERT_NOT_FOUND\",\n  \"error\": \"Not Found\"\n}\n\n</code></pre>\n<h1 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h1>\n<ul>\n<li><p><code>alert.type</code> must be <code>alertId</code> or <code>alertReference</code>; otherwise returns <code>INVALID_ALERT_IDENTIFIER_TYPE</code>.</p>\n</li>\n<li><p>If identifier is missing/empty after normalization, backend returns <code>ALERT_IDENTIFIER_REQUIRED</code>.</p>\n</li>\n<li><p>Only alerts with status <code>active</code> can be resolved: otherwise <code>ONLY_ACTIVE_ALERT_CAN_BE_RESOLVED</code>.</p>\n</li>\n<li><p>Alerts with <code>resolveType = sticky</code> cannot be resolved via API: <code>STICKY_ALERT_CANNOT_BE_RESOLVED</code>.</p>\n</li>\n<li><p>If alert does not exist: <code>ALERT_NOT_FOUND</code>.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","alert","resolve"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"d56c33d4-7fb6-4d72-9831-dbbae4605999","name":"Resolve Alert","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"alert\": {\n    \"type\": \"alertId\",\n    \"value\": \"1\"\n  },\n  \"resolvedComment\": \"Issue solved by integration workflow.\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/alert/resolve"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"0a29267b-cf6b-4c03-869d-294aaa6d5af6"},{"name":"Reopen Alert","id":"351e081a-f6ff-4a5c-9df7-cd6686819659","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/alert/reopen","description":"<h2 id=\"general-description\">General Description</h2>\n<p>Reopens a resolved alert by <code>alertId</code> or <code>alertReference</code>.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-externalintegrationreopenalertrequestdto\">Request Body: ExternalIntegrationReopenAlertRequestDTO</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>alert</code></td>\n<td><code>ExternalIntegrationAlertIdentifierRequestDTO</code></td>\n<td>Yes</td>\n<td>Alert identifier object.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationalertidentifierrequestdto\"><code>ExternalIntegrationAlertIdentifierRequestDTO</code></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td>enum</td>\n<td>Yes</td>\n<td><code>alertId</code> or <code>alertReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>ID or reference value according to <code>type</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"alert\": {\n    \"type\": \"alertId\",\n    \"value\": \"10\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">HTTP/1.1 200 OK\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 10,\n  \"uuid\": \"d73c51c5-3fbe-4d8e-8f24-2ecce2f8e8e1\",\n  \"entityType\": \"booking\",\n  \"entityId\": 12345,\n  \"name\": \"Technician unavailable\",\n  \"status\": \"active\",\n  \"creationUserType\": \"integration_api\",\n  \"createdByUserId\": null,\n  \"creationType\": \"manual\",\n  \"resolveType\": \"manual\",\n  \"metricKey\": \"capacity\",\n  \"metricValue\": \"0\",\n  \"createdComment\": \"Created from external monitoring\",\n  \"reference\": \"EXT-ALERT-100\",\n  \"resolvedComment\": \"Issue solved by integration workflow.\",\n  \"resolvedByUserId\": null,\n  \"resolvedDate\": \"2026-02-24T10:30:00.000Z\",\n  \"createdDate\": \"2026-02-24T10:00:00.000Z\",\n  \"updatedDate\": \"2026-02-24T11:00:00.000Z\"\n}\n\n</code></pre>\n<h2 id=\"example-error-responses\">Example Error Responses</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"INVALID_ALERT_IDENTIFIER_TYPE\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"ONLY_RESOLVED_ALERT_CAN_BE_REOPENED\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 400,\n  \"message\": \"STICKY_ALERT_CANNOT_BE_REOPENED\",\n  \"error\": \"Bad Request\"\n}\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"statusCode\": 404,\n  \"message\": \"ALERT_NOT_FOUND\",\n  \"error\": \"Not Found\"\n}\n\n</code></pre>\n<hr />\n<h1 id=\"business-rules--constraint\">Business Rules &amp; Constraint</h1>\n<ul>\n<li><p><code>alert.type</code> must be <code>alertId</code> or <code>alertReference</code>; otherwise returns <code>INVALID_ALERT_IDENTIFIER_TYPE</code>.</p>\n</li>\n<li><p>If identifier is missing/empty after normalization, backend returns <code>ALERT_IDENTIFIER_REQUIRED</code>.</p>\n</li>\n<li><p>Only alerts with status <code>resolved</code> can be reopened: otherwise <code>ONLY_RESOLVED_ALERT_CAN_BE_REOPENED</code>.</p>\n</li>\n<li><p>Alerts with <code>resolveType = sticky</code> cannot be reopened via API: <code>STICKY_ALERT_CANNOT_BE_REOPENED</code>.</p>\n</li>\n<li><p>If alert does not exist: <code>ALERT_NOT_FOUND</code>.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","alert","reopen"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"ef111221-4b86-42bf-9a70-b80ffa251312","name":"Reopen Alert","originalRequest":{"method":"PATCH","header":[{"key":"origin","value":"","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"alert\": {\n    \"type\": \"alertId\",\n    \"value\": \"10\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/alert/reopen"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"351e081a-f6ff-4a5c-9df7-cd6686819659"}],"id":"f504a76d-8f0d-4d3f-ad4d-8537acf8b75d","_postman_id":"f504a76d-8f0d-4d3f-ad4d-8537acf8b75d","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Catalog","item":[{"name":"Active categories","id":"fce37c50-c832-41df-be18-b20e546c7863","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"token":""},"isInherited":false},"method":"GET","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/catalog/categories","urlObject":{"path":["api","integration","catalog","categories"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"fe3ecce0-ef52-4fb6-83ec-176faa4c19e7","name":"Active categories","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer ","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/catalog/categories"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"id\": 98,\n        \"name\": \"Assembly\",\n        \"active\": true\n    },\n    {\n        \"id\": 103,\n        \"name\": \"Cortinas Roller\",\n        \"active\": true\n    },\n    {\n        \"id\": 101,\n        \"name\": \"Pisos\",\n        \"active\": true\n    }\n]"}],"_postman_id":"fce37c50-c832-41df-be18-b20e546c7863"},{"name":"Active services by category","id":"4d2f7113-a66b-4ba1-852e-dc5a04a0563e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"token":""},"isInherited":false},"method":"GET","header":[{"key":"origin","value":"","type":"text"}],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/catalog/categories/:categoryId/services","urlObject":{"path":["api","integration","catalog","categories",":categoryId","services"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[{"description":{"content":"<p>Id of the category from which to get the active services from</p>\n","type":"text/plain"},"type":"any","value":"9","key":"categoryId"}]}},"response":[{"id":"831a19b2-0121-42bf-a24e-d3fa25e60e2b","name":"Active variants by category","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer ","type":"text"}],"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/catalog/categories/:categoryId/services","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["api","integration","catalog","categories",":categoryId","services"],"variable":[{"key":"categoryId","value":"54"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"id\": 113,\n        \"name\": \"Servicio de prueba integración\",\n        \"description\": \"descripción de prueba\",\n        \"order\": 0,\n        \"image\": \"\",\n        \"variants\": [],\n        \"categories\": [],\n        \"created_date\": \"2024-01-29T11:14:51.317Z\",\n        \"active\": true\n    },\n    {\n        \"id\": 132,\n        \"name\": \"Instalación de cortinas\",\n        \"description\": \"Instalar cortinas de casa\",\n        \"order\": 0,\n        \"image\": \"\",\n        \"variants\": [],\n        \"categories\": [],\n        \"created_date\": \"2024-05-20T10:31:35.230Z\",\n        \"active\": true\n    }\n]"}],"_postman_id":"4d2f7113-a66b-4ba1-852e-dc5a04a0563e"},{"name":"Active variants by service","id":"ed44dbfa-30c6-46bb-8340-2ba30c8a06e1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"token":""},"isInherited":false},"method":"GET","header":[],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/catalog/services/:serviceId/variants","urlObject":{"path":["catalog","services",":serviceId","variants"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[{"description":{"content":"<p>Id of a service from which to get the active variants.</p>\n","type":"text/plain"},"type":"any","value":"","key":"serviceId"}]}},"response":[{"id":"c5efcef6-6f5c-451d-a4cc-7d295938c36f","name":"Active variants by service and category","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer ","type":"text"}],"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/catalog/services/:serviceId/variants","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["catalog","services",":serviceId","variants"],"variable":[{"key":"serviceId","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"id\": 284,\n        \"internal_name\": \"Variante de Servicio- Corto\",\n        \"service\": {\n            \"id\": 137,\n            \"name\": \"Servicio de Pruebas - Corto\",\n            \"serviceType\": {\n                \"id\": 1,\n                \"name\": \"B1\"\n            }\n        },\n        \"skus\": [\n            {\n                \"id\": 461,\n                \"sku\": \"sku-ucdev-7\"\n            }\n        ]\n    }\n]"}],"_postman_id":"ed44dbfa-30c6-46bb-8340-2ba30c8a06e1"}],"id":"77a39cd6-42db-4828-9096-654f7b3f3101","description":"<p>This section provides all the catalog information, including available categories, services, and variants. It serves as a reference point for key details about the services offered on the platform.</p>\n","_postman_id":"77a39cd6-42db-4828-9096-654f7b3f3101","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Configuration","item":[{"name":"Upsert variants and providers","id":"d229d7d1-2e42-4175-9595-efdd79c57ae4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/unified/upsert","description":"<h2 id=\"general-description\">General Description</h2>\n<p>This endpoint provides a unified upsert operation for creating or updating service variants and providers (professionals) in a single API call. It manages the complete lifecycle of service variants identified by SKU, providers identified by reference, and their associated configurations including provider-variant associations, availability schedules, and working areas.</p>\n<p>The endpoint processes execution variants only (not budgeted variants).</p>\n<p>This endpoint is specifically designed for external integration systems to synchronize professional data and service configurations. It supports creating or updating professionals that are either natural persons or networks, but must not be used for technicians that belong to a company.</p>\n<hr />\n<h2 id=\"field-definitions\">Field Definitions</h2>\n<h3 id=\"request-body-unifiedproviderandvariantupsertrequestdto\">Request Body: UnifiedProviderAndVariantUpsertRequestDTO</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>providers</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of provider objects to create or update. If omitted, only variants will be processed.</td>\n</tr>\n<tr>\n<td><code>variants</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of service variant objects to create or update. If omitted, only providers will be processed.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"unifiedproviderdto\">UnifiedProviderDTO</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>reference</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique reference identifier for the provider. Used to identify existing providers for updates.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>No</td>\n<td>Status for the provider. If not included, default status for new provider is <code>accepted</code>. If included, must be <code>accepted</code> or <code>rejected</code>.</td>\n</tr>\n<tr>\n<td><code>basicInformation</code></td>\n<td>ExternalIntegrationCreateUserBasicInformationRequestDTO</td>\n<td>Yes</td>\n<td>Basic user information for the provider.</td>\n</tr>\n<tr>\n<td><code>workOnHolidays</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the provider works on holidays. Defaults to false if not provided.</td>\n</tr>\n<tr>\n<td><code>isCompany</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the provider is a company. Defaults to false if not provided.</td>\n</tr>\n<tr>\n<td><code>isMainProviderEligible</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the provider is eligible to be assigned as the main provider. Defaults to true if not provided.</td>\n</tr>\n<tr>\n<td><code>isLeadAssignmentEligible</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether the provider is eligible for lead assignment. Defaults to true if not provided.</td>\n</tr>\n<tr>\n<td><code>service_variants</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of service variants associated with this provider. Variants can be referenced by ID or SKU.</td>\n</tr>\n<tr>\n<td><code>availability</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of availability schedules defining when the provider is available.</td>\n</tr>\n<tr>\n<td><code>areas</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of working areas where the provider operates. Areas can be referenced by ID or reference.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationcreateuserbasicinformationrequestdto\">ExternalIntegrationCreateUserBasicInformationRequestDTO</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>Provider's first name.</td>\n</tr>\n<tr>\n<td><code>lastName</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Provider's last name.</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Provider's phone number.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Provider's email address. Must be unique in the system.</td>\n</tr>\n<tr>\n<td><code>identificationNumber</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Provider's identification number (e.g., national ID, passport).</td>\n</tr>\n<tr>\n<td><code>identificationNumberCountry</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Country code for the identification number.</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>No</td>\n<td>Optional reference identifier (separate from provider reference).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"externalintegrationvariantobjectrequestdto\">ExternalIntegrationVariantObjectRequestDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of variant identifier. Must be one of: <code>variantId</code> or <code>variantSku</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The variant ID (if type is <code>variantId</code>) or SKU (if type is <code>variantSku</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"provideravailabilitydto\">ProviderAvailabilityDTO</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>day_of_week</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>Day of the week (0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday).</td>\n</tr>\n<tr>\n<td><code>start_time</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Start time in HH:mm format (e.g., \"09:00\").</td>\n</tr>\n<tr>\n<td><code>end_time</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>End time in HH:mm format (e.g., \"17:00\").</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"providerareadto\">ProviderAreaDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of area identifier. Must be one of: <code>areaId</code> or <code>areaReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The area ID (if type is <code>areaId</code>) or area reference (if type is <code>areaReference</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"unifiedvariantdto\">UnifiedVariantDTO</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>sku</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Stock Keeping Unit (SKU) identifier. Must be unique across all variants. Used to identify existing variants for updates.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Internal name of the service variant.</td>\n</tr>\n<tr>\n<td><code>isInStore</code></td>\n<td>boolean</td>\n<td>Yes</td>\n<td>Whether this variant is available for in-store services.</td>\n</tr>\n<tr>\n<td><code>isExecution</code></td>\n<td>boolean</td>\n<td>Yes</td>\n<td>Whether this is an execution variant. Only execution variants (true) are processed by this endpoint. Budget variants (false) are skipped.</td>\n</tr>\n<tr>\n<td><code>parentService</code></td>\n<td>ParentServiceDTO</td>\n<td>Yes</td>\n<td>Parent service information. If the service or category doesn't exist, it will be created.</td>\n</tr>\n<tr>\n<td><code>operationAreas</code></td>\n<td>VariantOperationAreasDTO</td>\n<td>No</td>\n<td>Object containing operation area configurations with <code>detailed</code> (specific areas) and/or <code>all</code> (default parameters for remaining areas).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"parentservicedto\">ParentServiceDTO</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 of the service. Service matching is done using normalized string comparison (case-insensitive, accent-insensitive).</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>No</td>\n<td>Description of the service.</td>\n</tr>\n<tr>\n<td><code>category</code></td>\n<td>ParentServiceCategoryDTO</td>\n<td>Yes</td>\n<td>Category information for the service.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"parentservicecategorydto\">ParentServiceCategoryDTO</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 of the category. Category matching is done using normalized string comparison (case-insensitive, accent-insensitive).</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>No</td>\n<td>Description of the category.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"variantoperationareasdto\">VariantOperationAreasDTO</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>all</code></td>\n<td>VariantOperationAreasAllDTO</td>\n<td>No</td>\n<td>Default parameters to apply to all active areas that are not explicitly covered by <code>detailed</code>. If provided, these parameters will be applied to all remaining areas after processing <code>detailed</code> entries. This allows setting default pricing and duration for all areas not specifically configured.</td>\n</tr>\n<tr>\n<td><code>detailed</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of specific operation area configurations. Each entry defines pricing, duration, and area coverage for specific areas. Areas specified in <code>detailed</code> take precedence over <code>all</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"variantoperationareadto\">VariantOperationAreaDTO</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>enum</td>\n<td>Yes</td>\n<td>Type of area identifier. Must be one of: <code>areaId</code> or <code>areaReference</code>.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>Array</td>\n<td>Yes</td>\n<td>Array of area identifiers. Each value should be an area ID (if type is <code>areaId</code>) or area reference (if type is <code>areaReference</code>). Areas are automatically grouped by currency for operation variant creation.</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>string</td>\n<td>No</td>\n<td>Duration of the operation in minutes (as a string, e.g., \"60\").</td>\n</tr>\n<tr>\n<td><code>bookingAnticipationHours</code></td>\n<td>number</td>\n<td>No</td>\n<td>Number of hours in advance a booking must be made for this operation.</td>\n</tr>\n<tr>\n<td><code>price</code></td>\n<td>number</td>\n<td>No</td>\n<td>Price for this operation variant.</td>\n</tr>\n<tr>\n<td><code>cost</code></td>\n<td>number</td>\n<td>No</td>\n<td>Cost for this operation variant.</td>\n</tr>\n<tr>\n<td><code>requireEvidence</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether evidence is required for this operation.</td>\n</tr>\n<tr>\n<td><code>requireSignature</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Whether a signature is required for this operation.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"variantoperationareasalldto\">VariantOperationAreasAllDTO</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>duration</code></td>\n<td>string</td>\n<td>No</td>\n<td>Default duration of the operation in minutes (as a string, e.g., \"60\"). Applied to all remaining areas not covered by <code>detailed</code>.</td>\n</tr>\n<tr>\n<td><code>bookingAnticipationHours</code></td>\n<td>number</td>\n<td>No</td>\n<td>Default number of hours in advance a booking must be made for this operation. Applied to all remaining areas not covered by <code>detailed</code>.</td>\n</tr>\n<tr>\n<td><code>price</code></td>\n<td>number</td>\n<td>No</td>\n<td>Default price for operation variants. Applied to all remaining areas not covered by <code>detailed</code>.</td>\n</tr>\n<tr>\n<td><code>cost</code></td>\n<td>number</td>\n<td>No</td>\n<td>Default cost for operation variants. Applied to all remaining areas not covered by <code>detailed</code>.</td>\n</tr>\n<tr>\n<td><code>requireEvidence</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Default requirement for evidence. Applied to all remaining areas not covered by <code>detailed</code>.</td>\n</tr>\n<tr>\n<td><code>requireSignature</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Default requirement for signature. Applied to all remaining areas not covered by <code>detailed</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-unifiedproviderandvariantupsertresponsedto\">Response: UnifiedProviderAndVariantUpsertResponseDTO</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>success</code></td>\n<td>boolean</td>\n<td>Yes</td>\n<td>Indicates whether all operations completed successfully.</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>No</td>\n<td>Human-readable message describing the operation result.</td>\n</tr>\n<tr>\n<td><code>variantsProcessed</code></td>\n<td>number</td>\n<td>No</td>\n<td>Number of variants successfully processed.</td>\n</tr>\n<tr>\n<td><code>providersProcessed</code></td>\n<td>number</td>\n<td>No</td>\n<td>Number of providers successfully processed.</td>\n</tr>\n<tr>\n<td><code>errors</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Array of error messages if any operations failed. Each error message includes the identifier (SKU or reference) and the error description.</td>\n</tr>\n<tr>\n<td><code>variantResults</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Detailed processing results for each variant, including variant ID, SKU, success status, and error message if applicable.</td>\n</tr>\n<tr>\n<td><code>providerResults</code></td>\n<td>Array</td>\n<td>No</td>\n<td>Detailed processing results for each provider, including provider ID, reference, success status, and error message if applicable.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"variantprocessingresult\">VariantProcessingResult</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>variantId</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>The ID of the variant that was processed (created or updated).</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The SKU identifier of the variant.</td>\n</tr>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td>Yes</td>\n<td>Indicates whether this specific variant was processed successfully.</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>No</td>\n<td>Error message if the variant processing failed. Only present when <code>success</code> is false.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"providerprocessingresult\">ProviderProcessingResult</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>providerId</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>The ID of the provider that was processed (created or updated).</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The reference identifier of the provider.</td>\n</tr>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td>Yes</td>\n<td>Indicates whether this specific provider was processed successfully.</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>No</td>\n<td>Error message if the provider processing failed. Only present when <code>success</code> is false.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"business-rules--constraints\">Business Rules &amp; Constraints</h2>\n<h3 id=\"provider-type-restrictions\">Provider Type Restrictions</h3>\n<ul>\n<li><p>This endpoint only supports creating or updating professionals that are either:</p>\n<ul>\n<li><p><strong>Natural persons</strong> (individual providers with <code>isCompany: false</code> and no parent relationship)</p>\n</li>\n<li><p><strong>Networks</strong> (providers with <code>isCompany: true</code> that act as parent organizations)</p>\n</li>\n</ul>\n</li>\n<li><p>It <strong>MUST NOT</strong> be used to create or update technicians that belong to a company (providers with a <code>parent</code> relationship). Attempting to update a provider that has an existing parent relationship will result in an error.</p>\n</li>\n</ul>\n<h3 id=\"variant-sku-uniqueness\">Variant SKU Uniqueness</h3>\n<ul>\n<li><p>Each service variant SKU sent in the request <strong>MUST be unique</strong> in the system.</p>\n</li>\n<li><p>If more than one variant is found for the same SKU, the operation for that SKU <strong>must fail</strong> and be stored as an error.</p>\n</li>\n<li><p>No partial processing should occur for that SKU—the entire variant upsert operation for that SKU is rejected.</p>\n</li>\n</ul>\n<h3 id=\"service-and-category-changes\">Service and Category Changes</h3>\n<ul>\n<li><p>If a SKU sent in the variants payload matches an existing variant, but the service or category differs from the existing one:</p>\n<ul>\n<li><p>The variant and all its operation variants will be <strong>moved</strong> from the existing service to the new service provided in the request.</p>\n</li>\n<li><p>If the category differs, the variant will be moved under the new category provided in the request.</p>\n</li>\n<li><p>This operation preserves all existing operation variants and their configurations—only the service and category associations are updated.</p>\n</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"operation-variants-preservation\">Operation Variants Preservation</h3>\n<ul>\n<li><p><strong>Operation variants are NEVER deleted</strong> by the algorithm. The system preserves all existing operation variants and only updates or reassigns them based on the incoming payload.</p>\n</li>\n<li><p><strong>Operation variants NEVER will end without being associated to an operation area.</strong> The re-shuffle logic ensures that all operation variants maintain at least one area association.</p>\n</li>\n</ul>\n<h3 id=\"execution-variants-only\">Execution Variants Only</h3>\n<ul>\n<li>Only variants with <code>isExecution: true</code> are processed. Variants with <code>isExecution: false</code> are skipped with a warning log entry and do not count toward the <code>variantsProcessed</code> total.</li>\n</ul>\n<hr />\n<h2 id=\"update-strategy-code-driven-behavior\">Update Strategy (Code-Driven Behavior)</h2>\n<p>When a provider is sent and it already exists (identified by <code>reference</code>), the update strategy follows this pattern:</p>\n<h3 id=\"keep-what-matches\">Keep What Matches</h3>\n<ul>\n<li>Elements present in both the existing configuration and the incoming payload are preserved.</li>\n</ul>\n<h3 id=\"remove-what-is-not-sent-anymore\">Remove What Is Not Sent Anymore</h3>\n<ul>\n<li>Elements that exist in the current configuration but are not included in the incoming payload are removed.</li>\n</ul>\n<h3 id=\"add-new-elements\">Add New Elements</h3>\n<ul>\n<li>Elements present in the incoming payload that don't exist in the current configuration are created.</li>\n</ul>\n<p>This behavior applies to the following provider configuration sections:</p>\n<h3 id=\"workingareas-areas-field\">workingAreas (<code>areas</code> field)</h3>\n<ul>\n<li><p><strong>Keep</strong>: Working areas that match areas in the incoming <code>areas</code> array are preserved.</p>\n</li>\n<li><p><strong>Remove</strong>: Working areas that exist but are not in the incoming <code>areas</code> array are deleted.</p>\n</li>\n<li><p><strong>Add</strong>: New working areas are created for areas in the incoming <code>areas</code> array that don't have an existing working area association.</p>\n</li>\n</ul>\n<h3 id=\"availabilities-availability-field\">availabilities (<code>availability</code> field)</h3>\n<ul>\n<li><strong>Replace All</strong>: The availability update strategy replaces all existing availabilities with the new set provided in the <code>availability</code> array. This is a complete reset operation—all previous availability records are deleted and new ones are created from the payload.</li>\n</ul>\n<h3 id=\"professionalservicevariants-service_variants-field\">professionalServiceVariants (<code>service_variants</code> field)</h3>\n<ul>\n<li><p><strong>Keep</strong>: Provider-variant associations that match variants in the incoming <code>service_variants</code> array are preserved.</p>\n</li>\n<li><p><strong>Remove</strong>: Provider-variant associations for variants not included in the incoming <code>service_variants</code> array are deleted.</p>\n</li>\n<li><p><strong>Add</strong>: New provider-variant associations are created for variants in the incoming <code>service_variants</code> array that don't have an existing association.</p>\n</li>\n</ul>\n<p><strong>Note</strong>: Provider basic information fields (<code>isMainProviderEligible</code>, <code>isLeadAssignmentEligible</code>, <code>workOnHolidays</code>) are updated directly from the payload values. The <code>isCompany</code> field is only set during creation and is not updated for existing providers.</p>\n<hr />\n<h2 id=\"operation-variants-re-shuffle-logic\">Operation Variants Re-shuffle Logic</h2>\n<p>When an existing service variant is sent with operation area configurations (via the <code>operationAreas</code> object), the system performs intelligent re-shuffling of operation variants rather than deleting and recreating them. The algorithm supports two configuration modes: <code>detailed</code> (specific area configurations) and <code>all</code> (default parameters for remaining areas).</p>\n<h3 id=\"processing-flow\">Processing Flow</h3>\n<p>The system processes operation areas in two phases:</p>\n<h4 id=\"phase-1-processing-detailed-entries\">Phase 1: Processing <code>detailed</code> Entries</h4>\n<ol>\n<li><p><strong>Area Resolution and Currency Grouping</strong></p>\n<ul>\n<li><p>Each area value in each <code>detailed</code> entry is resolved to an Area entity with its associated currency.</p>\n</li>\n<li><p>Areas are automatically grouped by currency—one VariantOperation is created or updated per currency group.</p>\n</li>\n<li><p>The system tracks which areas have been processed in this phase.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Conflict Detection</strong></p>\n<ul>\n<li><p>For each currency group, the system identifies existing operation variants that have overlapping areas (same currency, shared area IDs).</p>\n</li>\n<li><p>If no conflicts exist, a new operation variant is created with the specified areas and parameters.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Conflict Resolution Strategy</strong></p>\n<ul>\n<li><p><strong>Operations with Remaining Areas</strong>: If an existing operation variant has both overlapping areas (that need to be reassigned) and non-overlapping areas (that should remain), the system:</p>\n<ul>\n<li><p>Removes the overlapping areas from the existing operation variant</p>\n</li>\n<li><p>Updates the operation variant to keep only the remaining areas</p>\n</li>\n<li><p>Preserves the existing operation variant's parameters (duration, cost, price, etc.)</p>\n</li>\n<li><p>The freed overlapping areas are added to the working set for reassignment</p>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><p><strong>Operations That Would Become Empty</strong></p>\n<ul>\n<li><p>If an existing operation variant would become empty (all its areas are being reassigned), the system:</p>\n<ul>\n<li><p>Sorts these operations by area count (fewest first) for deterministic processing</p>\n</li>\n<li><p>Updates all but the last operation with the new parameters and keeps their existing areas</p>\n</li>\n<li><p>Removes these areas from the working set</p>\n</li>\n<li><p>Updates the last operation with the new parameters and assigns all remaining areas from the working set to it</p>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><p><strong>New Operation Creation</strong></p>\n<ul>\n<li>If any areas remain in the working set after conflict resolution, a new operation variant is created with those areas and the specified parameters.</li>\n</ul>\n</li>\n</ol>\n<h4 id=\"phase-2-processing-all-parameters-if-provided\">Phase 2: Processing <code>all</code> Parameters (if provided)</h4>\n<ol>\n<li><p><strong>Remaining Areas Identification</strong></p>\n<ul>\n<li><p>The system retrieves all active areas in the system.</p>\n</li>\n<li><p>It filters out areas that were already processed in Phase 1 (from <code>detailed</code> entries).</p>\n</li>\n<li><p>The remaining unprocessed areas are identified.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Synthetic DTO Creation</strong></p>\n<ul>\n<li><p>For the remaining areas, the system creates synthetic <code>VariantOperationAreaDTO</code> objects using the parameters from the <code>all</code> configuration.</p>\n</li>\n<li><p>These synthetic DTOs use <code>AREA_ID</code> type and include all remaining area IDs.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Processing Remaining Areas</strong></p>\n<ul>\n<li><p>The synthetic DTOs are processed using the same conflict resolution logic as Phase 1.</p>\n</li>\n<li><p>This ensures that all remaining areas receive the default parameters specified in <code>all</code>.</p>\n</li>\n</ul>\n</li>\n</ol>\n<h3 id=\"key-principles\">Key Principles</h3>\n<ul>\n<li><p><strong>No Deletion</strong>: Operation variants are never deleted. They are either updated with new areas/parameters or preserved as-is.</p>\n</li>\n<li><p><strong>Area Preservation</strong>: All areas specified in the request (either explicitly in <code>detailed</code> or implicitly via <code>all</code>) are assigned to operation variants—no areas are lost.</p>\n</li>\n<li><p><strong>Parameter Updates</strong>: When an operation variant is updated, its parameters (duration, cost, price, bookingAnticipationHours) are updated to match the incoming DTO values.</p>\n</li>\n<li><p><strong>Currency Isolation</strong>: Operation variants are always grouped by currency. Areas with different currencies are never mixed in the same operation variant.</p>\n</li>\n<li><p><strong>Priority</strong>: <code>detailed</code> entries take precedence over <code>all</code>. Areas specified in <code>detailed</code> are processed first, and <code>all</code> parameters are only applied to areas not covered by <code>detailed</code>.</p>\n</li>\n</ul>\n<h3 id=\"usage-patterns\">Usage Patterns</h3>\n<h4 id=\"pattern-1-detailed-configuration-only\">Pattern 1: Detailed Configuration Only</h4>\n<p>Use <code>detailed</code> when you need specific configurations for specific areas:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"operationAreas\": {\n    \"detailed\": [\n      {\n        \"type\": \"areaReference\",\n        \"value\": [\"AREA-001\", \"AREA-002\"],\n        \"price\": 150.0,\n        \"duration\": \"120\"\n      }\n    ]\n  }\n}\n\n</code></pre>\n<h4 id=\"pattern-2-all-areas-with-default-parameters\">Pattern 2: All Areas with Default Parameters</h4>\n<p>Use <code>all</code> when you want to apply the same parameters to all active areas:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"operationAreas\": {\n    \"all\": {\n      \"price\": 100.0,\n      \"duration\": \"60\",\n      \"cost\": 50.0\n    }\n  }\n}\n\n</code></pre>\n<h4 id=\"pattern-3-mixed-configuration-recommended\">Pattern 3: Mixed Configuration (Recommended)</h4>\n<p>Use both <code>detailed</code> and <code>all</code> when you need specific configurations for some areas and default parameters for the rest:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"operationAreas\": {\n    \"detailed\": [\n      {\n        \"type\": \"areaReference\",\n        \"value\": [\"AREA-001\"],\n        \"price\": 200.0,\n        \"duration\": \"180\"\n      }\n    ],\n    \"all\": {\n      \"price\": 100.0,\n      \"duration\": \"60\"\n    }\n  }\n}\n\n</code></pre>\n<p>In this example, AREA-001 gets the specific configuration (price: 200.0, duration: 180), while all other active areas get the default parameters (price: 100.0, duration: 60).</p>\n<h3 id=\"example-scenario\">Example Scenario</h3>\n<p><strong>Existing State:</strong></p>\n<ul>\n<li><p>Operation Variant A: Areas [1, 2, 3], Currency USD, Price $100</p>\n</li>\n<li><p>Operation Variant B: Areas [4, 5], Currency USD, Price $80</p>\n</li>\n<li><p>System has 10 total active areas: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</p>\n</li>\n</ul>\n<p><strong>Incoming Request:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"operationAreas\": {\n    \"detailed\": [\n      {\n        \"type\": \"areaId\",\n        \"value\": [\"2\", \"3\", \"6\"],\n        \"price\": 120.0,\n        \"duration\": \"90\"\n      }\n    ],\n    \"all\": {\n      \"price\": 80.0,\n      \"duration\": \"60\"\n    }\n  }\n}\n\n</code></pre>\n<p><strong>Result:</strong></p>\n<ul>\n<li><p>Operation Variant A: Updated to Areas [1], Currency USD, Price $100 (areas 2, 3 removed, but price preserved since not in detailed)</p>\n</li>\n<li><p>Operation Variant B: Updated to Areas [4, 5], Currency USD, Price $80 (parameters updated from <code>all</code>)</p>\n</li>\n<li><p>New Operation Variant C: Areas [2, 3, 6], Currency USD, Price $120, Duration 90 (created from <code>detailed</code>)</p>\n</li>\n<li><p>New Operation Variant D: Areas [7, 8, 9, 10], Currency USD, Price $80, Duration 60 (created from <code>all</code> for remaining areas)</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"example-request\">Example Request</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"variants\": [\n    {\n      \"sku\": \"SV-001\",\n      \"name\": \"Standard Cleaning Service\",\n      \"isInStore\": false,\n      \"isExecution\": true,\n      \"parentService\": {\n        \"name\": \"Cleaning Services\",\n        \"description\": \"Professional cleaning services\",\n        \"category\": {\n          \"name\": \"Home Services\",\n          \"description\": \"Services for home maintenance\"\n        }\n      },\n      \"operationAreas\": {\n        \"detailed\": [\n          {\n            \"type\": \"areaReference\",\n            \"value\": [\"AREA-001\", \"AREA-002\"],\n            \"duration\": \"120\",\n            \"price\": 150.0,\n            \"cost\": 100.0,\n            \"bookingAnticipationHours\": 24\n          }\n        ],\n        \"all\": {\n          \"duration\": \"60\",\n          \"price\": 100.0,\n          \"cost\": 50.0,\n          \"bookingAnticipationHours\": 12\n        }\n      }\n    }\n  ],\n  \"providers\": [\n    {\n      \"reference\": \"PROV-001\",\n      \"basicInformation\": {\n        \"name\": \"John\",\n        \"lastName\": \"Doe\",\n        \"email\": \"john.doe@example.com\",\n        \"phoneNumber\": \"+1234567890\",\n        \"identificationNumber\": \"12345678\",\n        \"identificationNumberCountry\": \"US\"\n      },\n      \"isCompany\": false,\n      \"workOnHolidays\": false,\n      \"isMainProviderEligible\": true,\n      \"isLeadAssignmentEligible\": true,\n      \"service_variants\": [\n        {\n          \"type\": \"variantSku\",\n          \"value\": \"SV-001\"\n        }\n      ],\n      \"availability\": [\n        {\n          \"day_of_week\": 1,\n          \"start_time\": \"09:00\",\n          \"end_time\": \"17:00\"\n        },\n        {\n          \"day_of_week\": 2,\n          \"start_time\": \"09:00\",\n          \"end_time\": \"17:00\"\n        }\n      ],\n      \"areas\": [\n        {\n          \"type\": \"areaReference\",\n          \"value\": \"AREA-001\"\n        }\n      ]\n    }\n  ]\n}\n\n</code></pre>\n<h2 id=\"example-response\">Example Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": true,\n  \"message\": \"All operations completed successfully\",\n  \"variantsProcessed\": 1,\n  \"providersProcessed\": 1,\n  \"variantResults\": [\n    {\n      \"variantId\": 123,\n      \"sku\": \"SV-001\",\n      \"success\": true\n    }\n  ],\n  \"providerResults\": [\n    {\n      \"providerId\": 456,\n      \"reference\": \"PROV-001\",\n      \"success\": true\n    }\n  ]\n}\n\n</code></pre>\n<h2 id=\"example-error-response\">Example Error Response</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": false,\n  \"message\": \"Completed with 2 error(s)\",\n  \"variantsProcessed\": 0,\n  \"providersProcessed\": 1,\n  \"errors\": [\n    \"Variant SV-001: Multiple variants found for the same SKU\",\n    \"Provider PROV-002: Provider cannot be part of a network\"\n  ],\n  \"variantResults\": [\n    {\n      \"variantId\": 0,\n      \"sku\": \"SV-001\",\n      \"success\": false,\n      \"error\": \"Multiple variants found for the same SKU\"\n    }\n  ],\n  \"providerResults\": [\n    {\n      \"providerId\": 456,\n      \"reference\": \"PROV-001\",\n      \"success\": true\n    },\n    {\n      \"providerId\": 0,\n      \"reference\": \"PROV-002\",\n      \"success\": false,\n      \"error\": \"Provider cannot be part of a network\"\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"protocol":"https","path":["api","integration","unified","upsert"],"host":["{{ENVIRONMENT}}","integration","cl","sodtrack-shared","sodtrack","com"],"query":[],"variable":[]}},"response":[{"id":"2cb7d153-d2c1-4deb-951f-4cc46946819a","name":"Upsert variants and providers","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"variants\": [\n        {\n            \"sku\": \"SV-001\",\n            \"name\": \"Standard Cleaning Service\",\n            \"isInStore\": false,\n            \"isExecution\": true,\n            \"parentService\": {\n                \"name\": \"Cleaning Services\",\n                \"description\": \"Professional cleaning services\",\n                \"category\": {\n                    \"name\": \"Home Services\",\n                    \"description\": \"Services for home maintenance\"\n                }\n            },\n            \"operationAreas\": {\n                \"detailed\": [\n                    {\n                        \"type\": \"areaReference\",\n                        \"value\": [\n                            \"AREA-001\",\n                            \"AREA-002\"\n                        ],\n                        \"duration\": \"120\",\n                        \"price\": 150.0,\n                        \"cost\": 100.0,\n                        \"bookingAnticipationHours\": 24\n                    }\n                ],\n                \"all\": {\n                    \"duration\": \"110\",\n                    \"price\": 160.0,\n                    \"cost\": 80.0\n                }\n            }\n        }\n    ],\n    \"providers\": [\n        {\n            \"reference\": \"PROV-001\",\n            \"status\": \"accepted\",\n            \"basicInformation\": {\n                \"name\": \"John\",\n                \"lastName\": \"Doe\",\n                \"email\": \"john.doe@example.com\",\n                \"phoneNumber\": \"+1234567890\",\n                \"identificationNumber\": \"12345678\",\n                \"identificationNumberCountry\": \"US\"\n            },\n            \"isCompany\": false,\n            \"workOnHolidays\": false,\n            \"isMainProviderEligible\": true,\n            \"isLeadAssignmentEligible\": true,\n            \"service_variants\": [\n                {\n                    \"type\": \"variantSku\",\n                    \"value\": \"SV-001\"\n                }\n            ],\n            \"availability\": [\n                {\n                    \"day_of_week\": 1,\n                    \"start_time\": \"09:00\",\n                    \"end_time\": \"17:00\"\n                },\n                {\n                    \"day_of_week\": 2,\n                    \"start_time\": \"09:00\",\n                    \"end_time\": \"17:00\"\n                }\n            ],\n            \"areas\": [\n                {\n                    \"type\": \"areaReference\",\n                    \"value\": \"AREA-001\"\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/unified/upsert"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"All operations completed successfully\",\n    \"variantsProcessed\": 1,\n    \"providersProcessed\": 1,\n    \"variantResults\": [\n        {\n            \"variantId\": 123,\n            \"sku\": \"SV-001\",\n            \"success\": true\n        }\n    ],\n    \"providerResults\": [\n        {\n            \"providerId\": 456,\n            \"reference\": \"PROV-001\",\n            \"success\": true\n        }\n    ]\n}"}],"_postman_id":"d229d7d1-2e42-4175-9595-efdd79c57ae4"}],"id":"52dc3d58-d831-419b-9c6b-a3e535ef7b02","_postman_id":"52dc3d58-d831-419b-9c6b-a3e535ef7b02","description":"","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"Coverage","item":[{"name":"Coverage by geographical reference and sku or variant id","id":"5591d11d-61f1-407c-9a80-78277dc32ce4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"token":""},"isInherited":false},"method":"GET","header":[],"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/coverage/check?lat={{LATITUDE}}&lng={{LONGITUDE}}&variantId={{VARIANTID}}&sku={{SKU}}","urlObject":{"path":["api","integration","coverage","check"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[{"description":{"content":"<p>[Float] - Latitude, geographical reference of the address</p>\n","type":"text/plain"},"key":"lat","value":"{{LATITUDE}}"},{"description":{"content":"<p>[Float] - Longitude, geographical reference of the address</p>\n","type":"text/plain"},"key":"lng","value":"{{LONGITUDE}}"},{"description":{"content":"<p>[CONDITIONAL] - Variant identifier. Not required if sku is provided.</p>\n","type":"text/plain"},"key":"variantId","value":"{{VARIANTID}}"},{"description":{"content":"<p>[CONDITIONAL] - SKU identifier. If this parameter is provided, variantId is not needed.</p>\n","type":"text/plain"},"key":"sku","value":"{{SKU}}"}],"variable":[]}},"response":[{"id":"c9235db4-76a7-4746-8d49-163d76ad5566","name":"Coverage by geographical reference and variant id","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer ","type":"text"}],"url":{"raw":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/coverage/check?lat=-33.57432&lng=-77.4324&sku=11221323","host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"path":["coverage","check"],"query":[{"key":"lat","value":"-33.57432"},{"key":"lng","value":"-77.4324"},{"key":"sku","value":"11221323","type":"text"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":" true"}],"_postman_id":"5591d11d-61f1-407c-9a80-78277dc32ce4"},{"name":"Available Dates","id":"1d431fa5-c3d2-4a18-993e-e0f392f58919","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"location\": { //Required\n        \"type\": \"string\", //\"coordinates\" | \"areaId\" | \"areaReference\",\n        \"value\": \"number | Object\" //number | { lat: number, lng: number }\n    },\n    \"variant\": { //Required\n        \"type\": \"string\", //'variantSku' | 'variantId'\n        \"value\": \"string\"\n    },\n    \"provider\": {\n        \"type\": \"string\", //'providerId' | 'providerReference'\n        \"value\": \"string\"\n    },\n    \"startDate\": \"YYYY-MM-dd\", //Optional, default now()\n    \"quantityOfDays\": \"number\" //Optional, default 5\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/dates/check","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Retrieves the available <strong>dates</strong> for performing a specific service, based on the requested <strong>location</strong>, <strong>service variant</strong>, and optional <strong>provider</strong> parameters.</p>\n<p>This endpoint allows client systems to display valid scheduling options to customers, ensuring that the selected date corresponds to Sodtrack’s real-time contractor availability.</p>\n<h4 id=\"field-definitions\"><strong>Field Definitions</strong></h4>\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</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Defines the geographical reference for checking service availability.</td>\n</tr>\n<tr>\n<td><code>location.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Determines how the location is identified. Accepted values:  <br />• <code>\"coordinates\"</code> — Uses geographic coordinates.  <br />• <code>\"areaId\"</code> — Uses the internal Sodtrack area identifier.  <br />• <code>\"areaReference\"</code> — Uses the SKU associated with a predefined service area.</td>\n</tr>\n<tr>\n<td><code>location.value</code></td>\n<td><code>object</code> or <code>number</code> or <code>string</code></td>\n<td>✅</td>\n<td>The value corresponding to the selected <code>location.type</code>:  <br />  <br /><strong>If</strong> <strong><code>type = \"coordinates\"</code></strong> → must be an <strong>object</strong>:  <br /><code>{ \"lat\": number, \"lng\": number }</code>  <br />  <br /><strong>If</strong> <strong><code>type = \"areaReferenceId\"</code></strong> → must be a <strong>number</strong> representing the internal area ID.  <br />  <br /><strong>If</strong> <strong><code>type = \"areaReference\"</code></strong> → must be a <strong>string</strong> representing the area Reference.</td>\n</tr>\n<tr>\n<td><code>variant</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Identifies the specific service variant to check availability for.</td>\n</tr>\n<tr>\n<td><code>variant.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Type of variant identifier. Options: <code>\"variantSku\"</code> or <code>\"variantId\"</code>.</td>\n</tr>\n<tr>\n<td><code>variant.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The SKU or ID of the variant, matching the selected <code>variant.type</code>.</td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>(Optional) Restricts availability to a specific contractor.</td>\n</tr>\n<tr>\n<td><code>provider.type</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Type of provider identifier. Options: <code>\"providerId\"</code> or <code>\"providerReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>provider.value</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>The corresponding provider ID or external reference.</td>\n</tr>\n<tr>\n<td><code>startDate</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>The first date (inclusive) to begin checking for availability. Format: <code>YYYY-MM-DD</code>. Default: current date.</td>\n</tr>\n<tr>\n<td><code>quantityOfDays</code></td>\n<td><code>number</code></td>\n<td>❌</td>\n<td>Number of consecutive days (from <code>startDate</code>) to check for availability. Default: <code>5</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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>dates</code></td>\n<td><code>array[string]</code></td>\n<td>List of available dates (in <code>YYYY-MM-DD</code> format) where the service can be scheduled.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error Code / Key</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>Missing or invalid request parameters.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Missing or expired authentication token.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized to access this resource.</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>—</td>\n<td>The specified variant or provider does not exist or is not linked to the given location.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server error. Contact support if the issue persists.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"business-logic-notes\"><strong>Business Logic Notes</strong></h3>\n<ul>\n<li><p>Availability is determined based on <strong>contractor coverage</strong>, <strong>variant eligibility</strong>, and <strong>existing bookings</strong>.</p>\n</li>\n<li><p>When <code>provider</code> is omitted, the API returns aggregate availability across all eligible providers.</p>\n</li>\n<li><p>If <code>location.type = \"coordinates\"</code>, the system automatically determines the coverage area based on geolocation.</p>\n</li>\n<li><p>Returned dates are always formatted as <strong>ISO 8601</strong> (<code>YYYY-MM-DD</code>).</p>\n</li>\n<li><p>If no available dates are found, an empty array is returned:</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","dates","check"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"d4b68a89-b7d8-452d-8056-a9b1e6753cd3","name":"Available Dates","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"location\": {\n        \"type\": \"areaId\",\n        \"value\": \"1\"\n    },\n    \"variant\": {\n        \"type\": \"variantSku\",\n        \"value\": \"A123343\"\n    },\n    \"provider\": {\n        \"type\": \"providerReference\",\n        \"value\": \"juan_magan\"\n    },\n    \"startDate\": \"2025-01-01\",\n    \"quantityOfDays\": \"3\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/dates/check"},"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"dates\": [\n        \"2025-01-01\",\n        \"2025-01-02\",\n        \"2025-01-03\",\n    ]\n}"}],"_postman_id":"1d431fa5-c3d2-4a18-993e-e0f392f58919"},{"name":"Available Hours by Date","id":"79593d8e-708b-4537-b852-5353ef7a5f96","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"location\": { //Required\n        \"type\": \"string\", //\"coordinates\" | \"areaId\" | \"areaReference\",\n        \"value\": \"number | Object\" //number | { lat: number, lng: number }\n    },\n    \"variant\": { //Required\n        \"type\": \"string\", //'variantSku' | 'variantId'\n        \"value\": \"string\"\n    },\n    \"provider\": {\n        \"type\": \"string\", //'providerId' | 'providerReference'\n        \"value\": \"string\"\n    },\n    \"date\": \"YYYY-MM-dd\" //Required\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/hours/check","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Retrieves available <strong>time slots</strong> for a given date, based on the requested <strong>location</strong>, <strong>service variant</strong>, and optional <strong>provider</strong> parameters.</p>\n<p>Depending on the tenant configuration, the response may return either:</p>\n<ul>\n<li><p>A list of <strong>specific times</strong> (in 30-minute intervals), or</p>\n</li>\n<li><p>A list of <strong>time ranges</strong> (<code>{ startTime, endTime }</code>) when time ranges are configured at the tenant level.</p>\n</li>\n</ul>\n<p>This endpoint allows client systems to display accurate, real-time scheduling options for a specific date.</p>\n<h4 id=\"field-definitions\"><strong>Field Definitions</strong></h4>\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</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Defines the geographical reference for checking service availability.</td>\n</tr>\n<tr>\n<td><code>location.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Determines how the location is identified. Accepted values:  <br />• <code>\"coordinates\"</code> — Uses geographic coordinates.  <br />• <code>\"areaId\"</code> — Uses the internal Sodtrack area identifier.  <br />• <code>\"areaSku\"</code> — Uses the SKU associated with a predefined service area.</td>\n</tr>\n<tr>\n<td><code>location.value</code></td>\n<td><code>object</code> or <code>number</code> or <code>string</code></td>\n<td>✅</td>\n<td>The value corresponding to the selected <code>location.type</code>:  <br />  <br /><strong>If</strong> <strong><code>type = \"coordinates\"</code></strong> → must be an <strong>object</strong>: <code>{ \"lat\": number, \"lng\": number }</code>  <br /><strong>If</strong> <strong><code>type = \"areaId\"</code></strong> → must be a <strong>number</strong> (internal area ID).  <br /><strong>If</strong> <strong><code>type = \"areaSku\"</code></strong> → must be a <strong>string</strong> (area SKU).</td>\n</tr>\n<tr>\n<td><code>variant</code></td>\n<td><code>object</code></td>\n<td>✅</td>\n<td>Identifies the specific service variant for which to check availability.</td>\n</tr>\n<tr>\n<td><code>variant.type</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>Type of variant identifier. Options: <code>\"variantSku\"</code> or <code>\"variantId\"</code>.</td>\n</tr>\n<tr>\n<td><code>variant.value</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The SKU or ID of the variant corresponding to the selected <code>variant.type</code>.</td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td><code>object</code></td>\n<td>❌</td>\n<td>(Optional) Restricts availability to a specific contractor.</td>\n</tr>\n<tr>\n<td><code>provider.type</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>Type of provider identifier. Options: <code>\"providerId\"</code> or <code>\"providerReference\"</code>.</td>\n</tr>\n<tr>\n<td><code>provider.value</code></td>\n<td><code>string</code></td>\n<td>❌</td>\n<td>The corresponding provider ID or external reference.</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td><code>string</code></td>\n<td>✅</td>\n<td>The specific date for which to retrieve available hours. Format: <code>YYYY-MM-DD</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"sample-requests\"><strong>Sample Requests</strong></h3>\n<h4 id=\"example-1--retrieve-hours-for-coordinates\">Example 1 — Retrieve hours for coordinates</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"location\": {\n    \"type\": \"coordinates\",\n    \"value\": { \"lat\": -33.4489, \"lng\": -70.6693 }\n  },\n  \"variant\": {\n    \"type\": \"variantSku\",\n    \"value\": \"install_curtains_sku\"\n  },\n  \"date\": \"2025-10-10\"\n}\n\n</code></pre><h4 id=\"example-2--retrieve-hours-for-a-specific-provider\">Example 2 — Retrieve hours for a specific provider</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"location\": {\n    \"type\": \"areaSku\",\n    \"value\": \"SANTIAGO_RM\"\n  },\n  \"variant\": {\n    \"type\": \"variantId\",\n    \"value\": \"567\"\n  },\n  \"provider\": {\n    \"type\": \"providerId\",\n    \"value\": \"999\"\n  },\n  \"date\": \"2025-10-10\"\n}\n\n</code></pre><hr />\n<h3 id=\"success-responses-200-ok\"><strong>Success Responses (200 OK)</strong></h3>\n<h4 id=\"example-a--tenant-configured-for-specific-times\"><strong>Example A — Tenant configured for specific times</strong></h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"hours\": [\n    \"08:00\",\n    \"08:30\",\n    \"09:00\",\n    \"09:30\",\n    \"10:00\"\n  ]\n}\n\n</code></pre><h4 id=\"example-b--tenant-configured-for-time-ranges\"><strong>Example B — Tenant configured for time ranges</strong></h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"timeRanges\": [\n    { \"startTime\": \"08:00\", \"endTime\": \"10:00\" },\n    { \"startTime\": \"14:00\", \"endTime\": \"16:30\" }\n  ]\n}\n\n</code></pre><h4 id=\"response-fields\"><strong>Response Fields</strong></h4>\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>hours</code></td>\n<td><code>array[string]</code></td>\n<td>(If applicable) List of available start times in <code>HH:mm</code> format, spaced at 30-minute intervals.</td>\n</tr>\n<tr>\n<td><code>timeRanges</code></td>\n<td><code>array[object]</code></td>\n<td>(If applicable) List of available time windows. Each object includes:  <br />• <code>startTime</code>: Start time of the range (<code>HH:mm</code>).  <br />• <code>endTime</code>: End time of the range (<code>HH:mm</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Note:</strong> The API will return <strong>either</strong> <strong><code>hours</code></strong> <strong>or</strong> <strong><code>timeRanges</code></strong>, depending on tenant configuration.</p>\n<hr />\n<h3 id=\"error-responses\"><strong>Error Responses</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error Code / Key</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td><code>InvalidParameters</code></td>\n<td>Missing or invalid request parameters.</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>—</td>\n<td>Authentication failed or token expired.</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>—</td>\n<td>The API key or origin is not authorized to access this endpoint.</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>—</td>\n<td>No availability found for the given date or parameters.</td>\n</tr>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>—</td>\n<td>Unexpected server-side error. Contact Sodtrack support.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"business-logic-notes\"><strong>Business Logic Notes</strong></h3>\n<ul>\n<li><p>Availability is derived from contractor schedules, coverage zones, and existing bookings.</p>\n</li>\n<li><p>When the tenant is configured for <strong>time ranges</strong>, returned windows are inclusive and may vary in length (e.g., 2-hour blocks).</p>\n</li>\n<li><p>When configured for <strong>specific times</strong>, availability is expressed in <strong>30-minute intervals</strong>.</p>\n</li>\n<li><p>{ \"hours\": [] }{ \"timeRanges\": [] }</p>\n<p>  or</p>\n</li>\n<li><p>All times are expressed in <strong>local time</strong> relative to the contractor’s region or the defined coverage area.</p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"path":["api","integration","hours","check"],"host":["https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"],"query":[],"variable":[]}},"response":[{"id":"b1e19c1a-2060-4719-98d8-736dec7013f5","name":"Available Hours by Date","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"location\": {\n        \"type\": \"areaSku\",\n        \"value\": \"SANTIAGO_RM\"\n    },\n    \"variant\": {\n        \"type\": \"variantId\",\n        \"value\": \"567\"\n    },\n    \"provider\": {\n        \"type\": \"providerId\",\n        \"value\": \"999\"\n    },\n    \"date\": \"2025-10-10\"\n}","options":{"raw":{"language":"json"}}},"url":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com/api/integration/hours/check"},"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n  \"timeRanges\": [\n    { \"startTime\": \"08:00\", \"endTime\": \"10:00\" },\n    { \"startTime\": \"14:00\", \"endTime\": \"16:30\" }\n  ]\n}"}],"_postman_id":"79593d8e-708b-4537-b852-5353ef7a5f96"}],"id":"aa6d6d5d-5a18-40fb-8180-10ca153c1829","description":"<p>This section includes the endpoint to verify if a specific variant has coverage in a given location. Simply provide the coordinates and the variant to get an accurate response.</p>\n","_postman_id":"aa6d6d5d-5a18-40fb-8180-10ca153c1829","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"🔔 Webhooks","item":[{"name":"Booking","item":[{"name":"BookingDoneEvent","id":"89712c43-e5ae-48a6-82fe-5fa6d715b4a7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"forced\": \"boolean\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>The <code>BookingDoneEvent</code> webhook notifies subscribers when a <strong>booking has been successfully completed</strong> within the Sodtrack platform.</p>\n<p>This event is triggered once a booking’s lifecycle reaches the <strong>“done”</strong> status — typically after the assigned technician or provider has finalized the job, submitted the completion report, or confirmed the service outcome.</p>\n<p>Integrating this webhook allows client systems to automatically synchronize booking statuses, trigger post-service workflows (e.g., invoicing, customer feedback collection, or ERP updates), and maintain real-time operational consistency with Sodtrack.</p>\n<hr />\n<h3 id=\"trigger-condition\"><strong>Trigger Condition</strong></h3>\n<p>This webhook is triggered when:</p>\n<ul>\n<li><p>A booking’s status transitions to <code>\"done\"</code></p>\n</li>\n<li><p>The booking completion is successfully recorded in the Sodtrack system.</p>\n</li>\n</ul>\n<p>Only bookings that have been fully processed and validated by the system generate this event.</p>\n<hr />\n<h3 id=\"example-use-cases\"><strong>Example Use Cases</strong></h3>\n<ul>\n<li><p>Automatically update booking statuses in external CRMs, ERPs, or scheduling systems.</p>\n</li>\n<li><p>Trigger post-completion workflows such as invoice generation, customer satisfaction surveys, or performance analytics.</p>\n</li>\n<li><p>Maintain synchronized service completion records between Sodtrack and third-party platforms.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"body\"><strong>Body</strong></h4>\n<p>The body of this webhook inherits the standard Sodtrack webhook structure, which includes:</p>\n<ul>\n<li><p>The common <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-26cff07c-8b16-4266-a0b1-6f273d6ea321?action=share&amp;creator=30960189\">shared webhook fields</a></p>\n</li>\n<li><p>The <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-e6cafcc6-8fb9-40ab-b166-467702ad3948?action=share&amp;creator=30960189\">booking objects</a></p>\n</li>\n</ul>\n<h4 id=\"event-specific-fields\">Event-Specific Fields</h4>\n<p>In addition to the <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-26cff07c-8b16-4266-a0b1-6f273d6ea321?action=share&amp;creator=30960189\">shared webhook fields</a> and the standard <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-e6cafcc6-8fb9-40ab-b166-467702ad3948?action=share&amp;creator=30960189\">booking</a> object, this event includes the following additional field:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>forced</code></td>\n<td>boolean</td>\n<td>Indicates whether the booking was forcefully marked as completed.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"host":[""],"query":[],"variable":[]}},"response":[{"id":"b5df695d-0739-4c09-88e9-c551ff11d6a3","name":"BookingDoneEvent","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"forced\": \"boolean\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":""},"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":null}],"_postman_id":"89712c43-e5ae-48a6-82fe-5fa6d715b4a7"},{"name":"BookingAcceptedEvent","id":"fc2781b9-a3cf-4c15-954d-a0f5e8e140e3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>The <code>BookingAcceptedEvent</code> webhook notifies subscribers when a booking has been accepted by a service provider within the Sodtrack platform.</p>\n<p>This event is triggered when a provider confirms their availability and commitment to fulfill a service request — typically when a technician or professional accepts a booking assignment with a scheduled date, when a booking with an assigned provider is scheduled by the customer, or a provider and date is assigned directly.</p>\n<p>The booking transitions to <strong>\"accepted\"</strong> status, indicating that a provider is committed to delivering the service at a specific date and time.</p>\n<p>Integrating this webhook allows client systems to automatically track provider confirmations, trigger post-acceptance workflows (e.g., customer notifications, schedule confirmations, resource preparation, calendar updates), and maintain real-time operational consistency with Sodtrack.</p>\n<hr />\n<h3 id=\"trigger-condition\"><strong>Trigger Condition</strong></h3>\n<p>This webhook is triggered when:</p>\n<ul>\n<li><p>The booking has an assigned provider.</p>\n</li>\n<li><p>The booking has a scheduled date and time assigned.</p>\n</li>\n<li><p>The booking status transitions to <strong>\"accepted\"</strong> in the Sodtrack system.</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"example-use-cases\"><strong>Example Use Cases</strong></h3>\n<ul>\n<li><p>Automatically send confirmation notifications to customers when a provider accepts their booking with a scheduled date.</p>\n</li>\n<li><p>Synchronize provider acceptance records with external workforce management or scheduling systems.</p>\n</li>\n<li><p>Trigger preparation workflows such as resource allocation, equipment assignment, or route optimization.</p>\n</li>\n<li><p>Update calendar systems with confirmed appointments for both customers and providers.</p>\n</li>\n<li><p>Track provider performance metrics based on acceptance patterns and response times.</p>\n</li>\n<li><p>Maintain synchronized booking status records between Sodtrack and third-party platforms.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"body\"><strong>Body</strong></h4>\n<p>The body of this webhook inherits the standard Sodtrack webhook structure, which includes:</p>\n<ul>\n<li><p>The common <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-26cff07c-8b16-4266-a0b1-6f273d6ea321?action=share&amp;creator=30960189\">shared webhook fields</a></p>\n</li>\n<li><p>The <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-e6cafcc6-8fb9-40ab-b166-467702ad3948?action=share&amp;creator=30960189\">booking objects</a></p>\n</li>\n</ul>\n","urlObject":{"host":[""],"query":[],"variable":[]}},"response":[{"id":"77de83fa-ad17-4a26-9fe0-f3dd60b0b8c9","name":"BookingAcceptedEvent","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":""},"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"fc2781b9-a3cf-4c15-954d-a0f5e8e140e3"},{"name":"BookingCreatedEvent","id":"fa45bc5a-92c4-46c6-bc7b-4c524a3ef2df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>The <code>BookingCreatedEvent</code> webhook notifies subscribers when a <strong>new booking has been successfully created</strong> within the Sodtrack platform.</p>\n<p>This event is triggered once a booking is created and initialized in the system — typically after a customer completes a service request, a booking is generated from a shopping cart, or a booking is created from a budget execution. At this point, the booking enters the <strong>“created”</strong> status and becomes ready for provider assignment and scheduling.</p>\n<p>Integrating this webhook allows client systems to automatically synchronize new booking records, trigger initial workflows (e.g., provider matching, resource allocation, or external system notifications), and maintain real-time operational consistency with Sodtrack.</p>\n<hr />\n<h3 id=\"trigger-condition\"><strong>Trigger Condition</strong></h3>\n<p>This webhook is triggered when:</p>\n<ul>\n<li><p>A new booking is successfully created in the Sodtrack system, and</p>\n</li>\n<li><p>The booking has been initialized with all required information and assigned the <code>\"created\"</code> status.</p>\n</li>\n</ul>\n<p>Only bookings that have been fully validated and persisted by the system generate this event.</p>\n<hr />\n<h3 id=\"example-use-cases\"><strong>Example Use Cases</strong></h3>\n<ul>\n<li><p>Automatically synchronize new booking records in external CRMs, ERPs, or scheduling systems.</p>\n</li>\n<li><p>Maintain synchronized booking creation records between Sodtrack and third-party platforms.</p>\n</li>\n<li><p>Initiate notification workflows to stakeholders about new service requests.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"body\"><strong>Body</strong></h4>\n<p>The body of this webhook inherits the standard Sodtrack webhook structure, which includes:</p>\n<ul>\n<li><p>The common <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-26cff07c-8b16-4266-a0b1-6f273d6ea321?action=share&amp;creator=30960189\">shared webhook fields</a></p>\n</li>\n<li><p>The <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-e6cafcc6-8fb9-40ab-b166-467702ad3948?action=share&amp;creator=30960189\">booking objects</a></p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"fa45bc5a-92c4-46c6-bc7b-4c524a3ef2df"},{"name":"BookingProviderAssignedEvent","id":"0ce488d6-01c3-41a1-90f9-00f61a687ca3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>The <code>BookingProviderAssignedEvent</code> webhook notifies subscribers when a <strong>service provider</strong> (technician, professional, or company) has been <strong>assigned to a booking</strong> within the Sodtrack platform.</p>\n<p>This event is triggered when a provider is matched and assigned to fulfill a service request — typically through <strong>automatic matching algorithms</strong>, <strong>manual assignment by administrators</strong>, or when a <strong>provider accepts a booking request</strong>.</p>\n<p>Integrating this webhook allows client systems to automatically track provider assignments, trigger provider-specific workflows (e.g., job notifications, schedule synchronization, resource preparation), handle provider reassignments, and maintain real-time operational consistency with Sodtrack.</p>\n<hr />\n<h3 id=\"trigger-condition\"><strong>Trigger Condition</strong></h3>\n<p>This webhook is triggered when:</p>\n<ul>\n<li><p>A provider is successfully assigned to a booking (either initial assignment or reassignment), and</p>\n</li>\n<li><p>The provider assignment is recorded and validated in the Sodtrack system.</p>\n</li>\n</ul>\n<p>The event includes information about the assigned provider and the booking details, enabling systems to handle provider assignments appropriately.</p>\n<hr />\n<h3 id=\"example-use-cases\"><strong>Example Use Cases</strong></h3>\n<ul>\n<li><p>Automatically synchronize provider assignments in external workforce management, ERP, or scheduling systems.</p>\n</li>\n<li><p>Trigger provider notification workflows (e.g., job alerts, schedule updates, mobile app notifications).</p>\n</li>\n<li><p>Maintain synchronized provider assignment records between Sodtrack and third-party platforms.</p>\n</li>\n<li><p>Handle provider reassignment logic, including notification of previous providers when assignments change.</p>\n</li>\n<li><p>Update resource allocation and capacity planning systems based on provider commitments.</p>\n</li>\n<li><p>Track provider performance metrics by monitoring assignment frequency and patterns.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"body\"><strong>Body</strong></h4>\n<p>The body of this webhook inherits the standard Sodtrack webhook structure, which includes:</p>\n<ul>\n<li><p>The common <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-26cff07c-8b16-4266-a0b1-6f273d6ea321?action=share&amp;creator=30960189\">shared webhook fields</a></p>\n</li>\n<li><p>The <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-e6cafcc6-8fb9-40ab-b166-467702ad3948?action=share&amp;creator=30960189\">booking objects</a></p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"0ce488d6-01c3-41a1-90f9-00f61a687ca3"},{"name":"BookingCancelledEvent","id":"a40c7d7d-0872-4f01-b946-1b061ac0ebee","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"booking\": {\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"createdDate\": \"Date\",\n    \"serviceVariantTotalPrice\": \"number\",\n    \"serviceVariantTotalCost\": \"number\",\n    \"serviceName\": \"string\",\n    \"totalAddonsCost\": \"number\",\n    \"totalAddonsPrice\": \"number\",\n    \"totalAddonsDuration\": \"number\",\n    \"status\": \"string\",\n    \"variantDuration\": \"number\",\n    \"transportCost\": \"number\",\n    \"quantity\": \"number\",\n    \"date\": \"Date\",\n    \"doneDate\": \"Date\",\n    \"periodStartTime\": \"Date\",\n    \"periodEndTime\": \"Date\",\n    \"finalCost\": \"number\",\n    \"finalPrice\": \"number\",\n    \"totalDuration\": \"number\",\n    \"category\": {\n        \"id\": \"number\",\n        \"name\": \"string\"\n    },\n    \"saleChannel\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"serviceVariant\": {\n        \"id\": \"number\",\n        \"name\": \"string\",\n        \"skus\": [\n            {\n                \"id\": \"number\",\n                \"sku\": \"string\"\n            }\n        ]\n    },\n    \"addons\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"name\": \"string\",\n        \"duration\": \"number\",\n        \"totalCost\": \"number\",\n        \"totalPrice\": \"number\",\n        \"unitCost\": \"number\",\n        \"unitPrice\": \"number\"\n      }\n    ],\n    \"products\": [\n      {\n        \"id\": \"number\",\n        \"quantity\": \"number\",\n        \"productPromisedDeliveryDate\": \"Date\",\n        \"sku\": \"string\",\n        \"name\": \"string\",\n        \"description\": \"string\",\n        \"price\": \"number\",\n        \"unit\": {\n          \"id\": \"number\",\n          \"serialNumber\": \"string\"\n        }\n      }\n    ],\n    \"dynamicFieldValues\": [\n      {\n        \"id\": \"number\",\n        \"value\": \"string\"\n      }\n    ],\n    \"dynamicFormFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"id\": \"number\",\n    \"name\": \"string\",\n    \"identificationNumber\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  },\n  \"address\": {\n    \"id\": \"number\",\n    \"coordinates\":  {\n        \"lng\": \"number\", \n        \"lat\": \"number\"\n        },\n    \"address\": \"string\",\n    \"formattedAddress\": \"string\",\n    \"areas\": [\n            {\n                \"id\": \"number\",\n                \"name\": \"string\",\n                \"reference\": \"\"\n            }\n        ]\n  },\n  \"professional\": {\n    \"id\": \"number\",\n    \"isCompany\": \"boolean\",\n    \"reference\": \"string\",\n    \"name\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"phoneNumber\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>The <code>BookingCancelledEvent</code> webhook notifies subscribers when a <strong>booking has been cancelled</strong> within the Sodtrack platform.</p>\n<p>This event is triggered when a booking's lifecycle is <strong>terminated before completion</strong> — typically when a customer cancels the service request, an administrator cancels the booking, or the booking is cancelled due to an incident resolution.<br />Once triggered, the booking transitions to the <strong>“cancelled”</strong> status and ceases active processing.</p>\n<p>Integrating this webhook allows client systems to automatically synchronize booking cancellations, trigger post-cancellation workflows (e.g., refund processing, resource reallocation, inventory updates, or customer communication), and maintain real-time operational consistency with Sodtrack.</p>\n<hr />\n<h3 id=\"trigger-condition\"><strong>Trigger Condition</strong></h3>\n<p>This webhook is triggered when:</p>\n<ul>\n<li><p>A booking's status transitions to <code>\"cancelled\"</code>, and</p>\n</li>\n<li><p>The booking cancellation is successfully recorded in the Sodtrack system.</p>\n</li>\n</ul>\n<p>Only bookings that have been properly cancelled and validated by the system generate this event.</p>\n<hr />\n<h3 id=\"example-use-cases\"><strong>Example Use Cases</strong></h3>\n<ul>\n<li><p>Automatically update booking statuses in external CRMs, ERPs, or scheduling systems to reflect cancellations.</p>\n</li>\n<li><p>Trigger post-cancellation workflows such as refund processing, provider compensation calculations, or resource reallocation.</p>\n</li>\n<li><p>Maintain synchronized cancellation records between Sodtrack and third-party platforms.</p>\n</li>\n<li><p>Initiate customer communication workflows (e.g., cancellation confirmations, feedback requests).</p>\n</li>\n<li><p>Update inventory and availability management systems to free up previously allocated resources.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"body\"><strong>Body</strong></h4>\n<p>The body of this webhook inherits the standard Sodtrack webhook structure, which includes:</p>\n<ul>\n<li><p>The common <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-26cff07c-8b16-4266-a0b1-6f273d6ea321?action=share&amp;creator=30960189\">shared webhook fields</a></p>\n</li>\n<li><p>The <a href=\"https://sodtrack.postman.co/workspace/Sodtrack-Dev~5ddbf68f-e739-422b-852a-e24bb8fc6417/folder/30960189-e6cafcc6-8fb9-40ab-b166-467702ad3948?action=share&amp;creator=30960189\">booking objects</a></p>\n</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"a40c7d7d-0872-4f01-b946-1b061ac0ebee"}],"id":"e6cafcc6-8fb9-40ab-b166-467702ad3948","description":"<p>The Booking Webhooks group includes all outbound events related to the lifecycle of a booking within Sodtrack.</p>\n<p>These webhooks notify subscribed systems whenever any significant booking-related event occurs — ensuring external platforms remain synchronized with real-time booking data.</p>\n<p>Each event delivers a JSON payload that includes detailed information about the booking object, its current status, and relevant associations (such as assigned provider, service variant, or project context).</p>\n<h3 id=\"common-payload-structure\"><strong>Common Payload Structure</strong></h3>\n<p>All Booking Webhook payloads include a <code>booking</code> object in their body.<br />The following sections describe the standard fields that may appear across booking-related events.</p>\n<p>🧾 <code>booking</code> object</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Unique identifier of the booking.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>Booking external reference.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>createdDate</code></td>\n<td>Date</td>\n<td>Booking creation date.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>serviceVariantTotalPrice</code></td>\n<td>number</td>\n<td>Total price of the booked service variant.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>serviceVariantTotalCost</code></td>\n<td>number</td>\n<td>Total cost associated with the booked service variant.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>serviceName</code></td>\n<td>string</td>\n<td>Name of the booked service.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>totalAddonsCost</code></td>\n<td>number</td>\n<td>Total cost of all addons in the booking.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>totalAddonsPrice</code></td>\n<td>number</td>\n<td>Total price of all addons in the booking.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>totalAddonsDuration</code></td>\n<td>number</td>\n<td>Total duration added by all addons.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Current booking status (e.g., pending, confirmed, cancelled).</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>variantDuration</code></td>\n<td>number</td>\n<td>Duration of the main service variant.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>transportCost</code></td>\n<td>number</td>\n<td>Transportation cost associated with the booking.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>number</td>\n<td>Quantity of the booked service.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>Date</td>\n<td>null</td>\n<td>Booking scheduled date and time.</td>\n</tr>\n<tr>\n<td><code>doneDate</code></td>\n<td>Date</td>\n<td>null</td>\n<td>Date on wich booking was actually executed.</td>\n</tr>\n<tr>\n<td><code>periodStartTime</code></td>\n<td>Date</td>\n<td>Start time of the scheduled service period.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>periodEndTime</code></td>\n<td>Date</td>\n<td>End time of the scheduled service period.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>finalCost</code></td>\n<td>number</td>\n<td>Final calculated cost.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>finalPrice</code></td>\n<td>number</td>\n<td>Final selling price.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>totalDuration</code></td>\n<td>number</td>\n<td>Total service duration including addons.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>shoppingCartId</code></td>\n<td>number</td>\n<td>Identifier of the shopping cart or stage associated with this booking.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingcategory\">booking.category</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Category identifier.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Category name.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingsalechannel\">booking.saleChannel</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Identifier of the sales channel.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Name of the sales channel.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingservicevariant\">booking.serviceVariant</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Identifier of the service variant.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Name of the service variant.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>skus[].id</code></td>\n<td>number</td>\n<td>serviceVariant SKU identifier.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>skus[].sku</code></td>\n<td>string</td>\n<td>serviceVariant SKU code.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingaddons\">booking.addons[]</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Add-on unique identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>number</td>\n<td>Quantity of this specific add-on.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Name of the add-on.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>number</td>\n<td>Duration added by the add-on.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>totalCost</code></td>\n<td>number</td>\n<td>Total cost for this add-on.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>totalPrice</code></td>\n<td>number</td>\n<td>Total price for this add-on.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>unitCost</code></td>\n<td>number</td>\n<td>Unit cost of the add-on.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>unitPrice</code></td>\n<td>number</td>\n<td>Unit price of the add-on.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingproducts\">booking.products[]</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Product identifier associated with the booking.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>number</td>\n<td>Quantity of the product.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>productPromisedDeliveryDate</code></td>\n<td>Date</td>\n<td>null</td>\n<td>Promised delivery date of the product.</td>\n</tr>\n<tr>\n<td><code>sku</code></td>\n<td>string</td>\n<td>SKU (Stock Keeping Unit) of the product.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Name of the product.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Description of the product.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>price</code></td>\n<td>number</td>\n<td>Price of the product.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>unit.id</code></td>\n<td>number</td>\n<td>Unit identifier associated with the product.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>unit.serialNumber</code></td>\n<td>string</td>\n<td>Serial number of the product unit.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingdynamicfieldvalues\">booking.dynamicFieldValues[]</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Identifier of a dynamic field value.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Value of the dynamic field.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"bookingdynamicformfields\">booking.dynamicFormFields[]</h4>\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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>Reference key of the dynamic form field.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>string</td>\n<td>Captured value of the dynamic form field.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"👤-customer-object\">👤 <code>customer</code> object</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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Customer identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Customer’s first name.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>identificationNumber</code></td>\n<td>string</td>\n<td>Customer's identification number</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>lastName</code></td>\n<td>string</td>\n<td>Customer’s last name.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Customer’s email address.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Customer’s phone number.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"📍-address-object\">📍 <code>address</code> object</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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Address identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>coordinates.lng</code></td>\n<td>number</td>\n<td>Address longitude coordinate.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>coordinates.lat</code></td>\n<td>number</td>\n<td>Address latitude coordinate.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>address</code></td>\n<td>string</td>\n<td>Street or location address.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>formattedAddress</code></td>\n<td>string</td>\n<td>Full formatted address (human-readable).</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>areas[].id</code></td>\n<td>number</td>\n<td>Service variant area identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>areas[].name</code></td>\n<td>string</td>\n<td>Service variant area name.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>areas[].reference</code></td>\n<td>string</td>\n<td>Service variant area reference.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"🧑🔧-professional-object-optional\">🧑‍🔧 <code>professional</code> object (optional)</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<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>number</td>\n<td>Professional identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>isCompany</code></td>\n<td>boolean</td>\n<td>Whether the provider is a company.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>string</td>\n<td>Internal provider reference.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Professional or company name.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>lastName</code></td>\n<td>string</td>\n<td>Last name (if applicable).</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Professional email.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>phoneNumber</code></td>\n<td>string</td>\n<td>Professional phone number.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"e6cafcc6-8fb9-40ab-b166-467702ad3948","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}},{"name":"TransactionCreatedEvent","id":"636a5a91-2bea-4961-8292-9ed5c8c71d01","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"timestamp\": \"string\",\n  \"userTriggererEmail\": \"string\",\n  \"externalTransaction\": {\n    \"createdDate\": \"Date\",\n    \"id\": \"number\",\n    \"reference\": \"string\",\n    \"extraInfo\": \"string\",\n    \"amount\": \"number\",\n    \"status\": \"string\",\n    \"type\": \"string\", \n    \"currency\": {\n      \"id\": \"number\",\n      \"name\": \"string\"\n    },\n    \"shoppingCartId\": \"number\",\n    \"bookingTransactionMovements\": [\n      {\n        \"bookingId\": \"number\",\n        \"bookingReference\": \"string\",\n        \"currency\": {\n          \"id\": \"number\",\n          \"name\": \"string\"\n        },\n        \"addonMovement\": [\n          {\n            \"addonId\": \"number\",\n            \"reference\": \"string\",\n            \"amount\": \"number\",\n            \"quantityAdjustment\": \"number\"\n          }\n        ],\n        \"serviceMovement\": {\n          \"addonId\": \"number\",\n          \"sku\": [\"string\"],\n          \"amount\": \"number\",\n          \"quantityAdjustment\": \"number\"\n        }\n      }\n    ],\n    \"dynamicFormSnapshotFields\": [\n      {\n        \"reference\": \"string\",\n        \"value\": \"string\"\n      }\n    ]\n  }\n}","options":{"raw":{"language":"json"}}},"url":"","description":"<h2 id=\"purpose\"><strong>Purpose</strong></h2>\n<p>The <strong>ExternalTransactionCreatedEvent</strong> webhook notifies subscribers when a financial transaction has been successfully created and recorded within the <strong>Sodtrack</strong> platform.</p>\n<p>The transaction is recorded with all associated booking and addon movements, enabling <strong>comprehensive financial tracking</strong>.</p>\n<p>Integrating this webhook allows client systems to automatically:</p>\n<ul>\n<li><p>Synchronize payment records,</p>\n</li>\n<li><p>Trigger financial workflows (e.g., accounting updates, invoice generation, revenue recognition, reconciliation), and</p>\n</li>\n<li><p>Maintain <strong>real-time financial consistency</strong> with Sodtrack.</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"trigger-condition\"><strong>Trigger Condition</strong></h3>\n<p>This webhook is triggered when:</p>\n<ol>\n<li><p>A <strong>financial transaction</strong> (payment or refund) is successfully <strong>created and validated</strong> in the Sodtrack system, and</p>\n</li>\n<li><p>The transaction is <strong>associated with a shopping cart</strong> and includes all related <strong>booking and addon movements</strong>.</p>\n</li>\n</ol>\n<hr />\n<h2 id=\"example-use-cases\"><strong>Example Use Cases</strong></h2>\n<ul>\n<li><p>Automatically synchronize payment and refund records in external accounting systems, ERPs, or financial platforms.</p>\n</li>\n<li><p>Trigger post-transaction workflows such as invoice generation, receipt delivery, or revenue recognition.</p>\n</li>\n<li><p>Maintain synchronized financial records between Sodtrack and third-party systems.</p>\n</li>\n<li><p>Track payment status and reconcile transactions across multiple sources.</p>\n</li>\n<li><p>Generate financial reports and analytics based on transaction patterns.</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"body\">Body</h2>\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<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>createdDate</td>\n<td>Date</td>\n<td>Date/time when the external transaction was created.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>id</td>\n<td>number</td>\n<td>Unique transaction identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>reference</td>\n<td>string</td>\n<td>Transaction external reference.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>extraInfo</td>\n<td>string</td>\n<td>Additional information or context provided by external system.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>number</td>\n<td>Transaction amount in the selected currency.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>status</td>\n<td>string</td>\n<td>Current transaction status.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>type</td>\n<td>string</td>\n<td>Transaction type (<code>payment</code></td>\n<td><code>refund</code>).</td>\n</tr>\n<tr>\n<td>currency.id</td>\n<td>number</td>\n<td>Currency identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>currency.name</td>\n<td>string</td>\n<td>Currency name.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>shoppingCartId</td>\n<td>number</td>\n<td>Identifier linking the transaction to a shopping cart/stage.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"💸-externaltransactionbookingtransactionmovements\">💸 <strong>externalTransaction.bookingTransactionMovements[]</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th>Type</th>\n<th>Description</th>\n<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bookingId</td>\n<td>number</td>\n<td>Affected booking identifier.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>bookingReference</td>\n<td>string</td>\n<td>Booking external reference.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>currency.id</td>\n<td>number</td>\n<td>Currency identifier for this movement.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>currency.name</td>\n<td>string</td>\n<td>Currency name for this movement.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"🔹-bookingtransactionmovementsaddonmovement-optional-array\">🔹 bookingTransactionMovements[].addonMovement[] (optional array)</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<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>addonId</td>\n<td>number</td>\n<td>Identifier of the add-on affected.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>reference</td>\n<td>string</td>\n<td>Add-on external reference.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>number</td>\n<td>Monetary adjustment affecting this add-on.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>quantityAdjustment</td>\n<td>number</td>\n<td>Added/removed add-on units.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"🔹-bookingtransactionmovementsservicemovement-optional\">🔹 bookingTransactionMovements[].serviceMovement (optional)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th></th>\n<th>Type</th>\n<th>Description</th>\n<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>addonId</td>\n<td>number</td>\n<td>Identifier of the service variant addon (if applicable).</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>sku</td>\n<td>string[]</td>\n<td>SKUs associated with the service movement.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>number</td>\n<td>Monetary adjustment affecting the service.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>quantityAdjustment</td>\n<td>number</td>\n<td>Added/removed service quantity.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"📝-externaltransactiondynamicformsnapshotfields\">📝 <strong>externalTransaction.dynamicFormSnapshotFields[]</strong></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<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>reference</td>\n<td>string</td>\n<td>Dynamic field external reference.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td>value</td>\n<td>string</td>\n<td>Captured value at the moment of the transaction.</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}},"urlObject":{"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"636a5a91-2bea-4961-8292-9ed5c8c71d01"}],"id":"26cff07c-8b16-4266-a0b1-6f273d6ea321","description":"<h3 id=\"purpose\"><strong>Purpose</strong></h3>\n<p>Sodtrack supports outbound <strong>Webhooks</strong> to allow external systems to receive real-time notifications whenever specific events occur within the platform.</p>\n<p>Webhooks enable seamless integration with third-party systems by automatically sending an HTTP request to a configured endpoint when a defined event is triggered—such as the creation, update, or completion of a booking, project, or payment transaction.</p>\n<p>This mechanism ensures that partner systems remain synchronized with Sodtrack’s operational data without the need for continuous polling or manual updates.</p>\n<hr />\n<h3 id=\"how-it-works\"><strong>How It Works</strong></h3>\n<ol>\n<li><p><strong>Event Trigger:</strong></p>\n<p> Each webhook is associated with a specific <strong>event type</strong> (e.g., <code>booking_created</code>, <code>booking_done</code>, <code>technician_assigned</code>).</p>\n<p> When the event occurs in Sodtrack, a POST request is sent to the subscriber’s configured endpoint.</p>\n</li>\n<li><p><strong>Payload Delivery:</strong></p>\n<p> The webhook request body contains a structured <strong>JSON payload</strong> describing the event and relevant data objects.</p>\n<p> This allows your system to process updates, initiate workflows, or log information in real time.</p>\n</li>\n<li><p><strong>Headers and Authentication:</strong></p>\n<p> Each tenant can define custom headers (e.g., authorization tokens or client identifiers) to be included in webhook requests.</p>\n<p> To configure or modify these headers, tenants must contact <a href=\"https://null\"><b>integrations@sodtrack.com</b></a>.</p>\n</li>\n<li><p><strong>Delivery Reliability:</strong></p>\n<p> Webhooks are sent as <strong>HTTP POST</strong> requests with <code>Content-Type: application/json</code>.</p>\n<p> Sodtrack automatically retries failed webhook deliveries according to its retry policy to ensure reliable event propagation.</p>\n</li>\n</ol>\n<hr />\n<h3 id=\"typical-use-cases\"><strong>Typical Use Cases</strong></h3>\n<ul>\n<li><p>Automatically syncing booking status updates with an ERP or CRM.</p>\n</li>\n<li><p>Triggering post-service surveys or notification workflows upon service completion.</p>\n</li>\n<li><p>Updating availability or project progress in third-party dashboards.</p>\n</li>\n<li><p>Logging transactional or operational events for analytics or auditing.</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"security-and-best-practices\"><strong>Security and Best Practices</strong></h3>\n<ul>\n<li><p>Always validate the webhook’s <strong>source</strong> and <strong>signature</strong> (if applicable).</p>\n</li>\n<li><p>Use HTTPS endpoints to ensure data is encrypted in transit.</p>\n</li>\n<li><p>Implement <strong>idempotency</strong> on your webhook receiver to handle potential retries safely.</p>\n</li>\n<li><p>Avoid blocking the webhook request—respond quickly with a 2xx status and handle processing asynchronously.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"shared-payload-fields\">Shared Payload Fields</h4>\n<p>Every webhook payload sent by Sodtrack includes the following top-level fields, regardless of the event type:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n<th>Always</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>timestamp</code></td>\n<td>string</td>\n<td>ISO 8601 timestamp representing when the event was emitted.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>userTriggererEmail</code></td>\n<td>string</td>\n<td>Email address of the user or system that triggered the event.</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><p>These fields are always present at the root level of the webhook payload, alongside the event-specific data (e.g., <code>booking</code>, <code>project</code>, <code>payment</code>).</p>\n","_postman_id":"26cff07c-8b16-4266-a0b1-6f273d6ea321","auth":{"type":"bearer","bearer":{"token":""},"isInherited":true,"source":{"_postman_id":"cc318f6e-0b51-4254-be86-c090e307212f","id":"cc318f6e-0b51-4254-be86-c090e307212f","name":"Sodtrack Integration API","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"token":""}},"event":[{"listen":"prerequest","script":{"id":"056bdf16-050d-4165-bb5b-eb574cde3aa0","type":"text/javascript","requests":{},"exec":[""]}},{"listen":"test","script":{"id":"a0cb7cf9-38ba-4bcb-a037-7ae4c6768b7a","type":"text/javascript","requests":{},"exec":[""]}}],"variable":[{"key":"scheduling_enum","value":"self_management | direct"},{"key":"selection_enum","value":"automatic_selection | direct "},{"key":"base_url","value":"https://{{ENVIRONMENT}}.integration.cl.sodtrack-shared.sodtrack.com"},{"key":"origin","value":"dev.api.cl.sodtrack.sodtrack.com"},{"key":"YOURAPIKEY","value":""},{"key":"YOURORIGIN","value":""},{"key":"TOKEN","value":""},{"key":"webhook_listener_url","value":""},{"value":""}]}