Receive Etsy Webhook
POST/api/webhooks/etsy
Receives an order notification from Etsy. One endpoint serves every connected Etsy shop; the shop is identified by shop_id in the payload. No bearer token — requests are authenticated with a Standard Webhooks HMAC signature.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Headers:
webhook-id(required) — Unique message ID. Etsy retries with the same ID; duplicates are ignored.webhook-timestamp(required) — Unix timestamp in seconds. Requests more than 5 minutes old or in the future are rejected.webhook-signature(required) — Space-separated list ofv1,<signature>entries, where the signature is base64(HMAC-SHA256(<webhook-id>.<webhook-timestamp>.<raw body>)) keyed with the base64-decoded signing secret (the part afterwhsec_).
Body:
event_type(string) — order.paid, order.canceled, order.shipped, or order.delivered. Other event types are acknowledged and ignored.resource_url(string) — Etsy API URL of the affected receipt.shop_id(integer) — Etsy shop ID.
Behavior: a valid notification is stored and the referenced order is re-imported from Etsy in the background. The receiver always answers 200 {"ok": true} for a valid signature (including unknown shops and ignored events) and 401 for an invalid or missing signature.
Request
Responses
- 200
- 401
- 403
- 422
- 429
OK
Response Headers
Unauthorized
Response Headers
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
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.