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 request header is sha256(event + '/' + <data JSON exactly as sent> + '/' + api_key) computed with the instance's 17TRACK API key — verified by VerifySeventeenTrackWebhook middleware before the controller runs.
Envelope (v2.4):
{
"event": "TRACKING_UPDATED" | "TRACKING_STOPPED",
"data": { ... carrier-event payload ... }
}
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 200 for non-actionable payloads? 17TRACK retries non-2xx responses for several hours, so empty or event-less payloads are acknowledged with 200 to avoid retry storms.
Rejections (17TRACK will retry these):
404— the token is missing or unknown (plain-text body), or no 17TRACK instance is connected for it ({"message": "No instance"})401— thesignheader is missing (Missing signature), does not match (Invalid signature), or the instance has no API key (Misconfigured)503— webhook routing is temporarily unavailable
Request
Responses
- 200
- 401
- 404
- 422
- 429
OK
Response Headers
Unauthorized
Response Headers
Not Found
Response Headers
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.