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.