Factur-X API for Developers
One endpoint. A PDF/A-3b with EN16931-compliant CII XML. ISCA SHA-256 ledger included. Without reading 400 pages of the standard.
$api = ScellApiClient::withApiKey('sk_live_...');
$invoice = $api->invoices()->builder()
->outgoing()
->facturX()
->issueDate('2026-05-16')
->dueDate('2026-06-15')
->buyer('98765432109876', 'Acme SARL',
new Address('2 av Client', '75002', 'Paris'))
->addLine('Consultation', 10, 150.00, 20.0)
->create();
echo $invoice->invoice_number; // FAC-202605-00123✓ FAC-202605-00123 — PDF/A-3b + XML CII EN16931
Typical client context
Camille Martin
CTO ISV B2B
5–50 ETP · Laravel / Node.js
“Camille is building a vertical ERP for the logistics sector. Her 150 French B2B clients have been requiring Factur-X invoices since January 2026. She has 2 weeks to implement compliance without hiring an EN16931 specialist.”
Common blockers
- 1The EN16931 standard requires 400 pages of specs that nobody wants to read or maintain
- 2A single missing field in the CII XML is enough for a Peppol rejection in production
- 32026 reform compliance (LFR 2022) is not optional for French B2B invoice issuers
- 4Maintaining standards updates (Factur-X V2.2, FNFE schematron) in-house costs 200–400h/year
- 5Testing in sandbox without triggering real fiscal chains is difficult
- 6Implementing an ISCA SHA-256 fiscal ledger in-house takes 3–6 months of development
The Scell.io response
135 endpoints documented in Swagger UI. Three SDKs: PHP (`composer require scell/sdk`), TypeScript (`npm i @scell/sdk`), MCP (`@scell/mcp-client` for AI agents). Isolated sandbox via key prefix `sk_test_*` — same endpoint, distinct PostgreSQL database, zero Peppol effect. One API call generates the PDF/A-3b with BT-84 (IBAN), BG-22 (deposit deductions) tags and types 386/380 calculated automatically. The ISCA SHA-256 ledger runs in the background — anchored on Bitcoin via OpenTimestamps with no configuration.
PHP SDK `scell/sdk`
`composer require scell/sdk`, fluent builder pattern, typed classes, first call in 30 min
TypeScript SDK `@scell/sdk`
strict types, promises, Node.js and Deno, same API as the PHP SDK
44 MCP tools `@scell/mcp-client`
Claude, GPT-4o, Cursor create invoices in natural language, zero glue code
Sandbox `sk_test_*`
same `api.scell.io` endpoint, isolated PostgreSQL database, no Peppol transmission
OpenAPI 3.0 + Swagger UI
135 endpoints with ready-to-copy curl, PHP, TypeScript examples
PDF/A-3b + CII XML conformant to FNFE schematron
zero Peppol rejection, types 386/380/credit note handled automatically
Context & stakes
The EN16931 standard covers 400 pages of specifications. Each transaction type — deposit type 386, balance type 380, credit note, delivery address BG-13 — requires its own mandatory tags in the embedded CII XML. A single missing field triggers a Peppol rejection in production. Scell.io exposes a REST API that absorbs this complexity: you send business data, you receive a PDF/A-3b with CII XML conformant to the FNFE schematron, ready for the Peppol network. The ISCA SHA-256 fiscal ledger is automatic — a `FiscalEntry` is created by a `SECURITY DEFINER` PostgreSQL trigger at each emission, even if your code bypasses the normal path. Bitcoin anchoring via OpenTimestamps on each daily closing.
Real-world use cases
- Vertical B2B ERP issuing Factur-X invoices for 150+ French clients since the 2026 reform
- Project management SaaS handling the full quote → deposit → balance cycle without third-party tools
- B2B marketplace generating a Factur-X invoice per transaction between sellers and buyers
- Mobile invoicing app signing quotes with eIDAS before conversion to invoice
- Claude/GPT agent creating invoices via 44 MCP tools (`scell_create_invoice`, `scell_send_quote`)
- CI/CD pipeline automatically generating recurring monthly invoices with ISCA ledger
Frequently asked questions
How long does it take to integrate Scell.io into an existing Laravel project?
On average 1 day of development: `composer require scell/sdk`, configure the `sk_test_*` key, first call to `$api->invoices()->builder()->create()`. The PHP SDK handles mandatory EN16931 tags (BT-84, BG-22, type 386/380) without additional configuration. Swagger UI documentation is available at `api.scell.io/api/documentation`.
Do we need to maintain Factur-X standard updates after integration?
No. Scell.io maintains Factur-X (V1.0 / V2.2) compliance, FNFE schematron, and EN16931:2017+A1:2019 server-side. Standards updates are deployed without any client-side API changes. The SDK is SemVer versioned: a minor or patch update never breaks the interface.
Is the Scell.io sandbox truly isolated from production?
Yes. The `sk_test_*` key points to a distinct PostgreSQL database (`rdb_sandbox`). No sandbox data touches the production database. The same endpoint `api.scell.io` is used — only the key prefix changes. Sandbox invoices are not transmitted to the Peppol network.
How does the ISCA SHA-256 fiscal ledger work?
Each invoice, credit note or quote issued triggers a `FiscalEntry` with a SHA-256 `chain_hash` computed from the previous hash. The chain is isolated per `(tenant_id, sub_tenant_id)` pair. PostgreSQL `SECURITY DEFINER` triggers guarantee recording even if application code bypasses the normal path. A free Bitcoin OpenTimestamps anchor is performed on each daily closing.
Do the 44 MCP tools work with Claude and GPT-4o?
Yes. The `@scell/mcp-client` package implements the MCP (Model Context Protocol). Claude agents (via claude-code or Anthropic API), GPT-4o (via OpenAI MCP client) and Cursor can call `scell_create_invoice`, `scell_send_quote`, `scell_create_buyer` directly in natural language. No glue code needed.
Does Scell.io support deposit invoices (type 386) and balance invoices (type 380)?
Yes. The full cycle is handled via API: quote `DEV-YYYY-NNNN` → `POST /quotes/{id}/convert-to-deposit` (type 386, VAT immediately due CGI art. 289) → `POST /quotes/{id}/convert-to-balance` (type 380, automatic BG-22 deduction from `parent_invoice_ids`). Each step generates an EN16931-conformant Factur-X and an entry in the ISCA chain.
Your first Factur-X invoice in under 1 day
`composer require scell/sdk` or `npm i @scell/sdk`. sk_test_* key in 60 seconds. 135 Swagger UI documented endpoints. Automatic ISCA SHA-256 ledger.