Integrationer & API
Webhooks och API-nycklar
Ta emot händelser i ditt eget system med webhooks, och läs och skriv data med en API-nyckel: format, signatur, omförsök, operationer och gränser.
Webhooks skickar händelser till ditt system. API-nycklar låter ditt system läsa och skriva data.
Var: Settings › Developer › Webhooks och Settings › Developer › API keys. Att skapa, ändra och ta bort kräver rollen owner eller admin.
Webhooks
Lägg upp en endpoint
- Öppna Settings › Developer › Webhooks.
- Tryck New endpoint.
- Fyll i Endpoint URL (https only) och, om du vill, Description (optional).
- Tryck Create endpoint.
- Välj händelser under Subscribed events på endpointens kort. Inget val betyder alla händelser.
- Tryck Show vid Signing secret och kopiera hemligheten till din mottagare.
BunStack skickar nu de valda händelserna till adressen.
- Pause stoppar endpointen och Resume startar den igen.
- Rotate secret byter hemligheten. BunStack signerar allt som skickas efter bytet med den nya hemligheten, även omförsök. Uppdatera din mottagare först.
Varning: Under en paus köas inget för endpointen. Händelser under pausen skickas aldrig, inte heller när du trycker Resume. En leverans som redan låg i kön markeras som failed.
En leverans som misslyckades på grund av pausen räknas inte mot endpointens hälsa.
Vad BunStack skickar
Varje leverans är en POST med en JSON-kropp och dessa headers:
| Header | Innehåll |
|---|---|
x-bunstack-signature | HMAC-SHA256 av kroppen, med endpointens hemlighet, i hex med gemener |
x-bunstack-event | Händelsetypen, till exempel order.paid |
x-bunstack-delivery-id | Id för leveransen |
x-bunstack-attempt | Försökets nummer, från 1 |
Kroppen är händelsens payload plus nyckeln delivery_id, med samma värde som headern. Deduplicera på delivery_id i kroppen. Kroppen är signerad. Headern är det inte.
Payload
Varje kropp har samma fem nycklar:
| Nyckel | Innehåll |
|---|---|
event | Händelsetypen, samma som headern x-bunstack-event |
tenant_id | Ditt workspaces id |
sent_at | När händelsen köades. Ett omförsök en timme senare har samma värde. |
data | Händelsens egna fält, enligt tabellen nedan |
delivery_id | Id:t att deduplicera på |
Nycklarna i data per händelse:
| Händelse | data |
|---|---|
order.paid, order.fulfilled, order.refunded, order.cancelled | order_id, order_number, storefront_id, currency, total_amount, status, payment_status, fulfillment_status, refunded_amount |
contact.received | message_id, storefront_id, email, name, subject |
member.signup, event.rsvp | member_id, storefront_id, email, tier_id respektive rsvp_id, event_id, email, attendees, status. Modulerna Members och Events är parkerade. Händelserna går inte att välja på en endpoint. |
När orderhändelserna skickas
order.paidskickas när ordern är klar. För de flesta ordrar är det när ordern skapas.- En order som är spärrad i Kustoms bedrägerikontroll får
order.paidförst när Kustom godkänt den. - En order som Kustom avvisat eller avbrutit får aldrig
order.paid. order.cancelledskickas en gång när ordern eller dess reservation avbryts. Det sker närstatusellerpayment_statusblircancelled.- Ett avbrott som bokar en återbetalning skickar också
order.refunded. - En endpoint utan val får alla händelser, även
order.cancelled. En endpoint med val fårorder.cancelledförst när du väljer den. - Avbryter du en order i Kustoms portal efter att Kustom godkänt den ser BunStack inte avbrottet. Ingen händelse skickas.
Kontraktet ändrades 12 september 2026 (2026-09-12). Före det skickades order.paid när ordern skapades, även för en hållen order, och order.cancelled fanns inte.
Kontrollera signaturen
Signaturen är HMAC-SHA256 över den råa kroppen. Nyckeln är hemligheten exakt som den visas, som en ASCII-sträng. Hex-avkoda den inte.
- Läs kroppens råa bytes innan du tolkar JSON.
- Räkna ut signaturen. I Node:
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
- Jämför
expectedmedx-bunstack-signaturemed en jämförelse i konstant tid.
Bara kroppen är signerad. Headers är det inte.
Dubbletter
Leveransen sker minst en gång (at-least-once). Samma händelse kan levereras flera gånger. Omförsök kan upprepa en leverans som redan kommit fram.
delivery_idär samma vid varje försök av en händelse. Två olika händelser delar aldrig id.- Spara de id du har behandlat. Hoppa över ett id du har sett förut.
- Deduplicera inte på innehållet. Två äkta ordrar kan se likadana ut, och samma order skickad två gånger har samma kropp.
x-bunstack-attemptär till för dina loggar. Försök 2 eller högre betyder att förra försöket inte fick2xx.
Svara 2xx när du har sparat händelsen. Gör arbetet efteråt. Ett svar som inte är 2xx, eller som tar mer än 8 sekunder, räknas som ett misslyckat försök.
Omförsök
| Försök | När |
|---|---|
| 1 | Direkt |
| 2 | 1 minut efter försök 1 |
| 3 | 5 minuter efter försök 2 |
| 4 | 15 minuter efter försök 3 |
| 5 | 1 timme efter försök 4 |
Det sista försöket kommer 81 minuter efter det första. Efter det sista försöket markeras leveransen som failed. Den görs inte om, och den ligger kvar i leveranslistan.
Granska en leverans
Välj en endpoint och öppna en leverans. Du ser status, svarskoden, antal försök, leveransens id och kroppen exakt som den skickades och signerades. Använd den kroppen när du testar din signaturkontroll.
API-nycklar
Under Settings › Developer › API keys skapar du nycklar med prefixet bunstack_. Nyckeln visas en gång och lagras hashad. En nyckel har scopes (read:products, read:orders, read:customers, read:reviews, write:products, write:orders, write:reviews). Du kan återkalla den när som helst med Revoke. Adressen, anropskropparna och felkoderna står på referenssidan under View docs.
Skapa en nyckel
- Öppna Settings › Developer › API keys.
- Tryck New key.
- Fyll i Name och välj Scopes.
- Välj ett datum under Expires (optional) om nyckeln ska sluta gälla.
- Tryck Create key.
- Kopiera nyckeln. Den visas inte igen.
En nyckel med utgångsdatum fungerar till slutet av den dagen, svensk tid. Skrivningar som görs med en nyckel loggas i Activity log under nyckelns namn. Läsningar loggas inte.
Operationer
Varje anrop är en POST med Authorization: Bearer bunstack_… och en JSON-kropp med op.
| Operation | Scope | Gör |
|---|---|---|
list_products | read:products | Listar produkter, nyast först |
list_orders | read:orders | Listar ordrar i alla butiker, nyast först |
get_order | read:orders | Hämtar en order med raderna |
list_customers | read:customers | Listar kunder, nyast först |
list_reviews | read:reviews | Listar recensioner, nyast först |
create_product | write:products | Skapar en produkt i katalogen |
update_product | write:products | Ändrar en produkt |
update_order_status | write:orders | Sätter orderns status |
update_review_status | write:reviews | Godkänner eller avvisar en recension |
create_product och update_product tar short_description, texten vid priset på produktsidan, som ren text. Den får vara högst 600 tecken. En längre text svarar 400 med invalid_value och field: "short_description". list_products skickar den med.
En lista ger högst 500 rader per sida. Är sidan full innehåller svaret next_before. Skicka värdet som before för nästa sida.
Orderstatus via API:t
update_order_statussvarar409vid byte till eller från statuscancelledochrefunded, för alla ordrar. Avbryt och återbetala i admin.- Status
fulfilledsvarar409för en order med hold (Needs attention). - Status
fulfilledsvarar409för en Kustom-order vars betalning är reserverad men inte dragen. - ProSmart-flaggorna
prosmart_partial,prosmart_refundochprosmart_customer_missingräknas inte som hold. - En order som hämtas i butik svarar
409 store_pickup. Registrera utlämningen med Picked up i admin. Det drar betalningen och markerar ordern hämtad.
Anropsgränser
| Gräns | Värde |
|---|---|
| Anrop per nyckel | 600 per minut |
| Skrivningar per nyckel | 60 per minut, inom de 600 |
| Anrop med en nyckel som inte finns | 60 per minut per IP-adress |
När en gräns är nådd svarar API:t 429 med { "error": "rate_limited", "retry_after": 60 } och headern Retry-After: 60. Vänta ut minuten innan du försöker igen.