Get started with Heartwood in under 10 minutes
Current scope (21/07/2026): Factur-X generation, validation, rule packs (Epic 1), documentation (Epic 2), public validator (Epic 3), self-service accounts/billing (Epic 4).
1. Create an account and get a Découverte key (2 min)
Self-service signup, no human contact (FR-9):
curl -X POST "https://api.example/signup" \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "a-sufficiently-long-password"}'
# {"accountId": "...", "apiKey": "fxk_...", "message": "compte créé — vérifiez votre e-mail pour activer la clé (FR-9)"}
The key is created but inactive until the email is confirmed.
Click the link received by email (GET /verify?token=...) to activate it.
The Découverte tier includes [ASSUMPTION] 20 documents/month, no credit
card required — see the accounts and billing
page for tier details.
You then manage your keys and usage in the server-rendered account area:
https://api.example/account/ (login by email/password).
2. First call: validate a document (2 min)
curl -X POST "https://api.example/v1/validate" \
-H "Authorization: Bearer $FACTURX_API_KEY" \
--data-binary @my-invoice.xml
Response: a conforme: true|false verdict, always accompanied by the
rule pack applied — never an absolute promise of regulatory compliance.
Since Story 3.7, schematronChecked: true for the Factur-X profiles
EN16931 and EXTENDED-CTC-FR (official FNFE-MPE reference repository,
real BR-* rules) — see the regulation page for the detail of what this
covers today.
3. Generate a Factur-X invoice (5 min)
curl -X POST "https://api.example/v1/generate/facturx?profile=EN16931" \
-H "Authorization: Bearer $FACTURX_API_KEY" \
-H "Content-Type: application/json" \
-d @my-invoice.json \
-o invoice.pdf
See web/docs/examples/ for complete examples by
language (curl, PHP, Python, JS, Go).
Common errors
| Code | Meaning | Action |
|---|---|---|
| 401 | Missing or invalid key | Check the Authorization: Bearer ... header |
| 422 | Incomplete invoice | The missing[] body lists the missing fields by their BT-* code |
| 400 | Unknown profile or rule pack | profile must be EN16931 or EXTENDED-CTC-FR |
| 413 | Document > 20 MB | Rejected before any processing |
| 429 | Découverte quota exceeded (20 documents/month [ASSUMPTION]) |
Wait for the reset (date provided in detail) or subscribe to a paid tier on /account/ |
| 409 | Idempotency-Key reused with a different body |
Use a new Idempotency-Key for a new body (see accounts and billing) |
Full specification
GET /v1/openapi.json — up-to-date OpenAPI 3.0.3 specification, kept in
sync with the implementation by contract tests in CI.