Two additions aimed at the same thing: finding out an integration is misconfigured while you are building it, rather than when a real order arrives.
POST /v1/webhooks/{id}/test#
curl -X POST https://sandbox-api.biklo.com/v1/webhooks/1/test -H "Authorization: Bearer $KEY"
Queues a test.ping to that endpoint. Every other event needs something to happen
first, which made "is my receiver wired up correctly?" a question you could only answer
by creating a real order.
It travels the same path as a real event — same queue, same headers, same HMAC
signature — so a delivery that arrives and verifies here proves the real ones will. It
is sent regardless of what the endpoint subscribes to, because an integrator testing a
receiver has not necessarily decided which events they want yet; test.ping is not
itself subscribable, so you will never get one you did not ask for.
202 means queued, not delivered. The outcome appears on
GET /v1/webhooks/{id}/deliveries a moment later. A switched-off endpoint is refused
with 409 endpoint_disabled rather than silently accepting.
The webhooks guide now has a Testing before you go live section, including the
three things worth deliberately breaking before you trust your receiver: a wrong
secret, a 500, and a slow reply.
GET /v1/me now tells you whether you can ship#
{
"shipping_address": {
"ready": false,
"reason": "no_address",
"message": "This account has no shipping address, so orders have nowhere to ship from. Create one with POST /v1/addresses.",
"default_address": null,
"details_url": "/v1/addresses"
}
}
/v1/me is the first call every integration makes, and this is the failure that is
hardest to see coming: products publish perfectly well without an address, look correct
in the dashboard, and then the first real order has nowhere to ship from.
Deliberately not scope-gated, unlike the payout summary next to it. The integration that most needs this is the catalog-only one — it publishes, sees nothing wrong, and has no orders endpoint to discover the problem through.
Check shipping_address.ready on startup. If it is false, POST /v1/addresses is
one call away.
