Integrationer og API
Webhooks og API-nøgler
Modtag hændelser i dit eget system med webhooks, og læs og skriv data med en API-nøgle: format, signatur, genforsøg, operationer og grænser.
Webhooks sender hændelser til dit system. API-nøgler lader dit system læse og skrive data.
Hvor: Settings › Developer › Webhooks og Settings › Developer › API keys. At oprette, ændre og slette kræver rollen owner eller admin.
Webhooks
Tilføj et endpoint
- Åbn Settings › Developer › Webhooks.
- Tryk New endpoint.
- Udfyld Endpoint URL (https only) og, hvis du vil, Description (optional).
- Tryk Create endpoint.
- Vælg hændelser under Subscribed events på endpointets kort. Intet valg betyder alle hændelser.
- Tryk Show ved Signing secret og kopiér hemmeligheden til din modtager.
BunStack sender nu de valgte hændelser til adressen.
- Pause stopper endpointet, og Resume starter det igen.
- Rotate secret skifter hemmeligheden. Alt, der sendes efter skiftet, signeres med den nye hemmelighed, også genforsøg. Opdatér din modtager først.
Advarsel: Under en pause sættes intet i kø til endpointet. Hændelser under pausen sendes aldrig, heller ikke når du trykker Resume. En levering, der allerede lå i køen, markeres som failed.
En levering, der mislykkedes på grund af pausen, tæller ikke mod endpointets helbred.
Hvad BunStack sender
Hver levering er en POST med en JSON-krop og disse headers:
| Header | Indhold |
|---|---|
x-bunstack-signature | HMAC-SHA256 af kroppen, med endpointets hemmelighed, i hex med små bogstaver |
x-bunstack-event | Hændelsestypen, for eksempel order.paid |
x-bunstack-delivery-id | Id for leveringen |
x-bunstack-attempt | Forsøgets nummer, fra 1 |
Kroppen er hændelsens payload plus nøglen delivery_id, med samme værdi som headeren. Deduplikér på delivery_id i kroppen. Kroppen er signeret. Headeren er ikke signeret.
Payload
Hver krop har de samme fem nøgler:
| Nøgle | Indhold |
|---|---|
event | Hændelsestypen, den samme som headeren x-bunstack-event |
tenant_id | Dit workspaces id |
sent_at | Hvornår hændelsen blev sat i kø. Et genforsøg en time senere har samme værdi. |
data | Hændelsens egne felter, efter tabellen nedenfor |
delivery_id | Id'et, du deduplikerer på |
Nøglerne i data pr. 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 henholdsvis rsvp_id, event_id, email, attendees, status. Modulerne Members og Events er parkeret. Hændelserne kan ikke vælges på et endpoint. |
Hvornår ordrehændelserne sendes
order.paidsendes, når ordren er klar. For de fleste ordrer er det, når ordren oprettes.- En ordre, som Kustoms svindelkontrol holder tilbage, får først
order.paid, når Kustom har godkendt den. - En ordre, som Kustom har afvist eller annulleret, får aldrig
order.paid. order.cancelledsendes én gang, når ordren eller dens reservation annulleres. Det sker, nårstatusellerpayment_statusblivercancelled.- En annullering, der bogfører en refusion, sender også
order.refunded. - Et endpoint uden valg får alle hændelser, også
order.cancelled. Et endpoint med valg får førstorder.cancelled, når du vælger den. - En annullering i Kustoms portal af en ordre, som Kustom allerede har godkendt, ser BunStack ikke. Ingen hændelse sendes.
Kontrakten blev ændret 12. september 2026 (2026-09-12). Før det blev order.paid sendt, når ordren blev oprettet, også for en tilbageholdt ordre, og order.cancelled fandtes ikke.
Kontrollér signaturen
Signaturen er HMAC-SHA256 over den rå krop. Nøglen er hemmelighedens tegn. Brug hemmeligheden præcis, som den vises, som en ASCII-streng. Hex-afkod den ikke.
- Læs kroppens rå bytes, før du fortolker JSON.
- Beregn signaturen. I Node:
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
- Sammenlign
expectedmedx-bunstack-signaturemed en sammenligning i konstant tid.
Kun kroppen er signeret. Headers er ikke signeret.
Dubletter
Leveringen sker mindst én gang (at-least-once). Samme hændelse kan leveres flere gange. Genforsøg kan gentage en levering, der allerede er nået frem.
delivery_ider den samme ved hvert forsøg af en hændelse. To forskellige hændelser deler aldrig id.- Gem de id'er, du har behandlet. Spring et id over, som du har set før.
- Deduplikér ikke på indholdet. To ægte ordrer kan se ens ud, og samme ordre sendt to gange har samme krop.
x-bunstack-attempter til dine logs. Forsøg 2 eller højere betyder, at forrige forsøg ikke fik2xx.
Svar 2xx, når du har gemt hændelsen. Gør arbejdet bagefter. Et svar, der ikke er 2xx, eller som tager mere end 8 sekunder, tæller som et mislykket forsøg.
Genforsøg
| Forsøg | Hvornår |
|---|---|
| 1 | Med det samme |
| 2 | 1 minut efter forsøg 1 |
| 3 | 5 minutter efter forsøg 2 |
| 4 | 15 minutter efter forsøg 3 |
| 5 | 1 time efter forsøg 4 |
Det sidste forsøg kommer 81 minutter efter det første. Efter det sidste forsøg markeres leveringen som failed. Den gentages ikke, og den bliver liggende i leveringslisten.
Se en levering
Vælg et endpoint og åbn en levering. Du ser status, svarkoden, antal forsøg, leveringens id og kroppen præcis, som den blev sendt og signeret. Brug den krop, når du tester din signaturkontrol.
API-nøgler
Under Settings › Developer › API keys opretter du nøgler med præfikset bunstack_. Nøglen vises én gang og gemmes hashet. En nøgle har scopes (read:products, read:orders, read:customers, read:reviews, write:products, write:orders, write:reviews). Du kan tilbagekalde den når som helst med Revoke. Adressen, kaldkropperne og fejlkoderne står på referencesiden under View docs.
Opret en nøgle
- Åbn Settings › Developer › API keys.
- Tryk New key.
- Udfyld Name og vælg Scopes.
- Vælg en dato under Expires (optional), hvis nøglen skal holde op med at virke.
- Tryk Create key.
- Kopiér nøglen. Den vises ikke igen.
En nøgle med udløbsdato virker til slutningen af den dag, svensk tid. Skrivninger, der laves med en nøgle, logges i Activity log under nøglens navn. Læsninger logges ikke.
Operationer
Hvert kald er en POST med Authorization: Bearer bunstack_… og en JSON-krop med op.
| Operation | Scope | Gør |
|---|---|---|
list_products | read:products | Viser produkter, nyeste først |
list_orders | read:orders | Viser ordrer i alle butikker, nyeste først |
get_order | read:orders | Henter én ordre med linjerne |
list_customers | read:customers | Viser kunder, nyeste først |
list_reviews | read:reviews | Viser anmeldelser, nyeste først |
create_product | write:products | Opretter et produkt i kataloget |
update_product | write:products | Ændrer et produkt |
update_order_status | write:orders | Sætter ordrens status |
update_review_status | write:reviews | Godkender eller afviser en anmeldelse |
create_product og update_product tager short_description, teksten ved prisen på produktsiden, som ren tekst. Den må højst være 600 tegn. En længere tekst svarer 400 med invalid_value og field: "short_description". list_products sender den med.
En liste giver højst 500 rækker pr. side. Er siden fuld, indeholder svaret next_before. Send værdien som before for næste side.
Ordrestatus via API'et
update_order_statussvarer409for statuscancelledogrefunded, både til og fra, for alle ordrer. Annullér og refundér i admin.- Status
fulfilledsvarer409for en ordre med hold (Needs attention). - Status
fulfilledsvarer409for en Kustom-ordre, hvor betalingen er reserveret, men ikke trukket. - ProSmart-markeringerne
prosmart_partial,prosmart_refundogprosmart_customer_missingregnes ikke som hold. - En ordre, der hentes i butikken, svarer
409 store_pickup. Registrér udleveringen med Picked up i admin. Det trækker betalingen og markerer ordren som hentet.
Kaldegrænser
| Grænse | Værdi |
|---|---|
| Kald pr. nøgle | 600 pr. minut |
| Skrivninger pr. nøgle | 60 pr. minut, inden for de 600 |
| Kald med en nøgle, der ikke findes | 60 pr. minut pr. IP-adresse |
Når en grænse er nået, svarer API'et 429 med { "error": "rate_limited", "retry_after": 60 } og headeren Retry-After: 60. Vent minuttet ud, før du prøver igen.