What's new
Changelog
All Scell.io API updates
- Featurev2.25.0
Factur-X BT-81 compliance: standardized payment means on mark-paid
- Backend — New `PaymentMeansCode` enum (11 UN/ECE 4461 codes: 1, 10 cash, 20 cheque, 30 credit transfer, 42 payment to account, 48 card, 49 direct debit, 57 standing agreement, 58 SEPA SCT, 59 SEPA SDD, 97 clearing) with FR/EN labels
- Backend — POST /v1/invoices/{id}/mark-paid endpoint now requires `payment_means_code` (with optional `payment_means_text` for free-form bank label). 3 controllers covered: outgoing invoices, incoming invoices, tenant incoming
- Backend — Factur-X CII XML now includes `<ram:SpecifiedTradeSettlementPaymentMeans><ram:TypeCode>X</ram:TypeCode>` (was hardcoded to 42 — non-compliant as soon as an invoice was paid by anything other than direct bank transfer)
- Backend — Migration adds `payment_means_code` (varchar 2) + `payment_means_text` (varchar 100) columns on invoices + credit_notes (nullable, backward compatible on historical invoices)
- Dashboard — Antd "Mark as paid" modal with payment-means Select (common B2B France codes prioritized: SEPA credit transfer, classic transfer, cheque, card, direct debit, cash), optional bank label field, default = 58 (SEPA transfer)
- PHP SDK scell/sdk v2.25.0 — `Scell\Sdk\Enums\PaymentMeansCode` enum + `InvoicesResource::markPaid()` with required param
- TypeScript SDK @scell/sdk v2.25.0 — `PaymentMeansCode` union literal type + typed `markPaid()`
- MCP Agent @scell/mcp-client v2.25.0 — New tools `scell_mark_invoice_paid` + `scell_mark_incoming_invoice_paid` (catalog 96 → 98)
- Public OpenAPI sync: `PaymentMeansCode` schema exposed + MarkPaidRequest enriched with examples
- Tests — 9 MarkPaidWithMeansCodeTest tests (22 assertions): enum cast, persistence, strict validation, BT-81 XML generation, backward compat
- Platformv2.24.0
SDKs aligned on v2.24: CreditPacks, FEC all, InvoiceTemplates wired, BalanceResource deprecated
- Backend — Public OpenAPI sync drift 15→0 (4 endpoints + 8 schemas added: VAT context, FEC all, archive-health, API key rotate). 180 paths + 40 schemas documented.
- Backend — `ApiDocumentation` official SDK mentions bumped to v2.24.0+
- PHP SDK `scell/sdk` v2.24.0 — public `CreditPacksResource`, `BillingResource::listPacks()` + `checkoutPack()`, cross sub-tenant `FiscalResource::exportFecAll()`, `TenantIncomingInvoiceResource::dispute()`, typed `PaymentSchedulePreset` DTO. `BalanceResource` marked `@deprecated` (endpoints removed backend 2026-05-10). Tests 156→191 (920 assertions). PHPStan clean.
- TypeScript SDK `@scell/sdk` v2.24.0 — `client.invoiceTemplates` now wired (was orphan), `client.version()` helper for drift detection, public `client.creditPacks`, 3 broken Fiscal doublon methods removed. `BalanceResource` marked `@deprecated`. Tests 118→133 (15 new). Zero runtime dependencies preserved.
- MCP Agent `@scell/mcp-client` v2.24.0 — **24 new tools** (catalog 72→96): Buyers (5), Invoice Templates (6), Branding (3), Billing (4), Credit Packs (2), Sub-Tenant CRUD (4). Fixed `VERSION` CLI const (frozen since v2.15 at 2.14.0), fixed header tools count, fixed `scell_tenant_list_signatures` description (removed obsolete `403 COMPANY_REQUIRED` ref). 190/190 tests green.
- Site — `/sdk` page updated with the 3 v2.24.0 versions + "96 tools" mention on the MCP card. `/api-docs` page (Swagger UI) serves the synced OpenAPI.
- PostHog EU project 188671 activated on all 3 sites (Next.js website + Vite dashboard) — privacy-first product analytics, consent-aware via P2.21 store, active PII blocklist, host `eu.i.posthog.com` (GDPR).
- llms.txt docs (PHP, TS, MCP) — v2.24.0 sections added with features and notes (Refund not applicable SDK-side: goes via CreditNote or Stripe webhook).
- Featurev2.23.0
Exhaustive enum coverage in SDKs + docs
- PHP SDK scell/sdk v2.21.0 — 19 enums exposed under `Scell\Sdk\Enums\*` (8 PHP BackedEnums synced via back→front codegen + 11 string enums backed by PostgreSQL CHECK constraints)
- TypeScript SDK @scell/sdk v2.23.0 — same 19 enums exposed as strict union types (`InvoiceType`, `QuoteStatus`, `VatCategory`, `SignatureStatus`, etc.)
- MCP Agent @scell/mcp-client v2.22.0 — tool descriptions enriched with allowed values for the 19 enums (the LLM now sees the full API vocabulary)
- Exposed enums: `InvoiceTemplateKind`, `InvoiceType`, `PaymentScheduleLineAmountType`, `PaymentScheduleLineStatus`, `QuoteStatus`, `QuoteAuditAction` (21 values), `SubTenantOnboardingStatus`, `VatCategory` (8 EN16931 categories)
- DB enums: `CreditNoteStatus`, `CreditNoteType`, `SignatureStatus`, `SignatureArchiveStatus`, `InvoiceArchiveStatus`, `TenantKybStatus`, `CompanyStatus`, `ApiKeyStatus`, `TenantInvoiceStatus`, `TenantTransactionType`, `OnboardingSessionStatus`
- Website — new "Enums & Statuses" section on the /sdk page listing the 19 enums with values and description (no more guessing on quote, signature, sub-tenant statuses…)
- llms.txt documentation (PHP, TS, MCP) — "Enums & statuses" section aligned 1:1 with the SDK code
- Featurev2.22.0
Automatic refunded status on invoices with credit notes
- Backend — new `refunded` and `partially_refunded` statuses added to the invoice check constraint (16 statuses total)
- Backend — `CreditNoteObserver` automatically sets the status on credit note validate: `refunded` when sum of credit notes ≥ total incl. VAT, otherwise `partially_refunded`
- Backend — new `refund_status` (none|partial|full) and `total_refunded` (float) fields exposed on every Invoice payload (GET /invoices, GET /invoices/{id})
- Backend — retroactive backfill applied in prod: 1 invoice impacted (QRCOM-202605-00001) realigned to a coherent `partially_refunded`
- PHP SDK scell/sdk v2.20.0 — complete `InvoiceStatus` enum (16 values) + `refund_status` and `total_refunded` fields on the Invoice DTO
- TypeScript SDK @scell/sdk v2.22.0 — exhaustive `InvoiceStatus` union type + `refund_status` and `total_refunded` on the Invoice interface
- MCP Agent @scell/mcp-client v2.21.0 — enriched tool descriptions for invoice tools with the new statuses and refund_* fields
- Dashboard — "Mark paid" button hidden as soon as a validated credit note exists on the invoice (business inconsistency prevented client-side)
- Bonus fix — signed quote PDF: stamp rendered as a clean image (instead of raw text) + second-precise timestamp
- Bonus fix — mark-paid endpoint: target status corrected to `completed` (not `paid`) to match the ISCA workflow, fixes the historical 500
- Bonus fix — deposit/balance invoice wizard: buyer is now pre-filled from the source quote (parity with the standard mode)
- Featurev2.21.0
Standard invoice from a quote + critical fixes for quote signature & UX
- New: POST /api/v1/invoices accepts parent_quote_id for standard invoices — invoice↔quote link preserved (tenant-scoped anti-IDOR)
- Dashboard — "Create invoice" button on quote drawer: redirects to the wizard pre-filled (lines + buyer copied from quote)
- Dashboard — "Pre-fill from a quote" selector directly in the create invoice wizard (standard mode)
- Dashboard — "To invoice" total now reactive on keystroke in the deposit modal AND in the invoice wizard (bug fix: value was not updating on %/€ switch or scroll)
- PHP SDK scell/sdk v2.19.0 — fluent method $builder->parentQuoteId() + payload fix (the field was silently dropped since v2.15.0)
- TypeScript SDK @scell/sdk v2.21.0 — parent_quote_id field on CreateInvoiceInput
- MCP Agent @scell/mcp-client v2.20.0 — parentQuoteId field on the scell_create_invoice tool
- Critical fix — handwritten signature canvas on public quotes (static import of signature_pad, fixes empty bundle in production)
- Critical fix — CSRF 419 on public quote accept/refuse (api/v1/public/quotes/* routes excluded from stateful Sanctum middleware)
- Public quote confirmation page — "Close window" button (window.close + fallback hint) instead of back to home
- Featurev2.16.0
SDKs — Full invoices & credit notes CRUD + mark-paid
- TypeScript SDK @scell/sdk v2.16.0 — invoices.update(), invoices.delete(), creditNotes.update(), creditNotes.delete() (draft only, ISCA compliance)
- PHP SDK scell/sdk v2.14.0 — same update/delete methods added on PHP side
- MCP Agent @scell/mcp-client v2.15.0 — new scell_mark_invoice_paid tool (mark outgoing invoice as paid)
- API Backend — POST /invoices/{id}/mark-paid for outgoing invoices (validated/transmitted/sent/accepted statuses)
- /sdk page overhauled — examples with complete payloads verified against backend, Quotes & Payment Schedule sections added, menu reordered
- llms.txt documentation updated (API + MCP)
- Featurev1.9.0
MCP Agent + Official SDKs
- TypeScript SDK @scell/sdk v1.10.0 — 16 resources, full type coverage
- PHP SDK scell/sdk — native Laravel integration, 16 resources
- MCP Agent @scell/mcp-client v1.5.0 — 33 tools for Claude, Cursor, VS Code
- Public llms.txt and openapi.json files for AI consumption
- Platformv1.5.0
Multi-tenant B2B + ISCA Compliance
- Full Tenant API: sub-tenants, delegated billing, consolidated billing
- ISCA self-certification: attestation, technical dossier, measures register
- Immutable fiscal ledger with SHA-256 hash chain
- FEC export (French accounting entries file) for tax authorities
- Emergency fiscal kill-switch
- Featurev1.2.0
Full Factur-X Support
- Automatic generation of compliant PDF/A-3 files
- Validation of BASIC, EN 16931 and EXTENDED profiles
- Conversion between formats (Factur-X, UBL 2.1, CII D16B)
- Native Reliable Audit Trail (PAF) support
- Platformv1.1.0
eIDAS Signatures Overhaul
- Multi-signer support (sequential and parallel)
- SMS OTP through our certified signature partner — included in per-signer price
- Customisable invitation emails
- Webhooks signature.signed, signature.completed, signature.expired
- Timestamped proof file with 10-year archiving
- Launchv1.0.0
Public Launch
- REST API open in public beta
- Electronic Invoicing and eIDAS EU-SES Signature modules
- Free sandbox with sk_test_ keys
- Web dashboard for managing invoices and signatures
- HMAC-SHA256 webhooks with automatic retry