{"info":{"_postman_id":"607c39a8-9720-427d-8bb1-d4ce0c4a3eee","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":"607c39a8-9720-427d-8bb1-d4ce0c4a3eee","publishedId":"2sB3QNpTqa","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2025-10-15T23:42:40.000Z"},"item":[{"name":"Overview & Changelog","item":[],"id":"e7500199-8534-4260-a7f1-409ea9136c20","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":"e7500199-8534-4260-a7f1-409ea9136c20"},{"name":"v1","item":[{"name":"Outbound Webhooks (from Trebu)","item":[{"name":"Load Auction","item":[{"name":"🧪 [WIP]  load_auction.created","id":"c9a75439-700d-4081-9bd2-d72db3037538","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"c9a75439-700d-4081-9bd2-d72db3037538"},{"name":"🧪 [WIP]  load_auction.options_exhausted","id":"41816ba9-a79a-404f-8fc4-e5a37a181d95","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"41816ba9-a79a-404f-8fc4-e5a37a181d95"},{"name":"🧪 [WIP]  load_auction.carrier_assigned","id":"d630f991-924a-474b-b3d9-3f40212d5190","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"d630f991-924a-474b-b3d9-3f40212d5190"}],"id":"eac2930f-5f1e-4db1-8ef8-6ea1c7a59fc1","_postman_id":"eac2930f-5f1e-4db1-8ef8-6ea1c7a59fc1","description":""},{"name":"Load","item":[{"name":"✅ [Live] load.created (previously called \"Load Requested  Webhook\")","id":"73556e4d-e361-4f11-a117-b08021f773f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"73556e4d-e361-4f11-a117-b08021f773f0"},{"name":"🧪 [WIP] load.updated","id":"60c19b17-20e3-43e0-babd-eb951dc2ec88","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"60c19b17-20e3-43e0-babd-eb951dc2ec88"}],"id":"85b89cf8-0c5b-4f38-a59b-36ec5e21d987","_postman_id":"85b89cf8-0c5b-4f38-a59b-36ec5e21d987","description":""},{"name":"Truck Availability","item":[{"name":"✅ [Live] truck_availability.created","id":"4ac23382-d8c8-46f3-bf6a-7f50ba9b4686","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"4ac23382-d8c8-46f3-bf6a-7f50ba9b4686"}],"id":"d4611179-5c19-4333-8f3f-ca4028edecb1","_postman_id":"d4611179-5c19-4333-8f3f-ca4028edecb1","description":""},{"name":"Bid Request","item":[{"name":"🧪 [WIP]  bid_request.created","id":"2bf2664c-f202-4503-81f6-a90bf86d6782","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"2bf2664c-f202-4503-81f6-a90bf86d6782"},{"name":"🧪 [WIP]  bid_request.question_asked","id":"e5a44ffa-1ef9-4348-8e18-eba08c68dc6a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"e5a44ffa-1ef9-4348-8e18-eba08c68dc6a"},{"name":"🧪 [WIP]  bid_request.rate_proposed","id":"bc95a322-0f04-485e-b61b-3e05a4b8cd73","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"bc95a322-0f04-485e-b61b-3e05a4b8cd73"},{"name":"🧪 [WIP]  bid_request.accepted","id":"c335627c-6915-496d-972a-2ace27d26f03","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"c335627c-6915-496d-972a-2ace27d26f03"},{"name":"🧪 [WIP] bid_request.confirmed","id":"c122935b-0766-4844-9117-1d256af9268b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"c122935b-0766-4844-9117-1d256af9268b"},{"name":"🧪 [WIP] bid_request.rejected","id":"ae5c107d-22b2-4734-abc3-c9d9e8b29339","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{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":"ae5c107d-22b2-4734-abc3-c9d9e8b29339"}],"id":"a0bee1e0-6acf-4434-bb90-f7e82fb7cc7f","_postman_id":"a0bee1e0-6acf-4434-bb90-f7e82fb7cc7f","description":""}],"id":"1c9c7893-9db7-4322-abc7-5aea30e018d8","description":"<p>Events Trebu sends to your system. Use these to simulate incoming webhooks to your <code>{{callback_url}}</code>.</p>\n","_postman_id":"1c9c7893-9db7-4322-abc7-5aea30e018d8"},{"name":"Inbound API (to Trebu)","item":[{"name":"Webhooks Management","item":[{"name":"🧪 [WIP] Set callback URL","id":"5c2c9a8e-3ef3-490b-b6af-6d137ce603ff","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":"5c2c9a8e-3ef3-490b-b6af-6d137ce603ff"},{"name":"🧪 [WIP] Get current callback URL","id":"c079697a-794e-4fd8-b87c-bc74c78c9593","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":"c079697a-794e-4fd8-b87c-bc74c78c9593"}],"id":"1eb7d43e-12ca-400e-8321-8b6fff52397d","description":"<p>Manage your single callback URL via API.</p>\n","_postman_id":"1eb7d43e-12ca-400e-8321-8b6fff52397d"},{"name":"Bid Requests","item":[{"name":"🧪 [WIP]  Reply to carrier question","id":"9494384a-ee66-4adf-8980-0b87bfe7a044","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":"9494384a-ee66-4adf-8980-0b87bfe7a044"}],"id":"20cb920f-5ca5-4bce-b7e9-816a264a5f3a","description":"<p>Interact with bid requests (e.g., reply to carrier questions).</p>\n","_postman_id":"20cb920f-5ca5-4bce-b7e9-816a264a5f3a"},{"name":"Loads & Auctions","item":[{"name":"🧪 [WIP]  Start auction for a load","id":"b513f5e0-5b4e-4fd0-b217-22dda4c9e36a","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":"b513f5e0-5b4e-4fd0-b217-22dda4c9e36a"}],"id":"5f109e61-210b-46f7-99fa-c1f871f576fd","description":"<p>Start auctions for specific loads and manage tendering lifecycle.</p>\n","_postman_id":"5f109e61-210b-46f7-99fa-c1f871f576fd"},{"name":"Facilities","item":[{"name":"✅ [Live] Add or Update Facility","id":"7b0b6bfe-7722-4528-9785-0a817dc93429","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":"7b0b6bfe-7722-4528-9785-0a817dc93429"}],"id":"658cfc2b-614d-4c87-b3f7-a184bd8c0008","_postman_id":"658cfc2b-614d-4c87-b3f7-a184bd8c0008","description":""}],"id":"86f2e5cb-9a25-47e1-a64e-c334f8bcee2d","description":"<p>Endpoints you call to interact with Trebu (manage webhooks, reply to questions, start auctions).</p>\n","_postman_id":"86f2e5cb-9a25-47e1-a64e-c334f8bcee2d"}],"id":"fee4502f-5cd8-4af9-8a43-135bde58ed8e","description":"<p>Current API &amp; Webhooks (MVP). Backwards-compatible additions will land here. Breaking changes will go to v2+.</p>\n","_postman_id":"fee4502f-5cd8-4af9-8a43-135bde58ed8e"}],"variable":[{"key":"receiver_url","value":"https://example.com/webhooks/trebu"},{"key":"api_key_or_token","value":"REPLACE_ME"}]}