post
https://app.shipscience.com/webhooks/v1/ingest/
Accepts a shipment or label event from an integration partner.
Authentication
- URL path: opaque per-credential
webhook_api_key. We mint this for
you; treat it as semi-public (it identifies your credential but is
not a secret on its own — HMAC over the body is the cryptographic auth). - Body: HMAC-SHA256 over the raw request body, base64-encoded. Send
it in the signature header required by your configured adapter:- Conformant default adapter —
X-ShipScience-Signature. - Partner native adapter — uses its own signature header;
refer to your partner's documentation for the exact name.
The server verifies only the header for your credential's adapter;
a missing or invalid signature returns401.
- Conformant default adapter —
Request body
The body shape depends on the adapter configured on your credential:
- Conformant adapter — JSON envelope
{ event_id, event_type, occurred_at, data }(seewebhook_envelope_shipment). Send this
shape unless you have a partner native adapter. - Partner native adapter — send your provider's webhook payload
as-is (seewebhook_envelope_partner_native); ShipScience maps
the fields per-credential. Refer to your partner's documentation
for the authoritative schema. The conformant envelope is not
accepted by a native-adapter credential.
Sending the wrong shape for your adapter returns422.
Idempotency
- Same
event_id= same event. Resending is a no-op (we respond 200). - We accept the same event_id forever; safe to retry indefinitely.
- Do not back off on 200 responses for "duplicate" — they are accepted.
Retry & timing
- We respond <500 ms typical, <2 s worst case.
- 2xx = accepted, will be processed; 4xx = don't retry; 5xx = retry with backoff.
Recent Requests
Log in to see full request history
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Loading…
200Event accepted.
401Unknown webhook_api_key OR invalid signature.
422Malformed body, missing event_id, or unsupported event_type.
