---
title: "Webhook fixtures"
description: "Downloadable JSON fixtures for every Flowie Exchange webhook event. Drop-in test payloads for your handler."
canonical: "https://docs.get-flowie.com/fixtures/"
source: "https://docs.get-flowie.com/fixtures/index.html"
---

# Webhook fixtures

Fixtures

# Webhook payload fixtures

Drop these into your handler tests. Every fixture is a real payload Flowie has actually sent — schema-stable across patch releases. The shape mirrors the [events API](<../reference/index.html#events>) and matches what the [webhook envelope](<../reference/webhooks.html#payload>) documents.

Use them in tests, not in production handlers

The `id` values are deterministic — re-using them as real event IDs in your dedupe table will mask actual duplicates. Generate fresh IDs in tests if needed. 

## document.received

Fired when an incoming Peppol document is persisted. Delivered before any user-visible side-effect runs.

document.received.json document.received

Copy JSON [Download](<document.received.json>)

Preview
[code] 
    Loading…
[/code]

## document.sent

Fired when an outgoing document has been handed off to the recipient access point. Delivery is not yet confirmed.

document.sent.json document.sent

Copy JSON [Download](<document.sent.json>)

Preview
[code] 
    Loading…
[/code]

## document.delivered

Fired when the recipient access point confirms final delivery. Final state for outgoing documents.

document.delivered.json document.delivered

Copy JSON [Download](<document.delivered.json>)

Preview
[code] 
    Loading…
[/code]

## document.failed

Fired when delivery permanently fails (recipient rejected, schema error, all retries exhausted). `willRetry` is always `false` at this point.

document.failed.json document.failed

Copy JSON [Download](<document.failed.json>)

Preview
[code] 
    Loading…
[/code]

## document.updated

Fired when document metadata changes (tags, assignee, archive state). The `changes` array describes the field-level diff.

document.updated.json document.updated

Copy JSON [Download](<document.updated.json>)

Preview
[code] 
    Loading…
[/code]

## lifecycle.updated · approved

lifecycle.updated.approved.json lifecycle.updated

Copy JSON [Download](<lifecycle.updated.approved.json>)

Preview
[code] 
    Loading…
[/code]

## lifecycle.updated · paid

Note the `compliance.willReportTo` field — your stack should not also report to PPF (FR) or SDI (IT), Flowie does it. Belgian invoices have `willReportTo: []` (HERMES decommissioned 2025-12-31; Peppol delivery is the compliance event).

lifecycle.updated.paid.json lifecycle.updated

Copy JSON [Download](<lifecycle.updated.paid.json>)

Preview
[code] 
    Loading…
[/code]

## lifecycle.updated · rejected

`reasonCode` follows Peppol BIS rejection codes (`QUA`, `PRI`, `TAX`, …).

lifecycle.updated.rejected.json lifecycle.updated

Copy JSON [Download](<lifecycle.updated.rejected.json>)

Preview
[code] 
    Loading…
[/code]

## company.smp_registered

company.smp_registered.json company.smp_registered

Copy JSON [Download](<company.smp_registered.json>)

Preview
[code] 
    Loading…
[/code]

## compliance.reported

compliance.reported.json compliance.reported

Copy JSON [Download](<compliance.reported.json>)

Preview
[code] 
    Loading…
[/code]

## compliance.reported.failed

The `remediationDocUrl` deep-links to the country-specific error code in the compliance pages.

compliance.reported.failed.json compliance.reported.failed

Copy JSON [Download](<compliance.reported.failed.json>)

Preview
[code] 
    Loading…
[/code]

## Download all fixtures as a bundle

Available on GitHub for vendoring into your test repo:
[code] 
    curl -sL https://github.com/flowie-fr/exchange-api-docs/archive/main.tar.gz \
      | tar -xz --strip=2 exchange-api-docs-main/docs/fixtures \
      -C ./tests/fixtures
[/code]

Or via npm/PyPI helper packages (work in progress; subscribe to the [changelog](<../changelog.html>)).
