Ga naar de hoofdinhoud
Een Fabrixa-webhook-payload op het scherm — ondertekende JSON-bestelgebeurtenis, tegen een geweven textielachtergrond
Ontwikkelaars · Referentie voor webhooks

Elk event. Elke payload. Ondertekend.

Fabrixa stuurt bestelgebeurtenissen in realtime naar je endpoint. Je server stelt één openbaar POST-endpoint beschikbaar; wij sturen de volledige bestelgegevens met een HMAC-SHA256-handtekening en het event-topic in de headers. Controleer de handtekening, stuur snel een 200-statuscode terug en verwerk de gegevens asynchroon.

HMAC-SHA256 · order.created / order.updated · 10 pogingen tot bezorging

Verzoekheaders

Drie headers identificeren en verifiëren het verzoek.

Elke POST-webhook bevat dezelfde drie headers. Gebruik x-webhook-topic om de gebeurtenis door te sturen en x-webhook-signature om dit te controleren voordat je de body vertrouwt.

content-type is altijd application/json. x-webhook-signature is de Base64-gecodeerde HMAC-SHA256 van de onbewerkte body. x-webhook-topic is de naam van het event.

Inkomende headers
{
  "content-type":        "application/json",
  "x-webhook-topic":     "order.updated",
  "x-webhook-signature": "YmEwNjBhMGMy...MAxMw=="
}
Webhook-gebeurtenissen

Vandaag twee topics.

Elke webhook wordt geactiveerd door een specifieke x-webhook-topic waarde. Beide bevatten het volledige bestelobject, zodat één enkele handler op basis van het topic kan schakelen.

order.created

Er is een nieuwe bestelling geplaatst.

Wordt geactiveerd wanneer er een order wordt aangemaakt in Fabrixa — hetzij via een API-verzoek, hetzij rechtstreeks in het platform.

order.updated

Een bestaande bestelling wordt gewijzigd.

Wordt geactiveerd wanneer de ordergegevens veranderen — bijvoorbeeld wanneer de orderstatus of de afhandelingsstatus verandert.

Status

Wat de statusvelden kunnen aangeven.

De lading bevat zowel een bestelling status en een fulfillment_status. Schakel deze in om je eigen bestelstatus te bepalen.

Bestelstatussen
  • Completed — verzonden of afgehaald en ontvangst bevestigd.
  • Canceled — de betaling is geannuleerd; de transactie is niet voltooid.
  • On hold — de bestelling is tijdelijk geblokkeerd.
  • Imported — de bestelling is in het platform geïmporteerd.
Verwerkingsstatussen
  • Unfulfilled — nog niet opgesteld of verzonden.
  • Partially fulfilled — sommige artikelen zijn al verwerkt of verzonden, andere staan nog in de wachtrij.
  • Scheduled — gepland en ingepland voor verwerking.
  • Rejected — het verzoek om uitvoering is afgewezen.
  • Fulfilled — volledig verwerkt en geleverd of ter beschikking gesteld.
Payload

Hoe de body eruitziet.

De volledige order.updated payload, precies zoals de API-referentie die beschrijft — de bestelling, de statussen ervan en de rijen met gegevens over variant, product en bronbestand.

POST-body — order.updated
{
  "id": 23069,
  "number": "1250211835",
  "comments": null,
  "is_archived": false,
  "status": "imported",
  "fulfillment_status": "unfulfilled",
  "purchased_at": "2025-04-17T16:17:21.000000Z",
  "created_at":   "2025-04-17T16:17:23.000000Z",
  "updated_at":   "2025-04-18T07:43:52.000000Z",
  "rows": [
    {
      "id": 27954,
      "quantity": 1,
      "client_barcode": "1250211835",
      "fulfillment_status": "unfulfilled",
      "variant": {
        "id": 293457,
        "name": "Sherpa fleece deken",
        "subtitle": "100x150",
        "SKU": "SFD787231",
        "product": {
          "id": 5319, "name": "Sherpa fleece deken", "subtitle": "Sherpa fleece deken"
        }
      },
      "sources": [
        {
          "type": "print",
          "url": "https://storage.googleapis.com/fabrixa-api/…/120002795400.pdf",
          "properties": { "fill_style": "contain" }
        }
      ]
    }
  ]
}
Controleer de handtekening

Bereken de HMAC opnieuw, vergelijk de resultaten en vertrouw vervolgens de body.

Bereken de HMAC-SHA256 van de onbewerkte payload van het verzoek opnieuw met je geheime sleutel, codeer deze in Base64 en vergelijk deze met x-webhook-signature. Gebruik altijd een vergelijking met constante tijd (hash_equals) om timingaanvallen te voorkomen.

Raw PHP
$payload = file_get_contents('php://input');
$secret  = 'your-secret-key';

$expected = base64_encode(
  hash_hmac('sha256', $payload, $secret, true)
);
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

// constant-time compare
if (!hash_equals($expected, $received)) {
  http_response_code(403);
  exit('Invalid signature');
}
Laravel
public function handle(Request $request)
{
  $secret  = 'your-secret-key';
  $payload = $request->getContent();

  $expected = base64_encode(
    hash_hmac('sha256', $payload, $secret, true)
  );
  $received = $request->header('x-webhook-signature');

  if (!hash_equals($expected, $received)) {
    abort(403, 'Invalid signature');
  }
  // Continue processing…
}
Levering & respons

Nieuwe pogingen en het antwoord dat we verwachten.

Nieuwe pogingen

Maximaal 10 pogingen, daarna wordt de webhook uitgeschakeld

A 2xx (bijv. 200) of een 301 / 302 telt als succes. Bij elke 4xx, 5xx of time-out wordt er een nieuwe poging ondernomen — in totaal maximaal 10 keer. Na de tiende mislukte poging wordt de webhook gedeactiveerd.

Antwoord

Snel een 200-status retourneren, asynchroon verwerken

Bevestig met 200 OK zo snel mogelijk, en verwerk de payload vervolgens asynchroon via een achtergrondtaak of wachtrij. Een traag endpoint kan als een fout worden beschouwd, zelfs als het uiteindelijk toch lukt.

Maak je handler

Configureer je webhook-endpoint.

De integratiehandleiding leidt je stap voor stap door het registreren van je endpoint en het afhandelen van de volledige levenscyclus van een bestelling. De volledige API-referentie bevat het complete payload-schema.