{"info":{"_postman_id":"c69f2fbc-3b21-4b38-ad0b-1f1b42d39bd8","name":"Trebu Logistics API","description":"<html><head></head><body><p>Public documentation and examples for the webhooks your Trebu app sends to client endpoints.</p>\n<p>🔐 Authentication</p>\n<ul>\n<li><p>Default header: <code>Authorization: Api-Key REPLACE_ME</code></p>\n</li>\n<li><p><code>Content-Type: application/json</code></p>\n</li>\n</ul>\n<p>⏱️ Timeouts &amp; Retries</p>\n<ul>\n<li><p>Trebu times out requests after 30 seconds.</p>\n</li>\n<li><p>Retries up to 3 times on network errors/timeouts with exponential backoff (≈2s → 4s → 8s).</p>\n</li>\n</ul>\n<p>✅ Receiver Expectations</p>\n<ul>\n<li><p>Respond with HTTP 2xx as quickly as possible (ideally &lt; 5s).</p>\n</li>\n<li><p>Prefer JSON body with success status: <code>{ \"success\": true }</code>.</p>\n</li>\n<li><p>Non‑JSON is accepted but discouraged; Trebu will capture status and first 200 chars of text.</p>\n</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"9197136","collectionId":"c69f2fbc-3b21-4b38-ad0b-1f1b42d39bd8","publishedId":"2sBXqMGyZ1","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-05-05T20:08:45.000Z"},"item":[{"name":"Overview & Changelog","item":[],"id":"59def7c3-da56-4865-9dea-98b9dab8f7b9","description":"<h1 id=\"trebu-webhooks--overview--setup\">Trebu Webhooks — Overview &amp; Setup</h1>\n<p>This collection demonstrates Trebu's webhook <strong>event envelope</strong> and <strong>sample events</strong> for logistics tendering.<br />Use these requests to validate your endpoint and to learn the payload shapes you will receive in production.</p>\n<h2 id=\"what-this-does\">What this does</h2>\n<ul>\n<li><p>Sends <strong>realistic webhook payloads</strong> to your <code>{{callback_url}}</code> with <code>Authorization: Api-Key {{api_key}}</code>.</p>\n</li>\n<li><p>Uses a consistent envelope: <code>{ \"event\", \"data\" }</code>.</p>\n</li>\n<li><p>Implements a <strong>minimal viable set</strong> of domain events for tendering: load auctions, loads, and bid requests.</p>\n</li>\n<li><p>Provides <strong>schema fields</strong> designed to be forward-compatible: <code>version</code>, <code>schema_version</code>, <code>occurred_at</code>, <code>aggregate</code>, <code>related</code>, <code>payload</code>.</p>\n</li>\n</ul>\n<h2 id=\"single-callback-url-per-client-important\">Single Callback URL per Client (important)</h2>\n<p>Each Trebu <strong>client</strong> can register <strong>one</strong> webhook callback URL at a time. This ensures consistent ordering and simplifies operational controls (retries, backoff, dead-letter handling).</p>\n<ul>\n<li><p>If you attempt to set a different callback URL while one already exists, Trebu will <strong>replace</strong> the previous URL (or reject the change if your tenant enforces admin-only changes).</p>\n</li>\n<li><p>All events for that client will be delivered to the <strong>single configured URL</strong>.</p>\n</li>\n<li><p>For multi-environment setups (e.g., staging vs prod), create <strong>separate clients</strong> and configure a callback URL per client.</p>\n</li>\n</ul>\n<p><strong>Recommended documentation snippet</strong> you can show to your integrators:</p>\n<blockquote>\n<p><strong>Webhook callback URL</strong><br />Trebu delivers all webhook events for your client to a single HTTPS endpoint. Configure this under <em>Settings → Webhooks</em>. If you need multiple destinations, relay events from your endpoint to downstream services. To change the URL, update it in settings; the previous URL will stop receiving events immediately after the change is saved. </p>\n</blockquote>\n<h2 id=\"security--auth\">Security &amp; Auth</h2>\n<ul>\n<li><p>HTTP header: <code>Authorization: Api-Key</code></p>\n</li>\n<li><p>Keep your API key secret; rotate regularly.</p>\n</li>\n<li><p>Optionally, enable IP allowlists and (future) message signatures.</p>\n</li>\n</ul>\n<h2 id=\"delivery-semantics\">Delivery Semantics</h2>\n<ul>\n<li><p>Delivery is <strong>at-least-once</strong>.</p>\n</li>\n<li><p>Deduplicate by <code>data.id</code>.</p>\n</li>\n<li><p>Respond quickly (≤3s). Use asynchronous processing on your side.</p>\n</li>\n</ul>\n<h2 id=\"schema-versioning\">Schema Versioning</h2>\n<ul>\n<li><p><code>version</code> — semantic event versioning (business meaning)</p>\n</li>\n<li><p><code>schema_version</code> — JSON structure version (MVP: <code>1</code>)</p>\n</li>\n</ul>\n<h2 id=\"local-testing\">Local Testing</h2>\n<ol>\n<li><p>Set <code>{{callback_url}}</code> to your public HTTPS receiver (e.g., ngrok).</p>\n</li>\n<li><p>Set <code>{{api_key}}</code> to your Trebu API key.</p>\n</li>\n<li><p>Send sample events from each folder to validate parsing and auth.</p>\n</li>\n</ol>\n<hr />\n<h3 id=\"status-legend\">Status Legend</h3>\n<p>✅ Live — Currently available in production<br />🧪 WIP — Work in progress, not yet available in production<br />⚙️ Planned — Designed but not yet scheduled for release</p>\n<h2 id=\"changelog\">Changelog</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Version</th>\n<th>Status</th>\n<th>Notes</th>\n<th>Released</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>v1</strong></td>\n<td>✅ Live (MVP)</td>\n<td>Initial release of unified Inbound API &amp; Outbound Webhooks. Only <code>load.created</code> webhook is Live; all others are 🧪 WIP.</td>\n<td>2025-11-12</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"59def7c3-da56-4865-9dea-98b9dab8f7b9"},{"name":"v1","item":[{"name":"Outbound Webhooks (from Trebu)","item":[{"name":"Load Auction","item":[{"name":"🧪 [WIP]  load_auction.created","id":"19f2f823-3730-4462-872b-06616d9fa907","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"load_auction.created\",\n  \"data\": {\n    \"id\": \"evt_0001\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:01.000Z\",\n    \"aggregate\": {\n      \"type\": \"load_auction\",\n      \"id\": \"load_auction_7\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\"\n    },\n    \"payload\": {\n      \"name\": \"Acme Q4 Dedicated Lanes\",\n      \"deadline_at\": \"2025-11-12T23:00:00.000Z\",\n      \"timezone\": \"America/Monterrey\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"load-auction-·-created\">load auction · created</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a new load auction (tender batch) is created and made visible to Trebu.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"load_auction.created\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"19f2f823-3730-4462-872b-06616d9fa907"},{"name":"🧪 [WIP]  load_auction.options_exhausted","id":"656c98df-e939-4ff8-89c2-9d6e9bca5e0a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"load_auction.options_exhausted\",\n  \"data\": {\n    \"id\": \"evt_0004\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:04.000Z\",\n    \"aggregate\": {\n      \"type\": \"load_auction\",\n      \"id\": \"load_auction_7\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\"\n    },\n    \"payload\": {\n      \"note\": \"All posted loads have been awarded\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"load-auction-·-options-exhausted\">load auction · options exhausted</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When all posted loads have been awarded or no further carrier options are available.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"load_auction.options_exhausted\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"656c98df-e939-4ff8-89c2-9d6e9bca5e0a"},{"name":"🧪 [WIP]  load_auction.carrier_assigned","id":"f0f4f471-45e1-4623-b49e-fc5b688a39ed","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"load_auction.carrier_assigned\",\n  \"data\": {\n    \"id\": \"evt_0002\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:02.000Z\",\n    \"aggregate\": {\n      \"type\": \"load_auction\",\n      \"id\": \"load_auction_7\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"ld_123133\",\n      \"carrier_id\": \"cr_45234\"\n    },\n    \"payload\": {\n      \"opened_at\": \"2025-11-11T17:01:00.000Z\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"load-auction-·-carrier-assigned\">load auction · carrier assigned</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When the auction opens a load to a specific carrier or assigns it contextually (MVP semantics).</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"load_auction.carrier_assigned\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f0f4f471-45e1-4623-b49e-fc5b688a39ed"}],"id":"962de84f-b01a-4014-9ae3-d194e7b87547","_postman_id":"962de84f-b01a-4014-9ae3-d194e7b87547","description":""},{"name":"Load","item":[{"name":"✅ [Live] load.created (previously called \"Load Requested  Webhook\")","id":"70db471c-fe43-4d87-802f-152920201a18","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"load.created\",\n  \"data\": {\n    \"trebu_id\": 12345,\n    \"shipment_number\": \"SHP-2025-000987\",\n    \"folio_number\": \"FOL-7788\",\n    \"requested_at\": \"2025-10-14T16:23:00Z\",\n    \"channel\": {\n      \"name\": \"Pedidos Cliente ACME\",\n      \"id\": \"8572345234622443@g.us\",\n      \"is_direct_chat\": true,\n      \"provider\": \"WHATSAPP\"\n    },\n    \"origin\": {\n      \"location_name\": \"Warehouse A\",\n      \"zip_code\": \"64000\",\n      \"lat\": 25.6866,\n      \"lng\": -100.3161,\n      \"municipality\": \"Monterrey\",\n      \"state\": \"Nuevo León\",\n      \"country\": \"MX\",\n      \"id\": \"cli_loc_001\",\n      \"street_address\": \"Calle 123 #456\",\n      \"verbose_name\": \"Calle 123 #456, Monterrey, NL, MX\"\n    },\n    \"destination\": {\n      \"location_name\": \"DC Norte\",\n      \"zip_code\": \"66600\",\n      \"lat\": 25.7765,\n      \"lng\": -100.1143,\n      \"municipality\": \"Apodaca\",\n      \"state\": \"Nuevo León\",\n      \"country\": \"MX\",\n      \"id\": \"cli_loc_009\",\n      \"street_address\": \"Av. Industrial 789\",\n      \"verbose_name\": \"Av. Industrial 789, Apodaca, NL, MX\"\n    },\n    \"loading_date\": \"2025-10-15\",\n    \"loading_time\": \"08:00:00\",\n    \"unloading_date\": \"2025-10-16\",\n    \"unloading_time\": \"15:00:00\",\n    \"unit_type\": {\n      \"name\": \"53ft Dry Van\",\n      \"id\": \"unit_dry_53\"\n    },\n    \"shipper\": {\n      \"name\": \"Acme Corp\",\n      \"id\": \"ship_042\"\n    },\n    \"weight_kg\": 12000,\n    \"pallets\": 24,\n    \"boxes\": 800,\n    \"extra_fields\": {\n      \"temperature_control\": false,\n      \"notes\": \"Handle with care\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<h3 id=\"load-·-created\">load · created</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a load (shipment) is created in Trebu with origin/destination and schedule details.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"load.created\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"70db471c-fe43-4d87-802f-152920201a18"},{"name":"🧪 [WIP] load.updated","id":"e48b8c34-c8fb-41be-8cae-121a04d28070","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"load.updated\",\n  \"data\": {\n    \"trebu_id\": 12345,\n    \"loading_time\": \"08:30:00\",\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"load-·-updated\">load · updated</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />Whenever non-breaking updates are made to a load (e.g., time changes).</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"load.updated\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e48b8c34-c8fb-41be-8cae-121a04d28070"}],"id":"d9f4a620-33a9-4a76-9f52-e4b04ef07fc7","_postman_id":"d9f4a620-33a9-4a76-9f52-e4b04ef07fc7","description":""},{"name":"Truck Availability","item":[{"name":"✅ [Live] truck_availability.created","id":"cfa9b94c-df2b-4126-8f79-e55abdfa7970","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"truck_availability.created\",\n  \"data\": {\n    \"trebu_id\": 789,\n    \"offered_at\": \"2025-10-14T16:23:00Z\",\n    \"channel\": {\n      \"name\": \"Seguimiento Transportes ABC\",\n      \"id\": \"8572345234622449@g.us\",\n      \"is_direct_chat\": true,\n      \"provider\": \"WHATSAPP\"\n    },\n    \"origin\": {\n      \"location_name\": null,\n      \"zip_code\": null,\n      \"lat\": 25.6866,\n      \"lng\": -100.3161,\n      \"municipality\": \"Apodaca\",\n      \"state\": \"Nuevo León\",\n      \"country\": \"MX\",\n      \"id\": \"cli_loc_001\",\n      \"street_address\": null,\n      \"verbose_name\": \"Apodaca, NL, MX\"\n    },\n    \"destination_options\": [\n        {\n        \"location_name\": null,\n        \"zip_code\": null,\n        \"lat\": 21.7765,\n        \"lng\": -101.1143,\n        \"municipality\": \"Irapuato\",\n        \"state\": \"Guanajuato\",\n        \"country\": \"MX\",\n        \"id\": \"cli_loc_009\",\n        \"street_address\": null,\n        \"verbose_name\": \"Irapuato, GTO, MX\"\n        },\n        {\n        \"location_name\": null,\n        \"zip_code\": null,\n        \"lat\": 22.0431,\n        \"lng\": -101.0147,\n        \"municipality\": \"Queretaro\",\n        \"state\": \"Queretaro\",\n        \"country\": \"MX\",\n        \"id\": \"cli_loc_034\",\n        \"street_address\": null,\n        \"verbose_name\": \"Queretaro, QRO, MX\"\n        }\n    ],\n    \"start_date\": \"2025-10-15\",\n    \"start_time\": \"08:00:00\",\n    \"unit_type\": {\n      \"name\": \"53ft Dry Van\",\n      \"id\": \"unit_dry_53\"\n    },\n    \"carrier\": {\n      \"name\": \"Transportes ABC\",\n      \"id\": \"carr_047\"\n    },\n    \"extra_fields\": {},\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<h3 id=\"truck-availability-·-created\">truck availability · created</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a load (shipment) is created in Trebu with origin/destination and schedule details.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong></p>\n<ul>\n<li><p>Delivery is at-least-once (duplicates are possible).</p>\n</li>\n<li><p>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</p>\n</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"truck_availability.created\", \"data\": { ... } }\n\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><p><code>id</code> — unique event id</p>\n</li>\n<li><p><code>version</code> — event semantic version</p>\n</li>\n<li><p><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</p>\n</li>\n<li><p><code>occurred_at</code> — RFC 3339 timestamp</p>\n</li>\n<li><p><code>aggregate</code> — primary entity for ordering and context</p>\n</li>\n<li><p><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</p>\n</li>\n<li><p><code>payload</code> — event-specific content (see sample body)</p>\n</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong></p>\n<ul>\n<li><p>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).</p>\n</li>\n<li><p>(Optional) HMAC signatures may be added in a later version for body integrity.</p>\n</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"cfa9b94c-df2b-4126-8f79-e55abdfa7970"}],"id":"65b77adf-b3bf-4268-8254-7785c8a924bb","_postman_id":"65b77adf-b3bf-4268-8254-7785c8a924bb","description":""},{"name":"Bid Request","item":[{"name":"🧪 [WIP]  bid_request.created","id":"fa636054-0b1e-4082-af48-c4981ae5fa38","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"bid_request.created\",\n  \"data\": {\n    \"id\": \"evt_0013\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:13.000Z\",\n    \"aggregate\": {\n      \"type\": \"bid_request\",\n      \"id\": \"br_abc123\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"load_42\",\n      \"bid_request_id\": \"br_abc123\",\n      \"carrier_id\": \"carrier_jane\"\n    },\n    \"payload\": {},\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"bid-request-·-created\">bid request · created</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a bid request is created for a carrier for a specific load.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"bid_request.created\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"fa636054-0b1e-4082-af48-c4981ae5fa38"},{"name":"🧪 [WIP]  bid_request.question_asked","id":"640247d4-0677-4d80-9216-af02dba7969d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"bid_request.question_asked\",\n  \"data\": {\n    \"id\": \"evt_0014\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:14.000Z\",\n    \"aggregate\": {\n      \"type\": \"bid_request\",\n      \"id\": \"br_abc123\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"load_42\",\n      \"bid_request_id\": \"br_abc123\",\n      \"carrier_id\": \"carrier_jane\"\n    },\n    \"payload\": {\n      \"text\": \"Is live unload required at destination?\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"bid-request-·-question-asked\">bid request · question asked</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a carrier asks the shipper a question about a bid request.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"bid_request.question_asked\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"640247d4-0677-4d80-9216-af02dba7969d"},{"name":"🧪 [WIP]  bid_request.rate_proposed","id":"2e4f7f2a-e6fc-4eed-b3dc-f2adcad16199","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"bid_request.rate_proposed\",\n  \"data\": {\n    \"id\": \"evt_0015\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:15.000Z\",\n    \"aggregate\": {\n      \"type\": \"bid_request\",\n      \"id\": \"br_abc123\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"load_42\",\n      \"bid_request_id\": \"br_abc123\",\n      \"carrier_id\": \"carrier_jane\"\n    },\n    \"payload\": {\n      \"currency\": \"MXN\",\n      \"rate\": \"34000.00\",\n      \"rate_type\": \"all_in\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"bid-request-·-rate-proposed\">bid request · rate proposed</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a carrier proposes a rate for a bid request.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"bid_request.rate_proposed\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Pricing fields</strong></p>\n<ul>\n<li><code>payload.currency</code> — ISO currency code (e.g., <code>MXN</code>).</li>\n<li><code>payload.rate</code> — Monetary amount as string.</li>\n<li><code>payload.rate_type</code> — Kind of rate quoted. Allowed: <code>all_in</code> (default), <code>linehaul_only</code>, <code>fuel_inclusive</code>, <code>other</code>.</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2e4f7f2a-e6fc-4eed-b3dc-f2adcad16199"},{"name":"🧪 [WIP]  bid_request.accepted","id":"5021bcd0-1d3f-4c32-90de-17acc8349e8b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"bid_request.accepted\",\n  \"data\": {\n    \"id\": \"evt_0018\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:18.000Z\",\n    \"aggregate\": {\n      \"type\": \"bid_request\",\n      \"id\": \"br_abc123\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"load_42\",\n      \"bid_request_id\": \"br_abc123\",\n      \"carrier_id\": \"carrier_jane\"\n    },\n    \"payload\": {},\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"bid-request-·-accepted\">bid request · accepted</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When the carriers accepts to do a load or indicates availability to move the load.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong></p>\n<ul>\n<li><p>Delivery is at-least-once (duplicates are possible).</p>\n</li>\n<li><p>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</p>\n</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"bid_request.accepted\", \"data\": { ... } }\n\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><p><code>id</code> — unique event id</p>\n</li>\n<li><p><code>version</code> — event semantic version</p>\n</li>\n<li><p><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</p>\n</li>\n<li><p><code>occurred_at</code> — RFC 3339 timestamp</p>\n</li>\n<li><p><code>aggregate</code> — primary entity for ordering and context</p>\n</li>\n<li><p><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</p>\n</li>\n<li><p><code>payload</code> — event-specific content (see sample body)</p>\n</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong></p>\n<ul>\n<li><p>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).</p>\n</li>\n<li><p>(Optional) HMAC signatures may be added in a later version for body integrity.</p>\n</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5021bcd0-1d3f-4c32-90de-17acc8349e8b"},{"name":"🧪 [WIP] bid_request.confirmed","id":"902259c4-c192-4f8a-a57f-a6a0dca9d50a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"bid_request.confirmed\",\n  \"data\": {\n    \"id\": \"evt_0019\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:19.000Z\",\n    \"aggregate\": {\n      \"type\": \"bid_request\",\n      \"id\": \"br_abc123\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"load_42\",\n      \"bid_request_id\": \"br_abc123\",\n      \"carrier_id\": \"carrier_jane\"\n    },\n    \"payload\": {\n      \"carrier_id\": \"carrier_jane\",\n      \"carrier_name\": \"Jane's Transport Co.\"\n    },\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"bid-request-·-confirmed\">bid request · confirmed</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When a load that has been accepted by the carrier is confirmed and assigned to said carrier.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong></p>\n<ul>\n<li><p>Delivery is at-least-once (duplicates are possible).</p>\n</li>\n<li><p>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</p>\n</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"bid_request.confirmed\", \"data\": { ... } }\n\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><p><code>id</code> — unique event id</p>\n</li>\n<li><p><code>version</code> — event semantic version</p>\n</li>\n<li><p><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</p>\n</li>\n<li><p><code>occurred_at</code> — RFC 3339 timestamp</p>\n</li>\n<li><p><code>aggregate</code> — primary entity for ordering and context</p>\n</li>\n<li><p><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</p>\n</li>\n<li><p><code>payload</code> — event-specific content (see sample body)</p>\n</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong></p>\n<ul>\n<li><p>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).</p>\n</li>\n<li><p>(Optional) HMAC signatures may be added in a later version for body integrity.</p>\n</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"902259c4-c192-4f8a-a57f-a6a0dca9d50a"},{"name":"🧪 [WIP] bid_request.rejected","id":"d6d4c890-bbad-4ba3-9134-4642fa111f65","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"bid_request.rejected\",\n  \"data\": {\n    \"id\": \"evt_0022\",\n    \"version\": 1,\n    \"occurred_at\": \"2025-11-11T17:00:22.000Z\",\n    \"aggregate\": {\n      \"type\": \"bid_request\",\n      \"id\": \"br_xyz777\"\n    },\n    \"related\": {\n      \"load_auction_id\": \"load_auction_7\",\n      \"load_id\": \"load_42\",\n      \"bid_request_id\": \"br_xyz777\",\n      \"carrier_id\": \"carrier_omar\"\n    },\n    \"payload\": {},\n    \"schema_version\": 1\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"bid-request-·-rejected\">bid request · rejected</h3>\n<p><strong>Purpose</strong><br />This webhook informs your system about the following event in the Trebu tendering flow.</p>\n<p><strong>When it's sent</strong><br />When the shipper rejects a carrier's bid request or offer.</p>\n<p><strong>Authentication</strong><br />Include <code>Authorization: Bearer {api_key}</code> in the request headers.</p>\n<p><strong>Delivery</strong>  </p>\n<ul>\n<li>Delivery is at-least-once (duplicates are possible).  </li>\n<li>Recommended: treat webhooks as notifications and fetch current state via API, or apply client-side dedupe using a content fingerprint (e.g., SHA256 of <code>{event, aggregate.id, occurred_at, payload}</code>).</li>\n</ul>\n<p><strong>Schema</strong><br />Root envelope:  </p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"event\": \"bid_request.rejected\", \"data\": { ... } }\n</code></pre>\n<p>Core fields inside <code>data</code>:</p>\n<ul>\n<li><code>id</code> — unique event id</li>\n<li><code>version</code> — event semantic version</li>\n<li><code>schema_version</code> — JSON schema structure version (MVP: <code>1</code>)</li>\n<li><code>occurred_at</code> — RFC 3339 timestamp</li>\n<li><code>aggregate</code> — primary entity for ordering and context</li>\n<li><code>related</code> — cross-links to other ids (load, carrier, auction, etc.)</li>\n<li><code>payload</code> — event-specific content (see sample body)</li>\n</ul>\n<p><strong>Retries &amp; Signatures (MVP)</strong>  </p>\n<ul>\n<li>Trebu will retry on non-2xx responses with exponential backoff (configurable in production).  </li>\n<li>(Optional) HMAC signatures may be added in a later version for body integrity.</li>\n</ul>\n<p><strong>Response</strong><br />Return HTTP <code>200</code> as quickly as possible. If you need to do heavy work, enqueue internally and return immediately.</p>\n<hr />\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d6d4c890-bbad-4ba3-9134-4642fa111f65"}],"id":"e38b7aa7-f52c-49e7-971b-5f0ed61bb314","_postman_id":"e38b7aa7-f52c-49e7-971b-5f0ed61bb314","description":""},{"name":"FMT Tendering","item":[{"name":"✅ [Live] fmt.carrier_accepted","id":"3f2591ff-6f7c-4ced-9d3c-2374b071a41f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.carrier_accepted"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.carrier_accepted\",\n  \"timestamp\": \"2026-04-24T09:15:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"folio_number\": \"F-001\",\n    \"external_load_id\": \"SYS-LOAD-98765\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"carrier\": {\n      \"carrier_id\": 101,\n      \"carrier_name\": \"Transportes del Norte\",\n      \"channel_id\": null,\n      \"phone\": \"+525512345678\"\n    },\n    \"rate\": 14500.00,\n    \"currency\": \"MXN\",\n    \"accepted_at\": \"2026-04-24T09:15:00Z\",\n    \"total_accepted\": 1,\n    \"total_carriers_contacted\": 8\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when a carrier accepts a trip offer via WhatsApp.</p>\n<p>Use this to auto-confirm or notify your team. The <code>carrier_id</code> can be used with <code>POST /tendering/{trip_id}/confirm/</code> to confirm the carrier.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3f2591ff-6f7c-4ced-9d3c-2374b071a41f"},{"name":"✅ [Live] fmt.carrier_rejected","id":"5b673dd8-cfd4-426e-8e6e-0a96b9471bac","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.carrier_rejected"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.carrier_rejected\",\n  \"timestamp\": \"2026-04-24T08:45:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"folio_number\": \"F-001\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"carrier\": {\n      \"carrier_id\": 103,\n      \"carrier_name\": \"Express Transport\",\n      \"channel_id\": null,\n      \"phone\": \"+525587654321\"\n    },\n    \"rejected_at\": \"2026-04-24T08:45:00Z\",\n    \"total_rejected\": 1,\n    \"total_carriers_contacted\": 8\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when a carrier declines a trip offer via WhatsApp.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5b673dd8-cfd4-426e-8e6e-0a96b9471bac"},{"name":"✅ [Live] fmt.carrier_question","id":"bac27603-dbd2-425d-bc82-df80a707ef6e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.carrier_question"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.carrier_question\",\n  \"timestamp\": \"2026-04-24T10:00:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"folio_number\": \"F-001\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"carrier\": {\n      \"carrier_id\": 104,\n      \"carrier_name\": \"Reliable Freight\",\n      \"channel_id\": null,\n      \"phone\": \"+525598761234\"\n    },\n    \"question\": \"¿Requiere escolta?\",\n    \"asked_at\": \"2026-04-24T10:00:00Z\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when a carrier asks a question about a trip via WhatsApp.</p>\n<p>Respond using <code>POST /tendering/{trip_id}/answer/</code> with the <code>carrier_id</code> and your answer text.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bac27603-dbd2-425d-bc82-df80a707ef6e"},{"name":"✅ [Live] fmt.trip_confirmed","id":"fad95e3f-c1d3-4f0d-85d7-f0bf9b89b34f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.trip_confirmed"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.trip_confirmed\",\n  \"timestamp\": \"2026-04-24T11:00:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"folio_number\": \"F-001\",\n    \"external_load_id\": \"SYS-LOAD-98765\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"carrier\": {\n      \"carrier_id\": 101,\n      \"carrier_name\": \"Transportes del Norte\",\n      \"channel_id\": null,\n      \"phone\": \"+525512345678\"\n    },\n    \"rate\": 14500.00,\n    \"currency\": \"MXN\",\n    \"confirmed_at\": \"2026-04-24T11:00:00Z\",\n    \"confirmed_by\": \"user@company.com\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when a carrier is confirmed for a trip, either via API or manually in the UI.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"fad95e3f-c1d3-4f0d-85d7-f0bf9b89b34f"},{"name":"✅ [Live] fmt.trip_unconfirmed","id":"fa9ce7be-cb77-482c-a292-5a9946f5646a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.trip_unconfirmed"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.trip_unconfirmed\",\n  \"timestamp\": \"2026-04-24T15:00:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"folio_number\": \"F-001\",\n    \"external_load_id\": \"SYS-LOAD-98765\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"previous_carrier\": {\n      \"carrier_id\": 101,\n      \"carrier_name\": \"Transportes del Norte\",\n      \"channel_id\": null,\n      \"phone\": \"+525512345678\"\n    },\n    \"reason\": \"Carrier requested schedule change\",\n    \"unconfirmed_at\": \"2026-04-24T15:00:00Z\",\n    \"unconfirmed_by\": \"user@company.com\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when a previously confirmed carrier is unconfirmed (trip reassignment).</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"fa9ce7be-cb77-482c-a292-5a9946f5646a"},{"name":"✅ [Live] fmt.tendering_exhausted","id":"6b51db10-c4c5-4c9a-b633-4c88b7116f1f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.tendering_exhausted"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.tendering_exhausted\",\n  \"timestamp\": \"2026-04-24T18:00:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"folio_number\": \"F-001\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Monterrey\", \"state\": \"Nuevo León\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"total_carriers_contacted\": 15,\n    \"total_rejected\": 12,\n    \"total_no_response\": 3,\n    \"exhausted_at\": \"2026-04-24T18:00:00Z\",\n    \"message\": \"All available carriers have been contacted. Consider adjusting trip parameters.\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when all carriers have been contacted and none have accepted. Trip status becomes <code>no_carriers</code>.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6b51db10-c4c5-4c9a-b633-4c88b7116f1f"},{"name":"✅ [Live] fmt.tendering_cancelled","id":"8d4ea9b2-e77e-4ad4-a6c6-bae512161985","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.tendering_cancelled"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.tendering_cancelled\",\n  \"timestamp\": \"2026-04-24T16:00:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"shipment_number\": \"SHP-2026-001\",\n    \"reason\": \"Trip cancelled by client\",\n    \"carriers_notified\": 5,\n    \"cancelled_at\": \"2026-04-24T16:00:00Z\",\n    \"cancelled_by\": \"user@company.com\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when the tendering process is cancelled via API or UI.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8d4ea9b2-e77e-4ad4-a6c6-bae512161985"},{"name":"✅ [Live] fmt.trip_created","id":"f89559a8-18d6-45ab-a5d2-94febc42699b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.trip_created"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.trip_created\",\n  \"timestamp\": \"2026-04-24T08:00:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"external_load_id\": \"SYS-LOAD-98765\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\", \"country\": \"MX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\", \"country\": \"MX\"},\n    \"loading_datetime\": \"2026-05-01T08:00:00Z\",\n    \"unit_type\": \"Caja 53ft\",\n    \"created_at\": \"2026-04-24T08:00:00Z\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when a trip is successfully created via the tendering API.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f89559a8-18d6-45ab-a5d2-94febc42699b"},{"name":"✅ [Live] fmt.tendering_started","id":"6566493e-5fe2-4bf4-af8d-034cb56c7d91","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"},{"key":"X-Webhook-Event","value":"fmt.tendering_started"},{"key":"X-Webhook-Timestamp","value":"1782224119"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"fmt.tendering_started\",\n  \"timestamp\": \"2026-04-24T08:01:00Z\",\n  \"data\": {\n    \"trip_id\": 12345,\n    \"external_load_id\": \"SYS-LOAD-98765\",\n    \"origin\": {\"city\": \"Mexico City\", \"state\": \"CDMX\"},\n    \"destination\": {\"city\": \"Guadalajara\", \"state\": \"Jalisco\"},\n    \"loading_date\": \"2026-05-01\",\n    \"unit_type\": \"Caja 53ft\",\n    \"carriers_contacted\": 8,\n    \"carriers\": [\n      {\"carrier_id\": 101, \"carrier_name\": \"Transportes del Norte\", \"channel_id\": null, \"phone\": \"+525512345678\"}\n    ],\n    \"started_at\": \"2026-04-24T08:01:00Z\"\n  }\n}"},"url":"{{callback_url}}","description":"<p><strong>Status:</strong> ✅ Live</p>\n<p>Triggered when carriers are first notified about a trip. Useful when no <code>candidate_carriers</code> were provided and carrier discovery happened asynchronously — <code>carriers_contacted</code> here has the final count.</p>\n","urlObject":{"host":["{{callback_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6566493e-5fe2-4bf4-af8d-034cb56c7d91"}],"id":"e5e8b3ef-a1f4-4f65-8b6a-d4e284383f63","description":"<p>Webhook events fired by the FMT (Find Me a Truck) tendering system. All fmt.* events include <code>X-Webhook-Event</code> and <code>X-Webhook-Timestamp</code> headers.</p>\n","_postman_id":"e5e8b3ef-a1f4-4f65-8b6a-d4e284383f63"}],"id":"a4c225d7-1521-4413-bec5-997cce764628","description":"<p>Events Trebu sends to your system. Use these to simulate incoming webhooks to your <code>{{callback_url}}</code>.</p>\n","_postman_id":"a4c225d7-1521-4413-bec5-997cce764628"},{"name":"Inbound API (to Trebu)","item":[{"name":"Webhooks Management","item":[{"name":"🧪 [WIP] Set callback URL","id":"bbbfadf9-9c87-4bbc-9976-34373b025e5d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"callback_url\": \"{{callback_url}}\"\n}"},"url":"https://api.trebu.io/api/v1/webhooks/callback_url","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"set-callback-url\">Set callback URL</h3>\n<p><strong>Purpose</strong>\nSet or replace the single webhook callback URL for your client. All outbound events will be delivered to this URL.</p>\n<p><strong>Single URL rule</strong>\nEach client can have <strong>one</strong> active callback URL. Setting a new URL replaces the previous destination immediately.</p>\n<p><strong>Headers</strong></p>\n<ul>\n<li><code>Authorization: Bearer {{api_key}}</code></li>\n<li>Optional `\n<strong>Response (200)</strong></li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"callback_url\": \"https://example.com/trebu-hooks\",\n  \"updated_at\": \"2025-11-12T17:12:03Z\"\n}\n</code></pre>\n","urlObject":{"protocol":"https","path":["api","v1","webhooks","callback_url"],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"bbbfadf9-9c87-4bbc-9976-34373b025e5d"},{"name":"🧪 [WIP] Get current callback URL","id":"c1f91dc8-abef-4da1-9aa9-b783b73f6028","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Api-Key {{api_key}}"}],"url":"https://api.trebu.io/api/v1/webhooks/callback_url","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"get-current-callback-url\">Get current callback URL</h3>\n<p>Returns the configured webhook callback URL for this client.</p>\n<p><strong>Response (200)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"callback_url\": \"https://example.com/trebu-hooks\"\n}\n</code></pre>\n","urlObject":{"protocol":"https","path":["api","v1","webhooks","callback_url"],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"c1f91dc8-abef-4da1-9aa9-b783b73f6028"}],"id":"747ecd06-e994-4dd4-8f78-87539544f46a","description":"<p>Manage your single callback URL via API.</p>\n","_postman_id":"747ecd06-e994-4dd4-8f78-87539544f46a"},{"name":"Bid Requests","item":[{"name":"🧪 [WIP]  Reply to carrier question","id":"cf81c692-fe55-4720-80a5-e6680aa3a2e4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{\n  \"text\": \"Yes, live unload is required.\"\n}"},"url":"https://api.trebu.io/api/v1/bid_requests/{{bid_request_id}}/questions/{{question_id}}/reply","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"reply-to-carrier-question\">Reply to carrier question</h3>\n<p><strong>Purpose</strong>\nPost an official answer to a question a carrier asked on a bid request.</p>\n<p><strong>Path params</strong></p>\n<ul>\n<li><code>bid_request_id</code></li>\n<li><code>question_id</code></li>\n</ul>\n<p><strong>Body</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"text\": \"Yes, live unload is required.\"\n}\n</code></pre>\n<p><strong>Result</strong></p>\n<ul>\n<li>Triggers a notification to the carrier.</li>\n<li>May result in an outbound webhook (e.g., <code>bid_request.question_answered</code>) in a future iteration.</li>\n</ul>\n","urlObject":{"protocol":"https","path":["api","v1","bid_requests","{{bid_request_id}}","questions","{{question_id}}","reply"],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"cf81c692-fe55-4720-80a5-e6680aa3a2e4"}],"id":"b6dc5817-49a0-46d3-9890-aa27dcf9f295","description":"<p>Interact with bid requests (e.g., reply to carrier questions).</p>\n","_postman_id":"b6dc5817-49a0-46d3-9890-aa27dcf9f295"},{"name":"Loads & Auctions","item":[{"name":"🧪 [WIP]  Start auction for a load","id":"4f76122a-b15f-43ff-a1d3-e7420cfff598","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Api-Key {{api_key}}"}],"body":{"mode":"raw","raw":"{}"},"url":"https://api.trebu.io/api/v1/loads/{{load_id}}/auction-start","description":"<p><strong>Status:</strong> 🧪 WIP</p>\n<h3 id=\"start-auction-for-a-load\">Start auction for a load</h3>\n<p><strong>Purpose</strong>\nCreate and open a load auction using only the <code>load_id</code> path parameter.</p>\n<p><strong>Path param</strong></p>\n<ul>\n<li><code>load_id</code></li>\n</ul>\n<p><strong>Body (optional fields)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"deadline_at\": \"2025-11-12T23:00:00Z\",\n  \"timezone\": \"America/Monterrey\",\n  \"note\": \"MVP tender for dedicated lane\"\n}\n</code></pre>\n<p><strong>Response (201)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"load_auction_id\": \"load_auction_7\",\n  \"opened_at\": \"2025-11-11T17:01:00Z\"\n}\n</code></pre>\n<p><strong>Side effects</strong></p>\n<ul>\n<li>On success, you should see outbound webhook(s) like <code>load_auction.created</code> (and later, <code>carrier_assigned</code>, etc.).</li>\n</ul>\n","urlObject":{"protocol":"https","path":["api","v1","loads","{{load_id}}","auction-start"],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"4f76122a-b15f-43ff-a1d3-e7420cfff598"}],"id":"4f0c3f18-91f3-40ff-8cd4-3c3f31fdd01d","description":"<p>Start auctions for specific loads and manage tendering lifecycle.</p>\n","_postman_id":"4f0c3f18-91f3-40ff-8cd4-3c3f31fdd01d"},{"name":"Facilities","item":[{"name":"✅ [Live] Add or Update Facility","id":"d1d329d3-eae4-4a61-88bf-3c88381fc569","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Api-Key {{api_key}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"shipper\": \"ACME CORP S.A. de C.V.\",\n  \"facility_name\": \"CEDIS ACME Bajio\",\n  \"qa_facility_id\": null,\n  \"facility_id\": \"6581\",\n  \"country\": \"Mexico\",\n  \"state\": \"Guanajuato\",\n  \"city\": \"León de los Aldama\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.trebu.io/api/v1/update-facilities","urlObject":{"protocol":"https","path":["api","v1","update-facilities"],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"d1d329d3-eae4-4a61-88bf-3c88381fc569"}],"id":"360d99e6-5f28-488d-b620-c16f8b90f3d5","_postman_id":"360d99e6-5f28-488d-b620-c16f8b90f3d5","description":""},{"name":"FMT Tendering","item":[{"name":"List Trips","id":"1a81792d-cb6e-476e-90c3-139edf6b865c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.trebu.io/api/v1/client/tendering/?status=pending&limit=50&offset=0","description":"<p>List all trips for the authenticated company. Returns paginated results.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering",""],"host":["api","trebu","io"],"query":[{"description":{"content":"<p>pending | awaiting_confirmation | confirmed | no_carriers | cancelled</p>\n","type":"text/plain"},"key":"status","value":"pending"},{"disabled":true,"description":{"content":"<p>YYYY-MM-DD</p>\n","type":"text/plain"},"key":"from_date","value":"2026-01-01"},{"disabled":true,"description":{"content":"<p>YYYY-MM-DD</p>\n","type":"text/plain"},"key":"to_date","value":"2026-04-24"},{"description":{"content":"<p>Max 100</p>\n","type":"text/plain"},"key":"limit","value":"50"},{"key":"offset","value":"0"}],"variable":[]}},"response":[],"_postman_id":"1a81792d-cb6e-476e-90c3-139edf6b865c"},{"name":"Create Trip (Single)","event":[{"listen":"test","script":{"exec":["if (pm.response.code === 201) { var j = pm.response.json(); pm.collectionVariables.set('trip_id', j.trip_id); }"],"type":"text/javascript","id":"7eebfb60-246e-4d6a-9613-59cad999c598"}}],"id":"13df1e99-c60c-4fd2-9662-d01ad618b2d3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_load_id\": \"LOAD-2026-001\",\n  \"folio_number\": \"FOL-2026-001\",\n  \"shipper\": {\n    \"name\": \"Acme Corporation\",\n    \"contact\": \"John Doe\",\n    \"phone\": \"+52-555-1234567\",\n    \"email\": \"john@acme.com\"\n  },\n  \"origin\": {\n    \"name\": \"Warehouse A\",\n    \"address_line\": \"Calle Principal 123\",\n    \"city\": \"Guadalajara\",\n    \"state\": \"Jalisco\",\n    \"country\": \"MX\",\n    \"scheduled_datetime\": \"2026-05-01T08:00:00Z\"\n  },\n  \"destination\": {\n    \"city\": \"Ciudad de Mexico\",\n    \"state\": \"Ciudad de Mexico\",\n    \"country\": \"MX\"\n  },\n  \"load_details\": {\n    \"unit_type\": \"Caja 53ft\",\n    \"weight_kg\": 15000,\n    \"pallets\": 20\n  },\n  \"candidate_carriers\": [\n    {\n      \"carrier_name\": \"Fast Logistics S.A.\",\n      \"contact_name\": \"Maria Garcia\",\n      \"phone\": \"+52-555-9876543\",\n      \"preferred_language\": \"es\"\n    }\n  ],\n  \"options\": {\n    \"broadcast_immediately\": true,\n    \"rate_requested\": true,\n    \"proposed_rate\": 25000,\n    \"currency\": \"MXN\"\n  }\n}"},"url":"https://api.trebu.io/api/v1/client/tendering/","description":"<p>Create a single trip and optionally send it to candidate carriers.</p>\n<p>Use <code>carrier_name</code>+<code>contact_name</code> (explicit) instead of the legacy <code>name</code> field.\nUse <code>phone</code> for direct chats or <code>channel_id</code> for group chats — mutually exclusive.</p>\n<p>The response <code>carriers[].carrier_id</code> is the Trebu internal ID — store it for future calls.</p>\n<p><strong>Multi-stop loads:</strong> add an optional <code>stops: [...]</code> array to declare additional drops on the same load. See the \"Create Multi-Stop Load (Single)\" example for details. Omitting <code>stops</code> or sending <code>[]</code> is identical to a single-destination load.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"13df1e99-c60c-4fd2-9662-d01ad618b2d3"},{"name":"Create Multi-Stop Load (Single)","event":[{"listen":"test","script":{"exec":["if (pm.response.code === 201) {","    var jsonData = pm.response.json();","    pm.collectionVariables.set('trip_id', jsonData.trip_id);","}"],"type":"text/javascript","id":"a3d3c0bd-a31c-44a6-a3ef-9879938ed905"}}],"id":"24b01b4d-64de-446c-a49b-757a73324f43","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_load_id\": \"ORDER-9001\",\n  \"shipper\": {\n    \"name\": \"Acme Corporation\"\n  },\n  \"origin\": {\n    \"city\": \"Monterrey\",\n    \"state\": \"Nuevo Leon\",\n    \"country\": \"MX\",\n    \"scheduled_datetime\": \"2026-06-01T08:00:00Z\"\n  },\n  \"destination\": {\n    \"city\": \"Queretaro\",\n    \"state\": \"Queretaro\",\n    \"country\": \"MX\",\n    \"scheduled_datetime\": \"2026-06-02T08:00:00Z\"\n  },\n  \"load_details\": {\n    \"unit_type\": \"Caja 53ft\",\n    \"weight_kg\": 18000,\n    \"pallets\": 24\n  },\n  \"candidate_carriers\": [\n    {\n      \"carrier_name\": \"Fast Logistics S.A.\",\n      \"phone\": \"+52-555-9876543\"\n    }\n  ],\n  \"options\": {\n    \"broadcast_immediately\": true\n  },\n  \"stops\": [\n    {\n      \"destination\": {\n        \"city\": \"Ciudad de Mexico\",\n        \"state\": \"Ciudad de Mexico\",\n        \"country\": \"MX\",\n        \"scheduled_datetime\": \"2026-06-02T14:00:00Z\"\n      }\n    },\n    {\n      \"destination\": {\n        \"city\": \"Puebla\",\n        \"state\": \"Puebla\",\n        \"country\": \"MX\",\n        \"scheduled_datetime\": \"2026-06-02T19:00:00Z\"\n      },\n      \"external_load_id\": \"ORDER-9001-LEG-3\",\n      \"load_details\": {\n        \"weight_kg\": 6000,\n        \"pallets\": 8\n      }\n    }\n  ]\n}"},"url":"{{base_url}}/api/v1/client/tendering/","description":"<p>Create a load with multiple delivery destinations.</p>\n<p>The load has one pickup (<code>origin</code>) and N drops: the load-level <code>destination</code> is the first drop, and each entry in <code>stops[]</code> is an additional drop.</p>\n<p><strong>Stop fields:</strong></p>\n<ul>\n<li><code>destination</code> (required): same shape as the load-level destination, with its own <code>scheduled_datetime</code> (used as unloading time).</li>\n<li><code>load_details</code> (optional): per-stop overrides. Any field omitted inherits from the parent's <code>load_details</code>. Omit entirely to inherit everything.</li>\n<li><code>external_load_id</code> (optional): if you want to track this stop separately. Stays <code>null</code> if omitted — never auto-generated.</li>\n</ul>\n<p><strong>NOT allowed on a stop</strong> (returns 400): <code>origin</code>, <code>loading_date</code>, <code>loading_time</code>, <code>shipper</code>, <code>candidate_carriers</code>, <code>options</code>, <code>folio_number</code> — these are load-level only.</p>\n<p>Limits: max 9 stops per load (10 legs total). Stops are not separately broadcast and not visible as standalone trips in <code>GET /tendering/</code>.</p>\n","urlObject":{"path":["api","v1","client","tendering",""],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"24b01b4d-64de-446c-a49b-757a73324f43"},{"name":"Create Trip (Group Chat Carriers)","event":[{"listen":"test","script":{"exec":["if (pm.response.code === 201) { var j = pm.response.json(); pm.collectionVariables.set('trip_id', j.trip_id); }"],"type":"text/javascript","id":"95043de9-0c49-4536-96cb-46e0a1032995"}}],"id":"93448aa7-3a18-473b-8f31-99be94f2548e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_load_id\": \"LOAD-2026-002\",\n  \"origin\": {\n    \"city\": \"Guadalajara\",\n    \"state\": \"Jalisco\",\n    \"country\": \"MX\",\n    \"scheduled_datetime\": \"2026-05-01T08:00:00Z\"\n  },\n  \"destination\": {\n    \"city\": \"Ciudad de Mexico\",\n    \"country\": \"MX\"\n  },\n  \"load_details\": {\"unit_type\": \"Caja 53ft\"},\n  \"candidate_carriers\": [\n    {\n      \"carrier_name\": \"Grupo Transportes ABC SA de CV\",\n      \"channel_id\": \"120363423718359534@g.us\"\n    }\n  ],\n  \"options\": {\"broadcast_immediately\": true}\n}"},"url":"https://api.trebu.io/api/v1/client/tendering/","description":"<p>Create a trip using WhatsApp group chat carriers via <code>channel_id</code>. Mutually exclusive with <code>phone</code>.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"93448aa7-3a18-473b-8f31-99be94f2548e"},{"name":"Batch Create Trips","event":[{"listen":"test","script":{"exec":["if (pm.response.code === 201) { var j = pm.response.json(); if (j.trips && j.trips.length > 0) pm.collectionVariables.set('trip_id', j.trips[0].trip_id); }"],"type":"text/javascript","id":"e36e076a-7bf4-40d7-88e8-3c5e4c8a35ec"}}],"id":"09da4c1c-be4b-43e7-bbd1-91656ce6e999","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"external_load_id\": \"BATCH-001\",\n    \"origin\": {\"city\": \"Guadalajara\", \"country\": \"MX\", \"scheduled_datetime\": \"2026-05-01T08:00:00Z\"},\n    \"destination\": {\"city\": \"Ciudad de Mexico\", \"country\": \"MX\"},\n    \"load_details\": {\"unit_type\": \"Caja 53ft\"},\n    \"candidate_carriers\": [{\"carrier_name\": \"Fast Logistics\", \"phone\": \"+525512345678\"}],\n    \"options\": {\"broadcast_immediately\": true}\n  },\n  {\n    \"external_load_id\": \"BATCH-002\",\n    \"origin\": {\"city\": \"Monterrey\", \"country\": \"MX\", \"scheduled_datetime\": \"2026-05-01T10:00:00Z\"},\n    \"destination\": {\"city\": \"Puebla\", \"country\": \"MX\"},\n    \"load_details\": {\"unit_type\": \"Caja 53ft\"},\n    \"candidate_carriers\": [{\"carrier_name\": \"Fast Logistics\", \"phone\": \"+525512345678\"}],\n    \"options\": {\"broadcast_immediately\": true}\n  }\n]"},"url":"https://api.trebu.io/api/v1/client/tendering/","description":"<p>Create up to 15 loads atomically by sending a JSON array. Stops in <code>stops[]</code> do NOT count toward the 15-load cap, but the total number of trips (loads + stops) cannot exceed 50. All <code>external_load_id</code> values — including any stop-level ones supplied — must be unique within the batch. All trips must have the same <code>broadcast_immediately</code> value.</p>\n<p><strong>Multi-stop:</strong> any load in the batch can include an optional <code>stops: [...]</code> array. See the \"Create Multi-Stop Batch\" example.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"09da4c1c-be4b-43e7-bbd1-91656ce6e999"},{"name":"Create Multi-Stop Batch","event":[{"listen":"test","script":{"exec":["if (pm.response.code === 201) {","    var jsonData = pm.response.json();","    if (jsonData.trips && jsonData.trips.length > 0) {","        pm.collectionVariables.set('trip_id', jsonData.trips[0].trip_id);","    }","}"],"type":"text/javascript","id":"beb041f1-ff4d-4632-897b-03302ece9c47"}}],"id":"0cb2fbc6-7e60-49ac-aa58-943e82bc8677","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\n  {\n    \"external_load_id\": \"BATCH-MS-001\",\n    \"origin\": {\n      \"city\": \"Guadalajara\",\n      \"state\": \"Jalisco\",\n      \"country\": \"MX\",\n      \"scheduled_datetime\": \"2026-02-01T08:00:00Z\"\n    },\n    \"destination\": {\n      \"city\": \"Ciudad de Mexico\",\n      \"state\": \"Ciudad de Mexico\",\n      \"country\": \"MX\",\n      \"scheduled_datetime\": \"2026-02-02T10:00:00Z\"\n    },\n    \"load_details\": {\n      \"unit_type\": \"Caja 53ft\",\n      \"weight_kg\": 18000,\n      \"pallets\": 22\n    },\n    \"candidate_carriers\": [\n      {\n        \"carrier_name\": \"Fast Logistics S.A.\",\n        \"phone\": \"+52-555-9876543\"\n      }\n    ],\n    \"options\": {\n      \"broadcast_immediately\": true\n    },\n    \"stops\": [\n      {\n        \"destination\": {\n          \"city\": \"Puebla\",\n          \"state\": \"Puebla\",\n          \"country\": \"MX\",\n          \"scheduled_datetime\": \"2026-02-02T16:00:00Z\"\n        }\n      }\n    ]\n  },\n  {\n    \"external_load_id\": \"BATCH-MS-002\",\n    \"origin\": {\n      \"city\": \"Monterrey\",\n      \"state\": \"Nuevo Leon\",\n      \"country\": \"MX\",\n      \"scheduled_datetime\": \"2026-02-01T10:00:00Z\"\n    },\n    \"destination\": {\n      \"city\": \"Saltillo\",\n      \"state\": \"Coahuila\",\n      \"country\": \"MX\",\n      \"scheduled_datetime\": \"2026-02-01T14:00:00Z\"\n    },\n    \"load_details\": {\n      \"unit_type\": \"Caja 53ft\",\n      \"weight_kg\": 12000,\n      \"pallets\": 18\n    },\n    \"candidate_carriers\": [\n      {\n        \"carrier_name\": \"Fast Logistics S.A.\",\n        \"phone\": \"+52-555-9876543\"\n      }\n    ],\n    \"options\": {\n      \"broadcast_immediately\": true\n    }\n  }\n]"},"url":"{{base_url}}/api/v1/client/tendering/","description":"<p>Batch with one multi-stop load (BATCH-MS-001 has one extra stop) and one single-destination load (BATCH-MS-002). Demonstrates that multi-stop and single-stop loads can be mixed freely in the same batch.</p>\n<p>The response's per-load entry includes a <code>stops</code> array (empty for loads without additional stops).</p>\n","urlObject":{"path":["api","v1","client","tendering",""],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0cb2fbc6-7e60-49ac-aa58-943e82bc8677"},{"name":"Get Trip Detail","id":"39ff81ea-2fcf-4752-8579-da8c03bd3bf2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.trebu.io/api/v1/client/tendering/{{trip_id}}/","description":"<p>Get full trip details including all carrier responses (<code>carrier_id</code>, <code>status</code>, <code>rate</code>, <code>question</code>, etc.).</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering","{{trip_id}}",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"39ff81ea-2fcf-4752-8579-da8c03bd3bf2"},{"name":"Confirm Carrier","id":"e165ed4c-12d4-497e-9098-298c8eba3af9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"carrier_id\": {{carrier_id}},\n  \"notes\": \"Best rate\"\n}"},"url":"https://api.trebu.io/api/v1/client/tendering/{{trip_id}}/confirm/","description":"<p>Confirm a carrier for a trip. The carrier must have <code>status: accepted</code>. Triggers a confirmation message to the carrier.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering","{{trip_id}}","confirm",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"e165ed4c-12d4-497e-9098-298c8eba3af9"},{"name":"Answer Carrier Question","id":"0879e534-a689-4168-a475-24c73ab9e934","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"carrier_id\": {{carrier_id}},\n  \"answer\": \"The loading dock is available from 8 AM to 6 PM.\"\n}"},"url":"https://api.trebu.io/api/v1/client/tendering/{{trip_id}}/answer/","description":"<p>Answer a carrier's question about a trip. The answer is sent to the carrier via WhatsApp.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering","{{trip_id}}","answer",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"0879e534-a689-4168-a475-24c73ab9e934"},{"name":"Cancel Tendering","id":"0a7d6d8d-3d7f-4777-a56a-790c0dc91ffd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"reason\": \"Trip cancelled by client\"\n}"},"url":"https://api.trebu.io/api/v1/client/tendering/{{trip_id}}/cancel/","description":"<p>Cancel the tendering process for a trip. All contacted carriers are notified. <code>reason</code> is optional.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering","{{trip_id}}","cancel",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"0a7d6d8d-3d7f-4777-a56a-790c0dc91ffd"},{"name":"Upload Trips File","id":"b53d71d8-95f7-4afb-8920-cca22dfe64f1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"file","type":"file","description":"<p>CSV or Excel file (.csv, .xlsx, .xls)</p>\n","value":null},{"key":"broadcast_immediately","value":"true","type":"text","description":"<p>Optional, default true</p>\n"},{"key":"sheet_name","value":"Trips","type":"text","description":"<p>Optional: Excel sheet name</p>\n","disabled":true}]},"url":"https://api.trebu.io/api/v1/client/tendering/upload/","description":"<p>Upload a CSV or Excel file to create multiple trips at once. Duplicate files (by content hash) are rejected with 409.</p>\n","urlObject":{"protocol":"https","path":["api","v1","client","tendering","upload",""],"host":["api","trebu","io"],"query":[],"variable":[]}},"response":[],"_postman_id":"b53d71d8-95f7-4afb-8920-cca22dfe64f1"}],"id":"09a1b525-f993-4c8d-b48e-bd52d8641020","description":"<p>FMT (Find Me a Truck) tendering API. Base path: /api/v1/client/tendering/</p>\n<p>Authentication is inherited from the collection (Api-Key header).</p>\n<p>Set the <code>trip_id</code> and <code>carrier_id</code> collection variables after creating a trip to use the action endpoints.</p>\n","_postman_id":"09a1b525-f993-4c8d-b48e-bd52d8641020"}],"id":"f04223f6-98a6-484f-9584-2b983e53d100","description":"<p>Endpoints you call to interact with Trebu (manage webhooks, reply to questions, start auctions, tendering API).</p>\n","_postman_id":"f04223f6-98a6-484f-9584-2b983e53d100"}],"id":"698b1184-12c4-4af0-88f5-63c626c1212f","description":"<p>Current API &amp; Webhooks (MVP). Backwards-compatible additions will land here. Breaking changes will go to v2+.</p>\n","_postman_id":"698b1184-12c4-4af0-88f5-63c626c1212f"}],"variable":[{"key":"receiver_url","value":"https://example.com/webhooks/trebu"},{"key":"api_key_or_token","value":"REPLACE_ME"}]}