17TRACK Webhook (TRACKING_UPDATED)
POST/webhooks/seventeentrack/:webhook_token
This endpoint is INCOMING — it is called by 17TRACK, not by SKU.io clients. Documented here for reference only.
Full URL shape: POST /webhooks/seventeentrack/{webhook_token}. The token in the URL identifies the tenant + instance; the sign field at the top of the JSON body is an HMAC-SHA256 over the request body computed with the instance's API key as the HMAC secret — verified by VerifySeventeenTrackWebhook middleware before the controller runs.
Envelope (v2.4):
{
"event": "TRACKING_UPDATED" | "TRACKING_STOPPED",
"data": { ... carrier-event payload ... },
"sign": "<sha256-hex>"
}
Behavior:
- Empty body →
200 { status: 'acknowledged' }(avoids 17TRACK retry storm). - Missing
eventkey →200 { status: 'ignored' }. - Valid payload →
200 { status: 'success' }and a background job is dispatched for async ingest. Out-of-order events (olderlast_event_atthan what's already stored) are dropped inside the repository.
Why always 200? 17TRACK retries non-2xx responses for several hours. Any non-actionable scenario still acks with 200 to avoid bogus retry storms.
Request
Responses
- 200
- 404
- 422
- 429
OK
Response Headers
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Validation failed — the body is a field → messages map (Laravel shape) or the platform envelope with a stable machine-readable code. Fix the payload and resubmit.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.