Reference API Scell.io
Version : 1.0 Derniere mise a jour : 2026-03-03 Base URL : https://api.scell.io/api/v1Note : Le mode sandbox est determine par le prefixe de la cle API (sk_test_ = sandbox, sk_live_ = production), non par l'URL.
Table des matieres
- Introduction
- Authentification
- Pagination et filtrage
- Codes d'erreur
- Rate limiting
- 1. Auth
- 2. Companies
- 3. Invoices
- 4. Signatures
- 5. Credit Notes (Avoirs)
- 6. API Keys
- 7. Balance
- 8. Webhooks
- 9. Incoming Invoices (Factures fournisseurs)
- 10. Tenant (Multi-Tenant B2B)
- 11. Sub-Tenants
- 12. Tenant Invoices
- 13. Tenant Credit Notes
- 14. Tenant Billing
- 15. Tenant Incoming Invoices
- 16. KYB Documents
- 17. Onboarding
- 18. Fiscal Entries
- 19. Fiscal Closings
- 20. Fiscal Compliance
- 21. Fiscal Integrity
- 22. Fiscal Rules
- 23. Fiscal Anchors
- 24. Fiscal Kill Switch
- 25. Fiscal Export
- 26. Admin
- 27. MCP Server
- 28. Sandbox
- 29. Tenant Authentication
- 30. Tenant Onboarding
- 31. ISCA Fiscal Documents
- 32. Public Endpoints
Introduction
Scell.io est une plateforme B2B de facturation electronique (Factur-X/UBL/CII) et de signature electronique simple (eIDAS EU-SES) via API.
Toutes les requetes utilisent le format JSON. Toutes les reponses sont en JSON avec le header Content-Type: application/json.
URLs de base
| Environnement | URL |
|---|---|
| Production & Sandbox | https://api.scell.io/api/v1 |
Distinction sandbox/production : Le mode est determine par le prefixe de la cle API (pk_test_/sk_test_/tk_test_ = sandbox, pk_live_/sk_live_/tk_live_ = production), peu importe le header utilise (X-API-Key, X-Publishable-Key, ou X-Tenant-Key).
Tarification
| Operation | Prix unitaire |
|---|---|
| Facture electronique | 0.04 EUR |
| Signature electronique | 1.20 EUR |
| Avoir (credit note) | 0.04 EUR |
Authentification
L'API supporte 4 modes d'authentification selon le contexte d'utilisation.
1. Bearer Token (Dashboard)
Utilise par le frontend / dashboard web. Obtenu via POST /v1/auth/login.
Authorization: Bearer <TOKEN>2. API Key (API externe)
Utilise pour l'integration programmatique. Cle generee via le dashboard.
X-API-Key: sk_live_x8z...Prefixes :
sk_live_: Productionsk_test_: Sandbox
3. Tenant Key (Multi-Tenant)
Utilise par les partenaires integrant la facturation pour leurs clients. Cle secrete a conserver côte serveur.
X-Tenant-Key: sk_live_xxxxxxPrefixes :
sk_test_: Secret Key (Sandbox) - API backend, jamais expose côte clientsk_live_: Secret Key (Production) - API backend, jamais expose côte client
4. Publishable Key (Onboarding)
Utilise pour l'onboarding B2B des partenaires. Cle publiable pouvant etre expose côte client dans les widgets.
X-Publishable-Key: pk_test_xxxxxxPrefixes :
pk_test_: Publishable Key (Sandbox) - Widgets client, peut etre exposepk_live_: Publishable Key (Production) - Widgets client, peut etre expose
Pagination et filtrage
Les endpoints retournant des listes sont pagines.
Parametres de pagination
| Parametre | Type | Defaut | Description |
|---|---|---|---|
page | integer | 1 | Numero de page |
per_page | integer | 25 | Elements par page (max 100) |
Format de reponse paginee
{
"data": [],
"meta": {
"current_page": 1,
"last_page": 10,
"per_page": 25,
"total": 250
}
}Filtres communs
| Parametre | Type | Description |
|---|---|---|
status | string | Filtrer par statut |
from / date_from | date | Date de debut (YYYY-MM-DD) |
to / date_to | date | Date de fin (YYYY-MM-DD) |
environment | string | sandbox ou production |
company_id | uuid | Filtrer par entreprise |
Codes d'erreur
Format d'erreur standard
{
"message": "Description lisible de l'erreur",
"errors": {
"champ": ["Message de validation"]
},
"error_code": "CODE_METIER"
}Codes HTTP
| Code | Signification |
|---|---|
| 200 | Succes |
| 201 | Ressource creee |
| 400 | Requete invalide |
| 401 | Non authentifie |
| 403 | Acces interdit |
| 404 | Ressource introuvable |
| 422 | Erreur de validation |
| 429 | Rate limit depasse |
| 500 | Erreur serveur |
Codes metier
| Code | Signification |
|---|---|
INSUFFICIENT_BALANCE | Solde insuffisant pour l'operation |
INVOICE_IMMUTABLE | Facture non modifiable (champs fiscaux verrouilles) |
FISCAL_KILLSWITCH_ACTIVE | Kill-switch fiscal actif, operations bloquees |
SIGNATURE_EXPIRED | Demande de signature expiree |
ALREADY_COMPLETED | Signature deja terminee |
CANNOT_REMIND | Rappel impossible pour cette signature |
NO_PENDING_SIGNERS | Aucun signataire en attente |
FILE_NOT_FOUND | Fichier non disponible |
Rate limiting
| Contexte | Limite |
|---|---|
| Production (API Key) | 60 requetes/minute |
| Sandbox (API Key) | 1000 requetes/minute |
| Tenant API | 100 requetes/minute |
| Onboarding | 30 requetes/minute |
| Onboarding exchange | 5 requetes/minute |
| MCP | 60 requetes/minute |
Headers de reponse :
X-RateLimit-Limit: Limite totaleX-RateLimit-Remaining: Requetes restantesX-RateLimit-Reset: Timestamp de reinitialisation
1. Auth
POST /v1/auth/register
Inscription d'un nouvel utilisateur. Cree un compte et retourne un token d'acces.
Authentification : Aucune
Corps de la requete :
| Champ | Type | Requis | Description |
|---|---|---|---|
email | string (email) | oui | Adresse email |
password | string | oui | Mot de passe |
first_name | string | oui | Prenom |
last_name | string | oui | Nom |
phone | string | oui | Telephone (+33...) |
Reponse (201) :
{
"message": "Inscription reussie",
"user": {
"id": "uuid",
"email": "user@example.com",
"first_name": "Jean",
"last_name": "Dupont",
"phone": "+33612345678",
"role": "user",
"created_at": "2026-01-15T10:30:00Z"
},
"token": "1|AbCdEf123456..."
}Exemples :
# curl
curl -X POST https://api.scell.io/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "secret123",
"first_name": "Jean",
"last_name": "Dupont",
"phone": "+33612345678"
}'// JavaScript
const response = await fetch('https://api.scell.io/api/v1/auth/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'user@example.com',
password: 'secret123',
first_name: 'Jean',
last_name: 'Dupont',
phone: '+33612345678'
})
});
const data = await response.json();// PHP
$client = new \GuzzleHttp\Client();
$response = $client->post('https://api.scell.io/api/v1/auth/register', [
'json' => [
'email' => 'user@example.com',
'password' => 'secret123',
'first_name' => 'Jean',
'last_name' => 'Dupont',
'phone' => '+33612345678'
]
]);# Python
import requests
response = requests.post("https://api.scell.io/api/v1/auth/register", json={
"email": "user@example.com",
"password": "secret123",
"first_name": "Jean",
"last_name": "Dupont",
"phone": "+33612345678"
})
print(response.json())Erreurs : 422 (validation : email deja pris, mot de passe trop court)
POST /v1/auth/login
Authentifie un utilisateur et retourne un token d'acces.
Authentification : Aucune
Corps de la requete :
| Champ | Type | Requis | Description |
|---|---|---|---|
email | string (email) | oui | Adresse email |
password | string | oui | Mot de passe |
Reponse (200) :
{
"message": "Connexion reussie",
"user": {
"id": "uuid",
"email": "user@example.com",
"first_name": "Jean",
"last_name": "Dupont",
"role": "user"
},
"token": "1|AbCdEf123456..."
}curl -X POST https://api.scell.io/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "secret123"}'Erreurs : 422 (identifiants incorrects, compte desactive)
GET /v1/auth/google
Retourne l'URL de redirection pour l'authentification Google OAuth.
Authentification : Aucune
Reponse (200) :
{
"url": "https://accounts.google.com/o/oauth2/auth?client_id=..."
}curl -X GET https://api.scell.io/api/v1/auth/googleGET /v1/auth/google/callback
Gere le retour de Google OAuth. Cree ou connecte l'utilisateur et retourne un token.
Authentification : Aucune (callback Google)
Reponse (200) :
{
"message": "Connexion reussie via Google",
"user": { "id": "uuid", "email": "...", "first_name": "...", "last_name": "..." },
"token": "1|..."
}Erreurs : 401 (echec authentification Google)
POST /v1/auth/forgot-password
Envoie un email de reinitialisation de mot de passe.
Authentification : Aucune
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
email | string (email) | oui | Adresse email du compte |
curl -X POST https://api.scell.io/api/v1/auth/forgot-password \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com"}'POST /v1/auth/reset-password
Reinitialise le mot de passe avec le token recu par email.
Authentification : Aucune
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
token | string | oui | Token de reinitialisation |
email | string (email) | oui | Adresse email |
password | string | oui | Nouveau mot de passe |
password_confirmation | string | oui | Confirmation |
curl -X POST https://api.scell.io/api/v1/auth/reset-password \
-H "Content-Type: application/json" \
-d '{
"token": "abc123...",
"email": "user@example.com",
"password": "newpassword",
"password_confirmation": "newpassword"
}'POST /v1/auth/logout
Deconnexion : revoque le token actuel.
Authentification : Bearer Token
curl -X POST https://api.scell.io/api/v1/auth/logout \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"message": "Deconnexion reussie"
}GET /v1/auth/me
Retourne le profil de l'utilisateur authentifie.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/auth/me \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": {
"id": "uuid",
"email": "user@example.com",
"first_name": "Jean",
"last_name": "Dupont",
"phone": "+33612345678",
"role": "user",
"is_active": true,
"avatar_url": null,
"last_login_at": "2026-01-15T10:30:00Z",
"created_at": "2026-01-10T08:00:00Z"
}
}2. Companies
GET /v1/companies
Liste les entreprises de l'utilisateur connecte.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/companies \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": [
{
"id": "uuid",
"name": "Ma Societe",
"siret": "12345678901234",
"vat_number": "FR12345678901",
"legal_form": "SAS",
"address_line1": "1 Rue de la Paix",
"postal_code": "75001",
"city": "Paris",
"country": "FR",
"status": "active",
"kyc_completed_at": null,
"created_at": "2026-01-10T08:00:00Z"
}
]
}POST /v1/companies
Cree une nouvelle entreprise.
Authentification : Bearer Token
Corps de la requete :
| Champ | Type | Requis | Description |
|---|---|---|---|
name | string | oui | Raison sociale |
siret | string (14 car.) | oui | Numero SIRET (unique) |
vat_number | string | non | Numero TVA intracommunautaire |
legal_form | string | non | Forme juridique (SAS, SARL...) |
address_line1 | string | oui | Adresse ligne 1 |
address_line2 | string | non | Adresse ligne 2 |
postal_code | string | oui | Code postal |
city | string | oui | Ville |
country | string (2 car.) | non | Code pays ISO (defaut: FR) |
phone | string | non | Telephone |
email | string (email) | non | Email de contact |
website | string (url) | non | Site web |
curl -X POST https://api.scell.io/api/v1/companies \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Ma Societe",
"siret": "12345678901234",
"address_line1": "1 Rue de la Paix",
"postal_code": "75001",
"city": "Paris",
"country": "FR"
}'Reponse (201) :
{
"message": "Entreprise creee avec succes",
"data": { "id": "uuid", "name": "Ma Societe", "siret": "12345678901234", "..." : "..." }
}Erreurs : 422 (SIRET invalide, SIRET deja enregistre)
GET /v1/companies/{id}
Recupere les details d'une entreprise.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/companies/{id} \
-H "Authorization: Bearer <TOKEN>"PUT /v1/companies/{id}
Met a jour une entreprise.
Authentification : Bearer Token
Corps : Memes champs que la creation (tous optionnels).
curl -X PUT https://api.scell.io/api/v1/companies/{id} \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"phone": "+33612345678", "email": "contact@masociete.fr"}'DELETE /v1/companies/{id}
Supprime une entreprise.
Authentification : Bearer Token
curl -X DELETE https://api.scell.io/api/v1/companies/{id} \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"message": "Entreprise supprimee"
}POST /v1/companies/{id}/kyc
Lance la procedure KYC pour une entreprise.
Authentification : Bearer Token
curl -X POST https://api.scell.io/api/v1/companies/{id}/kyc \
-H "Authorization: Bearer <TOKEN>"GET /v1/companies/{id}/kyc/status
Retourne le statut KYC d'une entreprise.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/companies/{id}/kyc/status \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": {
"status": "pending",
"completed_at": null,
"reference": null
}
}3. Invoices
POST /v1/invoices
Cree une nouvelle facture electronique. En production, debite 0.04 EUR du solde.
Authentification : API Key (X-API-Key)
Corps de la requete :
| Champ | Type | Requis | Description |
|---|---|---|---|
external_id | string | non | Identifiant externe (votre reference) |
invoice_number | string | oui | Numero de facture |
direction | string | oui | outgoing (vente) ou incoming (achat) |
output_format | string | oui | facturx, ubl ou cii |
issue_date | date | oui | Date d'emission (YYYY-MM-DD) |
due_date | date | non | Date d'echeance |
currency | string (3 car.) | non | Devise ISO (defaut: EUR) |
total_ht | number | oui | Montant HT |
total_tax | number | oui | Montant TVA |
total_ttc | number | oui | Montant TTC |
seller_siret | string (14 car.) | oui | SIRET vendeur |
seller_name | string | oui | Nom vendeur |
seller_address | object | oui | Adresse vendeur |
seller_address.line1 | string | oui | Ligne 1 |
seller_address.postal_code | string | oui | Code postal |
seller_address.city | string | oui | Ville |
seller_address.country | string (2 car.) | non | Code pays ISO |
buyer_siret | string (14 car.) | conditionnel | SIRET acheteur — requis SI buyer_country=FR ET buyer_is_individual n'est pas true. Voir B2C ci-dessous. |
buyer_name | string | oui | Nom acheteur (raison sociale OU nom complet du particulier) |
buyer_address | object | oui | Adresse acheteur (meme structure que seller) |
buyer_is_individual | boolean | non | Flag B2C. true si l'acheteur est un particulier (defaut: false). Quand true, buyer_siret / buyer_vat_number / buyer_legal_id deviennent optionnels et la generation Factur-X / UBL / CII omet BT-46/BT-47/BT-48 (BR-CO-26 EN16931). Les mentions legales B2B (Code de commerce L441-10) sont automatiquement supprimees. |
lines | array | oui | Lignes de facture (min: 1) |
lines[].description | string | oui | Description de la ligne |
lines[].quantity | number | oui | Quantite |
lines[].unit_price | number | oui | Prix unitaire HT |
lines[].tax_rate | number | oui | Taux TVA (%) |
lines[].total_ht | number | oui | Total HT de la ligne |
lines[].total_tax | number | oui | TVA de la ligne |
lines[].total_ttc | number | oui | TTC de la ligne |
archive_enabled | boolean | non | Archivage longue duree |
B2B — Acheteur entreprise française (cas standard)
curl -X POST https://api.scell.io/api/v1/invoices \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"invoice_number": "FACT-2026-001",
"direction": "outgoing",
"output_format": "facturx",
"issue_date": "2026-01-15",
"due_date": "2026-02-15",
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00,
"seller_siret": "12345678901234",
"seller_name": "Ma Societe SAS",
"seller_address": {
"line1": "1 Rue de la Paix",
"postal_code": "75001",
"city": "Paris",
"country": "FR"
},
"buyer_siret": "98765432109876",
"buyer_name": "Client SARL",
"buyer_address": {
"line1": "10 Avenue des Champs",
"postal_code": "75008",
"city": "Paris",
"country": "FR"
},
"lines": [
{
"description": "Prestation de conseil",
"quantity": 10,
"unit_price": 100.00,
"tax_rate": 20.00,
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00
}
]
}'B2C — Acheteur particulier (depuis backend v2026-05-03)
Pour un acheteur particulier (B2C), passer "buyer_is_individual": true. Le SIRET / VAT / legal_id deviennent alors optionnels et le Factur-X genere est conforme BR-CO-26.
curl -X POST https://api.scell.io/api/v1/invoices \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"invoice_number": "FACT-2026-002",
"direction": "outgoing",
"output_format": "facturx",
"issue_date": "2026-05-03",
"due_date": "2026-06-03",
"total_ht": 150.00,
"total_tax": 30.00,
"total_ttc": 180.00,
"seller_siret": "12345678901234",
"seller_name": "Coach Pro SAS",
"seller_country": "FR",
"seller_address": {
"line1": "1 Rue de la Paix",
"postal_code": "75001",
"city": "Paris",
"country": "FR"
},
"buyer_name": "Marie Dupont",
"buyer_country": "FR",
"buyer_address": {
"line1": "12 Rue de Rivoli",
"postal_code": "75001",
"city": "Paris",
"country": "FR"
},
"buyer_is_individual": true,
"lines": [
{
"description": "Coaching individuel",
"quantity": 1,
"unit_price": 150.00,
"tax_rate": 20.00,
"total_ht": 150.00,
"total_tax": 30.00,
"total_ttc": 180.00
}
]
}'Effets cote serveur quand buyer_is_individual=true :
- Validation :
buyer_siret/buyer_vat_number/buyer_legal_idnon requis (meme sibuyer_country=FR). - Factur-X / UBL / CII genere : balises
BT-46(BuyerLegalOrganisation),BT-47(BuyerTaxIdentifier),BT-48(BuyerVATIdentifier) omises. SeulBT-44(Name) etBG-8(Address) sont conserves. Conforme EN16931 BR-CO-26. - Conditions de paiement : les mentions B2B obligatoires (Code de commerce L441-10 — penalites de retard 3x taux legal, indemnite forfaitaire 40 EUR) sont automatiquement supprimees.
- Les avoirs (credit notes) crees a partir d'une facture B2C heritent du flag
buyer_is_individual=true.
// JavaScript
const response = await fetch('https://api.scell.io/api/v1/invoices', {
method: 'POST',
headers: {
'X-API-Key': 'sk_live_xxx',
'Content-Type': 'application/json'
},
body: JSON.stringify({
invoice_number: 'FACT-2026-001',
direction: 'outgoing',
output_format: 'facturx',
issue_date: '2026-01-15',
total_ht: 1000.00,
total_tax: 200.00,
total_ttc: 1200.00,
seller_siret: '12345678901234',
seller_name: 'Ma Societe SAS',
seller_address: { line1: '1 Rue de la Paix', postal_code: '75001', city: 'Paris' },
buyer_siret: '98765432109876',
buyer_name: 'Client SARL',
buyer_address: { line1: '10 Avenue des Champs', postal_code: '75008', city: 'Paris' },
lines: [{
description: 'Prestation de conseil',
quantity: 10,
unit_price: 100.00,
tax_rate: 20.00,
total_ht: 1000.00,
total_tax: 200.00,
total_ttc: 1200.00
}]
})
});// PHP
$response = $client->post('https://api.scell.io/api/v1/invoices', [
'headers' => ['X-API-Key' => 'sk_live_xxx'],
'json' => [
'invoice_number' => 'FACT-2026-001',
'direction' => 'outgoing',
'output_format' => 'facturx',
'issue_date' => '2026-01-15',
'total_ht' => 1000.00,
'total_tax' => 200.00,
'total_ttc' => 1200.00,
'seller_siret' => '12345678901234',
'seller_name' => 'Ma Societe SAS',
'seller_address' => ['line1' => '1 Rue de la Paix', 'postal_code' => '75001', 'city' => 'Paris'],
'buyer_siret' => '98765432109876',
'buyer_name' => 'Client SARL',
'buyer_address' => ['line1' => '10 Avenue des Champs', 'postal_code' => '75008', 'city' => 'Paris'],
'lines' => [[
'description' => 'Prestation de conseil',
'quantity' => 10,
'unit_price' => 100.00,
'tax_rate' => 20.00,
'total_ht' => 1000.00,
'total_tax' => 200.00,
'total_ttc' => 1200.00
]]
]
]);# Python
import requests
response = requests.post("https://api.scell.io/api/v1/invoices",
headers={"X-API-Key": "sk_live_xxx"},
json={
"invoice_number": "FACT-2026-001",
"direction": "outgoing",
"output_format": "facturx",
"issue_date": "2026-01-15",
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00,
"seller_siret": "12345678901234",
"seller_name": "Ma Societe SAS",
"seller_address": {"line1": "1 Rue de la Paix", "postal_code": "75001", "city": "Paris"},
"buyer_siret": "98765432109876",
"buyer_name": "Client SARL",
"buyer_address": {"line1": "10 Avenue des Champs", "postal_code": "75008", "city": "Paris"},
"lines": [{
"description": "Prestation de conseil",
"quantity": 10,
"unit_price": 100.00,
"tax_rate": 20.00,
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00
}]
}
)Reponse (201) :
{
"message": "Facture creee avec succes",
"data": {
"id": "uuid",
"invoice_number": "FACT-2026-001",
"direction": "outgoing",
"output_format": "facturx",
"status": "draft",
"issue_date": "2026-01-15",
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00,
"seller_siret": "12345678901234",
"seller_name": "Ma Societe SAS",
"buyer_siret": "98765432109876",
"buyer_name": "Client SARL",
"lines": [...],
"created_at": "2026-01-15T10:30:00Z"
}
}Erreurs : 422 (validation), 402 (solde insuffisant)
GET /v1/invoices
Liste les factures de l'utilisateur.
Authentification : Bearer Token
Parametres de requete :
| Parametre | Type | Description |
|---|---|---|
company_id | uuid | Filtrer par entreprise |
status | string | Filtrer par statut (draft, validated, submitted, paid) |
direction | string | outgoing ou incoming |
environment | string | sandbox ou production |
from | date | Date de debut |
to | date | Date de fin |
per_page | integer | Elements par page (defaut: 25) |
curl -X GET "https://api.scell.io/api/v1/invoices?direction=outgoing&status=validated" \
-H "Authorization: Bearer <TOKEN>"GET /v1/invoices/{id}
Recupere les details d'une facture avec ses lignes.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/invoices/{id} \
-H "Authorization: Bearer <TOKEN>"GET /v1/invoices/{id}/download/{type}
Genere un lien de telechargement temporaire (15 minutes).
Authentification : API Key
Parametres de chemin :
| Parametre | Valeurs | Description |
|---|---|---|
type | original | Fichier original uploade |
converted | Version convertie (Factur-X, UBL...) | |
pdf | Version PDF visible |
curl -X GET https://api.scell.io/api/v1/invoices/{id}/download/pdf \
-H "X-API-Key: sk_live_xxx"Reponse (200) :
{
"url": "https://storage.scell.io/...",
"expires_at": "2026-01-15T10:45:00Z"
}GET /v1/invoices/{id}/audit-trail
Recupere la piste d'audit fiable (PAF) d'une facture.
Authentification : API Key
curl -X GET https://api.scell.io/api/v1/invoices/{id}/audit-trail \
-H "X-API-Key: sk_live_xxx"Reponse (200) :
{
"data": [
{
"action": "invoice.created",
"details": "Creation",
"actor_ip": "192.168.1.1",
"created_at": "2026-01-15T10:30:00Z"
},
{
"action": "invoice.submitted",
"details": "Soumission au PDP",
"actor_ip": "192.168.1.1",
"created_at": "2026-01-15T10:31:00Z"
}
],
"integrity_valid": true
}POST /v1/invoices/{id}/submit
Soumet une facture brouillon au PDP (Plateforme de Dematerialisation Partenaire).
Authentification : API Key
curl -X POST https://api.scell.io/api/v1/invoices/{id}/submit \
-H "X-API-Key: sk_live_xxx"Reponse (200) :
{
"message": "Facture soumise avec succes",
"data": {
"id": "uuid",
"status": "submitted",
"submitted_at": "2026-01-15T10:31:00Z"
}
}POST /v1/invoices/convert
Convertit une facture vers un autre format (UBL vers Factur-X, etc.).
Authentification : API Key
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
invoice_id | uuid | oui | ID de la facture a convertir |
target_format | string | oui | facturx, ubl ou cii |
curl -X POST https://api.scell.io/api/v1/invoices/convert \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"invoice_id": "uuid", "target_format": "facturx"}'4. Signatures
POST /v1/signatures
Cree une demande de signature electronique (eIDAS EU-SES). En production, debite 1.20 EUR.
Authentification : API Key (X-API-Key)
Corps de la requete :
| Champ | Type | Requis | Description |
|---|---|---|---|
external_id | string | non | Identifiant externe |
title | string | oui | Titre du document |
description | string | non | Description |
document | string (base64) | oui | Document PDF encode en Base64 |
document_name | string | oui | Nom du fichier |
signers | array | oui | Liste des signataires (1-10) |
signers[].first_name | string | oui | Prenom |
signers[].last_name | string | oui | Nom |
signers[].email | string (email) | oui* | Email (*requis si pas de phone) |
signers[].phone | string | oui* | Telephone (*requis si pas d'email) |
signers[].auth_method | string | oui | email, sms ou both |
signers[].message | string | non | Message custom envoye au signataire (max 500 chars, placeholder {OTP} remplace par le code OTP) |
signature_positions | array | non | Positions de signature |
signature_positions[].page | integer (>=1) | oui | Numero de page |
signature_positions[].x | number (0-5000) | oui | Position X |
signature_positions[].y | number (0-5000) | oui | Position Y |
signature_positions[].unit | string | non | percent (defaut) ou pixel |
signature_positions[].width | number | non | Largeur |
signature_positions[].height | number | non | Hauteur |
signature_positions[].page_width_px | number | non | Largeur page en px (@72dpi). Si absent : detection auto via parser PDF cote serveur, fallback A4 (595). |
signature_positions[].page_height_px | number | non | Hauteur page en px (@72dpi). Si absent : detection auto via parser PDF cote serveur, fallback A4 (842). |
ui_config | object | non | Personnalisation UI (21 champs conformes spec OpenAPI.com EU-SES v1.0.17) |
ui_config.sidebar_logo | string (url) | non | URL du logo affiche dans la sidebar |
ui_config.sidebar_background_color | string (hex #RRGGBB) | non | Couleur de fond sidebar |
ui_config.sidebar_title_color | string (hex) | non | Couleur des titres sidebar |
ui_config.sidebar_text_color | string (hex) | non | Couleur du texte sidebar |
ui_config.header_background_color | string (hex) | non | Couleur de fond header |
ui_config.header_title_color | string (hex) | non | Couleur du titre header |
ui_config.header_subtitle_color | string (hex) | non | Couleur du sous-titre header |
ui_config.footer_background_color | string (hex) | non | Couleur de fond footer |
ui_config.button_text_color | string (hex) | non | Couleur texte des boutons |
ui_config.button_text_color_hover | string (hex) | non | Couleur texte des boutons au survol |
ui_config.button_background_color | string (hex) | non | Couleur de fond des boutons |
ui_config.button_background_color_hover | string (hex) | non | Couleur de fond des boutons au survol |
ui_config.sign_button_text_color | string (hex) | non | Couleur texte du bouton de signature |
ui_config.sign_button_text_color_hover | string (hex) | non | Couleur texte du bouton de signature au survol |
ui_config.sign_button_background_color | string (hex) | non | Couleur de fond du bouton de signature |
ui_config.sign_button_background_color_hover | string (hex) | non | Couleur de fond du bouton de signature au survol |
ui_config.hide_sidebar | boolean | non | Masquer la sidebar |
ui_config.hide_header | boolean | non | Masquer le header |
ui_config.hide_download_validated | boolean | non | Masquer le bouton de telechargement apres validation |
ui_config.hide_download_signed | boolean | non | Masquer le bouton de telechargement du document signe |
ui_config.iframe_ancestors | array (max 20) | non | URLs autorisees a integrer la page de signature en iframe |
signature_options | object | non | Options de comportement de la signature |
signature_options.signature_mode | string | non | typed, drawn ou both |
signature_options.signer_must_read | boolean | non | Impose au signataire de faire defiler le document avant de signer |
signature_options.user_editable_data | object | non | Champs modifiables par le signataire : name, mobile, email (boolean chacun) |
signature_options.timezone | string | non | Fuseau horaire IANA (ex: Europe/Paris) |
redirect_complete_url | string (url) | non | URL de redirection apres signature |
redirect_cancel_url | string (url) | non | URL de redirection en cas d'annulation |
expires_at | datetime | non | Expiration (defaut: +30 jours) |
archive_enabled | boolean | non | Archivage longue duree |
curl -X POST https://api.scell.io/api/v1/signatures \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"title": "Contrat de prestation",
"document_name": "contrat.pdf",
"document": "<BASE64_CONTENT>",
"signers": [
{
"first_name": "Jean",
"last_name": "Dupont",
"email": "jean.dupont@example.com",
"auth_method": "email"
}
],
"redirect_complete_url": "https://mon-site.com/signature-ok",
"redirect_cancel_url": "https://mon-site.com/signature-annulee"
}'// JavaScript
const fs = require('fs');
const document = fs.readFileSync('contrat.pdf').toString('base64');
const response = await fetch('https://api.scell.io/api/v1/signatures', {
method: 'POST',
headers: {
'X-API-Key': 'sk_live_xxx',
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'Contrat de prestation',
document_name: 'contrat.pdf',
document: document,
signers: [{
first_name: 'Jean',
last_name: 'Dupont',
email: 'jean.dupont@example.com',
auth_method: 'email'
}]
})
});// PHP
$document = base64_encode(file_get_contents('contrat.pdf'));
$response = $client->post('https://api.scell.io/api/v1/signatures', [
'headers' => ['X-API-Key' => 'sk_live_xxx'],
'json' => [
'title' => 'Contrat de prestation',
'document_name' => 'contrat.pdf',
'document' => $document,
'signers' => [[
'first_name' => 'Jean',
'last_name' => 'Dupont',
'email' => 'jean.dupont@example.com',
'auth_method' => 'email'
]]
]
]);# Python
import base64, requests
with open("contrat.pdf", "rb") as f:
document = base64.b64encode(f.read()).decode()
response = requests.post("https://api.scell.io/api/v1/signatures",
headers={"X-API-Key": "sk_live_xxx"},
json={
"title": "Contrat de prestation",
"document_name": "contrat.pdf",
"document": document,
"signers": [{
"first_name": "Jean",
"last_name": "Dupont",
"email": "jean.dupont@example.com",
"auth_method": "email"
}]
}
)Reponse (201) :
{
"message": "Demande de signature creee",
"data": {
"id": "uuid",
"title": "Contrat de prestation",
"status": "pending",
"signers": [
{
"first_name": "Jean",
"last_name": "Dupont",
"email": "jean.dupont@example.com",
"status": "pending",
"signing_url": "https://sign.scell.io/..."
}
],
"expires_at": "2026-02-15T10:30:00Z",
"created_at": "2026-01-15T10:30:00Z"
}
}GET /v1/signatures
Liste les demandes de signature.
Authentification : Bearer Token
Parametres :
| Parametre | Type | Description |
|---|---|---|
status | string | pending, completed, refused, expired |
environment | string | sandbox ou production |
per_page | integer | Elements par page |
curl -X GET "https://api.scell.io/api/v1/signatures?status=pending" \
-H "Authorization: Bearer <TOKEN>"GET /v1/signatures/{id}
Recupere les details d'une signature avec ses signataires.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/signatures/{id} \
-H "Authorization: Bearer <TOKEN>"GET /v1/signatures/{id}/download/{type}
Telecharge les fichiers de signature.
Authentification : API Key
Types disponibles : original (document original), signed (document signe), audit_trail (dossier de preuve)
curl -X GET https://api.scell.io/api/v1/signatures/{id}/download/signed \
-H "X-API-Key: sk_live_xxx"Reponse (200) :
{
"url": "https://storage.scell.io/...",
"expires_at": "2026-01-15T10:45:00Z"
}POST /v1/signatures/{id}/remind
Envoie un rappel aux signataires en attente.
Authentification : API Key
curl -X POST https://api.scell.io/api/v1/signatures/{id}/remind \
-H "X-API-Key: sk_live_xxx"Reponse (200) :
{
"message": "Rappels envoyes",
"signers_reminded": 2
}Erreurs : 400 (CANNOT_REMIND, NO_PENDING_SIGNERS)
POST /v1/signatures/{id}/cancel
Annule une demande de signature en cours.
Authentification : API Key
curl -X POST https://api.scell.io/api/v1/signatures/{id}/cancel \
-H "X-API-Key: sk_live_xxx"Reponse (200) :
{
"message": "Signature annulee"
}Erreurs : 400 (ALREADY_COMPLETED - impossible d'annuler une signature terminee)
5. Credit Notes (Avoirs)
GET /v1/credit-notes
Liste les avoirs.
Authentification : Bearer Token
Parametres :
| Parametre | Type | Description |
|---|---|---|
status | string | draft ou sent |
invoice_id | uuid | Facture d'origine |
type | string | partial ou total |
per_page | integer | Elements par page (defaut: 15) |
curl -X GET "https://api.scell.io/api/v1/credit-notes?status=sent" \
-H "Authorization: Bearer <TOKEN>"POST /v1/credit-notes
Cree un avoir (credit note). Debite 0.04 EUR en production.
Authentification : Bearer Token
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
invoice_id | uuid | oui | ID de la facture d'origine |
reason | string | oui | Motif de l'avoir |
items | array | oui | Lignes de l'avoir |
items[].description | string | oui | Description |
items[].quantity | number | oui | Quantite |
items[].unit_price | number | oui | Prix unitaire |
items[].tax_rate | number | oui | Taux TVA (%) |
curl -X POST https://api.scell.io/api/v1/credit-notes \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"invoice_id": "uuid-facture",
"reason": "Retour de marchandise",
"items": [
{
"description": "Article retourne",
"quantity": 1,
"unit_price": 50.00,
"tax_rate": 20.00
}
]
}'GET /v1/credit-notes/{id}
Recupere les details d'un avoir.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/credit-notes/{id} \
-H "Authorization: Bearer <TOKEN>"DELETE /v1/credit-notes/{id}
Supprime un avoir en brouillon. Les avoirs envoyes ne peuvent pas etre supprimes (NF525).
Authentification : Bearer Token
curl -X DELETE https://api.scell.io/api/v1/credit-notes/{id} \
-H "Authorization: Bearer <TOKEN>"Erreurs : 403 (l'avoir n'est pas en brouillon, suppression interdite)
POST /v1/credit-notes/{id}/send
Envoie un avoir (le fait passer de draft a sent). Irreversible.
Authentification : Bearer Token
curl -X POST https://api.scell.io/api/v1/credit-notes/{id}/send \
-H "Authorization: Bearer <TOKEN>"GET /v1/credit-notes/{id}/download
Telecharge le PDF de l'avoir.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/credit-notes/{id}/download \
-H "Authorization: Bearer <TOKEN>"GET /v1/invoices/{invoice}/remaining-creditable
Retourne les montants restants creditables pour une facture (pour eviter un avoir superieur au montant facture).
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/invoices/{invoice}/remaining-creditable \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": {
"invoice_id": "uuid",
"invoice_total_ht": 1000.00,
"already_credited_ht": 200.00,
"remaining_creditable_ht": 800.00,
"lines": [
{
"description": "Prestation",
"original_quantity": 10,
"credited_quantity": 2,
"remaining_quantity": 8
}
]
}
}6. API Keys
GET /v1/api-keys
Liste les cles API.
Authentification : Bearer Token
Parametres :
| Parametre | Type | Description |
|---|---|---|
company_id | uuid | Filtrer par entreprise |
environment | string | sandbox ou production |
curl -X GET "https://api.scell.io/api/v1/api-keys?environment=production" \
-H "Authorization: Bearer <TOKEN>"POST /v1/api-keys
Genere une nouvelle cle API. La cle complete n'est retournee qu'une seule fois.
Authentification : Bearer Token
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
name | string | oui | Nom descriptif |
company_id | uuid | oui | ID de l'entreprise |
environment | string | oui | sandbox ou production |
scopes | array | non | Permissions (invoices, signatures) |
expires_at | datetime | non | Date d'expiration |
curl -X POST https://api.scell.io/api/v1/api-keys \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Cle Production Server 1",
"company_id": "uuid",
"environment": "production",
"scopes": ["invoices", "signatures"]
}'Reponse (201) :
{
"message": "Cle API creee",
"data": {
"id": "uuid",
"name": "Cle Production Server 1",
"key": "sk_live_x8z...",
"prefix": "sk_live_x8z",
"environment": "production",
"scopes": ["invoices", "signatures"],
"created_at": "2026-01-15T10:30:00Z"
},
"warning": "Conservez cette cle en securite. Elle ne sera plus affichee."
}GET /v1/api-keys/{id}
Recupere les details d'une cle API (sans la cle complete).
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/api-keys/{id} \
-H "Authorization: Bearer <TOKEN>"DELETE /v1/api-keys/{id}
Revoque une cle API. Irreversible.
Authentification : Bearer Token
curl -X DELETE https://api.scell.io/api/v1/api-keys/{id} \
-H "Authorization: Bearer <TOKEN>"7. Balance
GET /v1/balance
Recupere le solde actuel et les parametres de rechargement.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/balance \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": {
"amount": 150.00,
"currency": "EUR",
"auto_reload_enabled": false,
"auto_reload_threshold": null,
"auto_reload_amount": null,
"low_balance_alert_threshold": 10.00,
"critical_balance_alert_threshold": 2.00
}
}POST /v1/balance/reload
Recharge le solde manuellement.
Authentification : Bearer Token
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
amount | number | oui | Montant (10-10000 EUR) |
curl -X POST https://api.scell.io/api/v1/balance/reload \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"amount": 100.00}'Reponse (200) :
{
"message": "Solde recharge avec succes",
"transaction": {
"id": "uuid",
"amount": 100.00,
"balance_after": 250.00
}
}PUT /v1/balance/settings
Met a jour les parametres de rechargement automatique.
Authentification : Bearer Token
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
auto_reload_enabled | boolean | non | Activer le rechargement auto |
auto_reload_threshold | number | non | Seuil de declenchement |
auto_reload_amount | number | non | Montant de rechargement |
low_balance_alert_threshold | number | non | Seuil d'alerte solde bas |
critical_balance_alert_threshold | number | non | Seuil d'alerte critique |
curl -X PUT https://api.scell.io/api/v1/balance/settings \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"auto_reload_enabled": true,
"auto_reload_threshold": 10.00,
"auto_reload_amount": 100.00
}'GET /v1/balance/transactions
Liste l'historique des transactions (debits et credits).
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/balance/transactions \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": [
{
"id": "uuid",
"type": "debit",
"amount": -0.04,
"balance_after": 149.96,
"description": "Facture FACT-2026-001",
"entity_type": "invoice",
"entity_id": "uuid",
"created_at": "2026-01-15T10:30:00Z"
}
],
"meta": { "current_page": 1, "last_page": 5, "per_page": 25, "total": 120 }
}8. Webhooks
GET /v1/webhooks
Liste les webhooks configures.
Authentification : Bearer Token
Parametres : company_id (uuid, optionnel)
curl -X GET https://api.scell.io/api/v1/webhooks \
-H "Authorization: Bearer <TOKEN>"POST /v1/webhooks
Configure un nouveau webhook.
Authentification : Bearer Token
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
url | string (url) | oui | URL de reception |
events | array | oui | Evenements a ecouter |
environment | string | oui | sandbox ou production |
headers | object | non | Headers personnalises |
retry_count | integer | non | Nombre de tentatives (0-5, defaut: 3) |
timeout_seconds | integer | non | Timeout (5-60, defaut: 30) |
Evenements disponibles :
| Evenement | Description |
|---|---|
invoice.created | Facture creee |
invoice.validated | Facture validee |
invoice.submitted | Facture soumise au PDP |
invoice.paid | Facture payee |
invoice.rejected | Facture rejetee |
signature.created | Signature creee |
signature.completed | Signature terminee |
signature.refused | Signature refusee |
signature.expired | Signature expiree |
credit_note.created | Avoir cree |
credit_note.sent | Avoir envoye |
curl -X POST https://api.scell.io/api/v1/webhooks \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://mon-site.com/webhooks/scell",
"events": ["invoice.validated", "signature.completed"],
"environment": "production"
}'Reponse (201) :
{
"message": "Webhook cree avec succes",
"data": {
"id": "uuid",
"url": "https://mon-site.com/webhooks/scell",
"secret": "whsec_abc123...",
"events": ["invoice.validated", "signature.completed"],
"environment": "production",
"is_active": true
}
}GET /v1/webhooks/{id}
Recupere les details d'un webhook.
curl -X GET https://api.scell.io/api/v1/webhooks/{id} \
-H "Authorization: Bearer <TOKEN>"PUT /v1/webhooks/{id}
Met a jour un webhook.
curl -X PUT https://api.scell.io/api/v1/webhooks/{id} \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"events": ["invoice.validated", "invoice.paid"], "is_active": true}'DELETE /v1/webhooks/{id}
Supprime un webhook.
curl -X DELETE https://api.scell.io/api/v1/webhooks/{id} \
-H "Authorization: Bearer <TOKEN>"POST /v1/webhooks/{id}/regenerate-secret
Regenere le secret de signature du webhook.
curl -X POST https://api.scell.io/api/v1/webhooks/{id}/regenerate-secret \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"message": "Secret regenere",
"secret": "whsec_new_xyz..."
}POST /v1/webhooks/{id}/test
Envoie un evenement de test au webhook.
curl -X POST https://api.scell.io/api/v1/webhooks/{id}/test \
-H "Authorization: Bearer <TOKEN>"GET /v1/webhooks/{id}/logs
Recupere les logs d'execution du webhook.
curl -X GET https://api.scell.io/api/v1/webhooks/{id}/logs \
-H "Authorization: Bearer <TOKEN>"Reponse (200) :
{
"data": [
{
"id": "uuid",
"event": "invoice.validated",
"status_code": 200,
"response_time_ms": 150,
"attempt": 1,
"created_at": "2026-01-15T10:30:00Z"
}
]
}9. Incoming Invoices (Factures fournisseurs)
GET /v1/invoices/incoming
Liste les factures fournisseurs recues.
Authentification : Bearer Token
curl -X GET https://api.scell.io/api/v1/invoices/incoming \
-H "Authorization: Bearer <TOKEN>"POST /v1/invoices/{invoice}/accept
Accepte une facture fournisseur.
curl -X POST https://api.scell.io/api/v1/invoices/{invoice}/accept \
-H "Authorization: Bearer <TOKEN>"POST /v1/invoices/{invoice}/reject
Rejette une facture fournisseur.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
reason | string | oui | Motif du rejet |
curl -X POST https://api.scell.io/api/v1/invoices/{invoice}/reject \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"reason": "Montant incorrect"}'POST /v1/invoices/{invoice}/dispute
Conteste une facture fournisseur.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
reason | string | oui | Motif de la contestation |
curl -X POST https://api.scell.io/api/v1/invoices/{invoice}/dispute \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"reason": "Prestation non conforme"}'POST /v1/invoices/{invoice}/mark-paid
Marque une facture fournisseur comme payee.
curl -X POST https://api.scell.io/api/v1/invoices/{invoice}/mark-paid \
-H "Authorization: Bearer <TOKEN>"GET /v1/invoices/{invoice}/download
Telecharge une facture fournisseur.
curl -X GET https://api.scell.io/api/v1/invoices/{invoice}/download \
-H "Authorization: Bearer <TOKEN>"10. Tenant (Multi-Tenant B2B)
API destinee aux partenaires integrant Scell.io pour leurs propres clients. Authentification via X-Tenant-Key.
GET /v1/tenant/me
Retourne le profil du tenant authentifie.
Authentification : Tenant Key
curl -X GET https://api.scell.io/api/v1/tenant/me \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"id": "uuid",
"name": "Mon Entreprise",
"slug": "mon-entreprise",
"legal_name": "Mon Entreprise SAS",
"siret": "12345678901234",
"vat_number": "FR12345678901",
"billing_email": "billing@monentreprise.fr",
"technical_email": "tech@monentreprise.fr",
"kyb_status": "verified",
"kyb_verified_at": "2026-01-10T08:00:00Z",
"balance": 500.00,
"environment": "production",
"created_at": "2026-01-05T10:00:00Z"
}
}PUT /v1/tenant/me
Met a jour le profil du tenant.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
billing_email | string (email) | non | Email de facturation |
technical_email | string (email) | non | Email technique |
contact_phone | string | non | Telephone |
webhook_url | string (url) | non | URL webhook globale |
settings | object | non | Parametres personnalises |
curl -X PUT https://api.scell.io/api/v1/tenant/me \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"billing_email": "new-billing@monentreprise.fr"}'GET /v1/tenant/balance
Retourne le solde du tenant.
curl -X GET https://api.scell.io/api/v1/tenant/balance \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/stats
Retourne les statistiques du tenant.
curl -X GET https://api.scell.io/api/v1/tenant/stats \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/stats/overview
Statistiques detaillees (tableau de bord).
curl -X GET https://api.scell.io/api/v1/tenant/stats/overview \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/stats/monthly
Statistiques mensuelles detaillees.
curl -X GET https://api.scell.io/api/v1/tenant/stats/monthly \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/regenerate-key
Regenere la cle API du tenant. L'ancienne cle est immediatement invalidee.
curl -X POST https://api.scell.io/api/v1/tenant/regenerate-key \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"message": "Cle regeneree",
"api_key": "sk_live_newkey...",
"warning": "L'ancienne cle est desormais invalide"
}11. Sub-Tenants
Gestion des sous-clients (sub-tenants) dans l'architecture multi-tenant.
GET /v1/tenant/sub-tenants
Liste les sub-tenants.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/sub-tenants
Cree un sub-tenant.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
external_id | string | oui | Identifiant dans votre systeme |
name | string | oui | Nom du sub-tenant |
email | string (email) | oui | Email de contact |
siret | string (14 car.) | non | SIRET |
vat_number | string | non | Numero TVA |
contact_person | string | non | Personne de contact |
phone | string | non | Telephone |
address | object | non | Adresse |
metadata | object | non | Donnees personnalisees |
curl -X POST https://api.scell.io/api/v1/tenant/sub-tenants \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"external_id": "client_123",
"name": "Client ABC",
"email": "contact@client-abc.fr",
"siret": "98765432109876"
}'GET /v1/tenant/sub-tenants/{id}
Recupere un sub-tenant par ID.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants/{id} \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/sub-tenants/by-external-id/{externalId}
Recherche un sub-tenant par identifiant externe.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants/by-external-id/client_123 \
-H "X-Tenant-Key: sk_live_xxxxxx"PUT /v1/tenant/sub-tenants/{id}
Met a jour un sub-tenant.
curl -X PUT https://api.scell.io/api/v1/tenant/sub-tenants/{id} \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"name": "Client ABC - Mis a jour", "phone": "+33612345678"}'DELETE /v1/tenant/sub-tenants/{id}
Supprime un sub-tenant.
curl -X DELETE https://api.scell.io/api/v1/tenant/sub-tenants/{id} \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/sub-tenants/{subTenantId}/stats/overview
Statistiques d'un sub-tenant specifique.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/stats/overview \
-H "X-Tenant-Key: sk_live_xxxxxx"12. Tenant Invoices
POST /v1/tenant/invoices
Cree une facture directe (sans sub-tenant). Debite 0.04 EUR.
Authentification : Tenant Key
Corps : Meme structure que POST /v1/invoices (voir section 3).
curl -X POST https://api.scell.io/api/v1/tenant/invoices \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"invoice_number": "FACT-2026-001",
"direction": "outgoing",
"output_format": "facturx",
"issue_date": "2026-01-15",
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00,
"seller_siret": "12345678901234",
"seller_name": "Ma Societe SAS",
"seller_address": {"line1": "1 Rue de la Paix", "postal_code": "75001", "city": "Paris"},
"buyer_siret": "98765432109876",
"buyer_name": "Client SARL",
"buyer_address": {"line1": "10 Avenue des Champs", "postal_code": "75008", "city": "Paris"},
"lines": [{"description": "Prestation", "quantity": 1, "unit_price": 1000.00, "tax_rate": 20.00, "total_ht": 1000.00, "total_tax": 200.00, "total_ttc": 1200.00}]
}'GET /v1/tenant/invoices
Liste toutes les factures du tenant.
curl -X GET "https://api.scell.io/api/v1/tenant/invoices?status=draft" \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/sub-tenants/{subTenantId}/invoices
Cree une facture pour un sub-tenant.
curl -X POST https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/invoices \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{ ... }'GET /v1/tenant/sub-tenants/{subTenantId}/invoices
Liste les factures d'un sub-tenant.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/invoices \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/invoices/{invoiceId}
Recupere les details d'une facture.
curl -X GET https://api.scell.io/api/v1/tenant/invoices/{invoiceId} \
-H "X-Tenant-Key: sk_live_xxxxxx"PUT /v1/tenant/invoices/{invoiceId}
Met a jour une facture en brouillon.
curl -X PUT https://api.scell.io/api/v1/tenant/invoices/{invoiceId} \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"due_date": "2026-03-15"}'Erreurs : 403 (facture non modifiable si pas en statut draft)
DELETE /v1/tenant/invoices/{invoiceId}
Supprime une facture en brouillon.
curl -X DELETE https://api.scell.io/api/v1/tenant/invoices/{invoiceId} \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/invoices/{invoiceId}/submit
Soumet une facture au PDP.
curl -X POST https://api.scell.io/api/v1/tenant/invoices/{invoiceId}/submit \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/invoices/{invoiceId}/status
Recupere le statut d'une facture.
curl -X GET https://api.scell.io/api/v1/tenant/invoices/{invoiceId}/status \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"id": "uuid",
"status": "submitted",
"submitted_at": "2026-01-15T10:31:00Z",
"paid_at": null
}
}POST /v1/tenant/invoices/bulk
Creation en masse de factures (jusqu'a 100 par requete).
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
invoices | array | oui | Tableau de factures (meme structure que creation unitaire) |
curl -X POST https://api.scell.io/api/v1/tenant/invoices/bulk \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"invoices": [{ ... }, { ... }]}'Reponse (201) :
{
"message": "2 factures creees",
"data": {
"created": 2,
"failed": 0,
"invoices": [...]
}
}POST /v1/tenant/invoices/bulk-submit
Soumission en masse de factures.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
invoice_ids | array | oui | Liste des IDs de factures a soumettre |
curl -X POST https://api.scell.io/api/v1/tenant/invoices/bulk-submit \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"invoice_ids": ["uuid-1", "uuid-2", "uuid-3"]}'POST /v1/tenant/invoices/bulk-status
Recupere le statut de plusieurs factures en une requete.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
invoice_ids | array | oui | Liste des IDs |
curl -X POST https://api.scell.io/api/v1/tenant/invoices/bulk-status \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"invoice_ids": ["uuid-1", "uuid-2"]}'GET /v1/tenant/invoices/{invoiceId}/remaining-creditable
Montants restants creditables pour une facture tenant.
curl -X GET https://api.scell.io/api/v1/tenant/invoices/{invoiceId}/remaining-creditable \
-H "X-Tenant-Key: sk_live_xxxxxx"13. Tenant Credit Notes
POST /v1/tenant/credit-notes
Cree un avoir direct (sans sub-tenant). Debite 0.04 EUR.
curl -X POST https://api.scell.io/api/v1/tenant/credit-notes \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"invoice_id": "uuid-facture",
"reason": "Remise commerciale",
"items": [{"description": "Remise", "quantity": 1, "unit_price": 100.00, "tax_rate": 20.00}]
}'GET /v1/tenant/credit-notes
Liste les avoirs du tenant.
curl -X GET https://api.scell.io/api/v1/tenant/credit-notes \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/sub-tenants/{subTenantId}/credit-notes
Cree un avoir pour un sub-tenant.
curl -X POST https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/credit-notes \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{ ... }'GET /v1/tenant/sub-tenants/{subTenantId}/credit-notes
Liste les avoirs d'un sub-tenant.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/credit-notes \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/credit-notes/{creditNoteId}
Recupere les details d'un avoir.
curl -X GET https://api.scell.io/api/v1/tenant/credit-notes/{creditNoteId} \
-H "X-Tenant-Key: sk_live_xxxxxx"PUT /v1/tenant/credit-notes/{creditNoteId}
Met a jour un avoir en brouillon.
curl -X PUT https://api.scell.io/api/v1/tenant/credit-notes/{creditNoteId} \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"reason": "Motif mis a jour"}'POST /v1/tenant/credit-notes/{creditNoteId}/send
Envoie un avoir (passage de draft a sent).
curl -X POST https://api.scell.io/api/v1/tenant/credit-notes/{creditNoteId}/send \
-H "X-Tenant-Key: sk_live_xxxxxx"DELETE /v1/tenant/credit-notes/{creditNoteId}
Supprime un avoir en brouillon.
curl -X DELETE https://api.scell.io/api/v1/tenant/credit-notes/{creditNoteId} \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/credit-notes/{creditNoteId}/download
Telecharge le PDF de l'avoir.
curl -X GET https://api.scell.io/api/v1/tenant/credit-notes/{creditNoteId}/download \
-H "X-Tenant-Key: sk_live_xxxxxx"14. Tenant Billing
GET /v1/tenant/billing/invoices
Liste les factures de facturation du tenant (factures mensuelles de consommation Scell.io).
curl -X GET https://api.scell.io/api/v1/tenant/billing/invoices \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": [
{
"id": "uuid",
"invoice_number": "SCELL-2026-01",
"period_start": "2026-01-01",
"period_end": "2026-01-31",
"invoices_count": 150,
"invoices_amount": 6.00,
"signatures_count": 5,
"signatures_amount": 6.00,
"total_ht": 12.00,
"total_ttc": 14.40,
"status": "paid"
}
]
}GET /v1/tenant/billing/invoices/{invoice}
Details d'une facture de facturation.
curl -X GET https://api.scell.io/api/v1/tenant/billing/invoices/{invoice} \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/billing/invoices/{invoice}/download
Telecharge le PDF de la facture de facturation.
curl -X GET https://api.scell.io/api/v1/tenant/billing/invoices/{invoice}/download \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/billing/usage
Recupere la consommation en cours.
curl -X GET https://api.scell.io/api/v1/tenant/billing/usage \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/billing/top-up
Initie une recharge du solde.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
amount | number | oui | Montant a recharger |
curl -X POST https://api.scell.io/api/v1/tenant/billing/top-up \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"amount": 100.00}'POST /v1/tenant/billing/top-up/confirm
Confirme une recharge apres paiement.
curl -X POST https://api.scell.io/api/v1/tenant/billing/top-up/confirm \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"payment_intent_id": "pi_xxx"}'GET /v1/tenant/billing/transactions
Historique des transactions du tenant.
curl -X GET https://api.scell.io/api/v1/tenant/billing/transactions \
-H "X-Tenant-Key: sk_live_xxxxxx"15. Tenant Incoming Invoices
POST /v1/tenant/sub-tenants/{subTenantId}/invoices/incoming
Enregistre une facture fournisseur pour un sub-tenant. Gratuit (pas de debit).
curl -X POST https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/invoices/incoming \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"invoice_number": "FOURNISSEUR-001",
"issue_date": "2026-01-15",
"total_ht": 500.00,
"total_tax": 100.00,
"total_ttc": 600.00,
"seller_siret": "11111111111111",
"seller_name": "Fournisseur SA",
"buyer_siret": "22222222222222",
"buyer_name": "Mon Client"
}'GET /v1/tenant/sub-tenants/{subTenantId}/invoices/incoming
Liste les factures fournisseurs d'un sub-tenant.
curl -X GET https://api.scell.io/api/v1/tenant/sub-tenants/{subTenantId}/invoices/incoming \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/invoices/incoming/{invoiceId}
Details d'une facture fournisseur.
curl -X GET https://api.scell.io/api/v1/tenant/invoices/incoming/{invoiceId} \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/invoices/incoming/{invoiceId}/accept
Accepte une facture fournisseur.
curl -X POST https://api.scell.io/api/v1/tenant/invoices/incoming/{invoiceId}/accept \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/invoices/incoming/{invoiceId}/reject
Rejette une facture fournisseur.
curl -X POST https://api.scell.io/api/v1/tenant/invoices/incoming/{invoiceId}/reject \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"reason": "Montant incorrect"}'POST /v1/tenant/invoices/incoming/{invoiceId}/mark-paid
Marque une facture fournisseur comme payee.
curl -X POST https://api.scell.io/api/v1/tenant/invoices/incoming/{invoiceId}/mark-paid \
-H "X-Tenant-Key: sk_live_xxxxxx"16. KYB Documents
Gestion des documents KYB (Know Your Business) pour la verification d'identite des tenants.
GET /v1/tenant/kyb/status
Statut KYB du tenant.
curl -X GET https://api.scell.io/api/v1/tenant/kyb/status \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"status": "verified",
"verified_at": "2026-01-10T08:00:00Z",
"documents_count": 3,
"rejection_reason": null
}
}GET /v1/tenant/kyb/documents
Liste les documents KYB.
curl -X GET https://api.scell.io/api/v1/tenant/kyb/documents \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/kyb/documents
Upload un document KYB.
Corps (multipart/form-data) :
| Champ | Type | Requis | Description |
|---|---|---|---|
document | file | oui | Fichier (PDF, JPG, PNG, max 10 Mo) |
type | string | oui | kbis, id_card, articles, proof_of_address |
curl -X POST https://api.scell.io/api/v1/tenant/kyb/documents \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-F "document=@kbis.pdf" \
-F "type=kbis"GET /v1/tenant/kyb/documents/{document}
Details d'un document KYB.
curl -X GET https://api.scell.io/api/v1/tenant/kyb/documents/{document} \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/kyb/documents/{document}/download
Telecharge un document KYB.
curl -X GET https://api.scell.io/api/v1/tenant/kyb/documents/{document}/download \
-H "X-Tenant-Key: sk_live_xxxxxx"DELETE /v1/tenant/kyb/documents/{document}
Supprime un document KYB (avant verification uniquement).
curl -X DELETE https://api.scell.io/api/v1/tenant/kyb/documents/{document} \
-H "X-Tenant-Key: sk_live_xxxxxx"17. Onboarding
API d'onboarding B2B pour les partenaires. Inscrit des tenants via le tunnel SuperPDP (creation de compte, KYB, verification d'identite).
Authentification : Publishable Key (X-Publishable-Key)
Vue d'ensemble du flux :
- Le widget cree une session avec
POST /onboarding/sessions. - Le widget appelle
POST /onboarding/superpdp/authorizepour obtenir l'URL OAuth2 SuperPDP. - Le widget ouvre cette URL dans un popup. SuperPDP gere la creation de compte, le KYB et la verification d'identite.
- Une fois le tunnel SuperPDP termine, SuperPDP redirige vers
GET /api/v1/onboarding/superpdp/callback(endpoint backend). Cette page HTML poste un messagepostMessagea la fenetre parente et ferme le popup. - Le widget recoit le message et appelle
POST /onboarding/superpdp/callbackpour finaliser la creation du tenant Scell et obtenir l'authorization_code. - L'
authorization_codeest echange contre des credentials tenant viaPOST /onboarding/exchange.
POST /v1/onboarding/sessions
Cree une session d'onboarding.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
mode | string | oui | api, redirect ou embedded |
external_id | string | non | Identifiant dans votre systeme |
callback_url | string (url) | non | URL de callback apres completion |
state | string | non | Etat personnalise (retourne au callback) |
metadata | object | non | Donnees personnalisees |
curl -X POST https://api.scell.io/api/v1/onboarding/sessions \
-H "X-Publishable-Key: pk_test_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"mode": "embedded",
"callback_url": "https://myapp.com/callback",
"external_id": "user_123"
}'Reponse (201) :
{
"message": "Session creee",
"data": {
"id": "uuid",
"mode": "embedded",
"status": "pending",
"expires_at": "2026-01-15T11:30:00Z"
}
}GET /v1/onboarding/sessions/{id}
Recupere le statut d'une session.
Authentification : Publishable Key (X-Publishable-Key)
curl -X GET https://api.scell.io/api/v1/onboarding/sessions/{id} \
-H "X-Publishable-Key: pk_test_xxxxxx"Reponse (200) :
{
"data": {
"id": "uuid",
"status": "pending",
"mode": "embedded",
"expires_at": "2026-01-15T11:30:00Z"
}
}POST /v1/onboarding/superpdp/authorize
Genere l'URL d'autorisation OAuth2 SuperPDP vers laquelle le widget redirige l'utilisateur (dans un popup). SuperPDP prend ensuite en charge la creation de compte, le KYB et la verification d'identite.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
session_id | uuid | oui | ID de la session d'onboarding |
curl -X POST https://api.scell.io/api/v1/onboarding/superpdp/authorize \
-H "X-Publishable-Key: pk_test_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"session_id": "uuid"}'Reponse (200) :
{
"data": {
"authorize_url": "https://api.superpdp.tech/oauth2/authorize?client_id=...&redirect_uri=...&state=...&response_type=code",
"state": "random_state_string"
}
}Le widget ouvre authorize_url dans un popup. L'utilisateur accomplit l'ensemble du processus SuperPDP (inscription, KYB, identite). Aucune action supplementaire n'est requise cote widget jusqu'a la reception du postMessage de la fenetre popup.
POST /v1/onboarding/superpdp/callback
Finalise l'onboarding apres que SuperPDP a redirige vers le backend. Echange le code d'autorisation OAuth2 contre les tokens SuperPDP, cree le tenant Scell et retourne un authorization_code a echanger contre les credentials definitifs.
Cet endpoint est appele par le widget apres avoir recu le postMessage provenant de la page de callback HTML.
Authentification : Publishable Key (X-Publishable-Key)
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
session_id | uuid | oui | ID de la session d'onboarding |
code | string | oui | Code OAuth2 recu de SuperPDP via le postMessage |
state | string | oui | Valeur state retournee par SuperPDP (verification CSRF) |
curl -X POST https://api.scell.io/api/v1/onboarding/superpdp/callback \
-H "X-Publishable-Key: pk_test_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"session_id": "uuid",
"code": "superpdp_oauth_code_xyz",
"state": "random_state_string"
}'Reponse (200) :
{
"success": true,
"data": {
"authorization_code": "auth_code_xyz...",
"tenant": {
"id": "uuid",
"name": "Nom du Tenant",
"environment": "production"
}
}
}L'authorization_code est a usage unique. Utilisez-le immediatement avec POST /onboarding/exchange pour obtenir les credentials tenant (sk_live_*).
POST /v1/onboarding/exchange
Echange un code d'autorisation contre des credentials tenant. Rate limit strict (5/min).
Authentification : Aucune (publishable_key dans le corps)
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
publishable_key | string | oui | Cle publishable |
authorization_code | string | oui | Code d'autorisation recu depuis /superpdp/callback |
curl -X POST https://api.scell.io/api/v1/onboarding/exchange \
-H "Content-Type: application/json" \
-d '{
"publishable_key": "pk_test_xxxxxx",
"authorization_code": "auth_code_xyz..."
}'Reponse (200) :
{
"data": {
"tenant_id": "uuid",
"api_key": "sk_live_newkey...",
"environment": "production"
}
}18. Fiscal Entries
Grand-livre fiscal immutable conforme NF525. Chaque operation (facture, avoir, paiement) est enregistree avec une chaine de hachage SHA256.
Authentification : Tenant Key + scope fiscal:read
GET /v1/tenant/fiscal/entries
Liste les ecritures du grand-livre fiscal.
Parametres :
| Parametre | Type | Description |
|---|---|---|
date_from | date | Date de debut |
date_to | date | Date de fin |
entry_type | string | Type d'ecriture (invoice_created, credit_note_issued, payment, closing) |
environment | string | production ou sandbox |
per_page | integer | Elements par page (defaut: 20) |
curl -X GET "https://api.scell.io/api/v1/tenant/fiscal/entries?date_from=2026-01-01&date_to=2026-12-31" \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"success": true,
"data": [
{
"id": "uuid",
"sequence_number": 42,
"entry_type": "invoice_created",
"entity_type": "invoice",
"entity_id": "uuid",
"fiscal_date": "2026-01-15T10:30:00Z",
"data_hash": "sha256:abc123...",
"previous_hash": "sha256:xyz789...",
"chain_hash": "sha256:def456...",
"legal_status": "donnee_fiscale",
"created_at": "2026-01-15T10:30:00Z"
}
],
"meta": { "current_page": 1, "last_page": 10, "per_page": 20, "total": 200 }
}19. Fiscal Closings
GET /v1/tenant/fiscal/closings
Liste les clotures fiscales (journalieres et mensuelles).
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/closings \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/fiscal/closings/daily
Declenche une cloture journaliere manuelle.
Authentification : Tenant Key + scope fiscal:write
curl -X POST https://api.scell.io/api/v1/tenant/fiscal/closings/daily \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"message": "Cloture journaliere effectuee",
"data": {
"id": "uuid",
"type": "daily",
"date": "2026-01-15",
"entries_count": 15,
"totals": {
"invoices_ht": 5000.00,
"credit_notes_ht": 200.00,
"net_ht": 4800.00
},
"closing_hash": "sha256:..."
}
}Les clotures journalieres sont aussi executees automatiquement a 00:00 UTC.
20. Fiscal Compliance
GET /v1/tenant/fiscal/compliance
Retourne le statut de conformite fiscale du tenant.
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/compliance \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"compliant": true,
"last_integrity_check": "2026-01-15T00:00:00Z",
"integrity_valid": true,
"last_daily_closing": "2026-01-14",
"last_monthly_closing": "2025-12-31",
"kill_switch_active": false,
"chain_length": 1250,
"warnings": []
}
}GET /v1/tenant/fiscal/attestation/{year}
Recupere l'attestation de conformite fiscale pour une annee.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/attestation/2026 \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/fiscal/attestation/{year}/download
Telecharge l'attestation au format PDF.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/attestation/2026/download \
-H "X-Tenant-Key: sk_live_xxxxxx"21. Fiscal Integrity
GET /v1/tenant/fiscal/integrity
Verifie l'integrite de la chaine de hachage fiscale.
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/integrity \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"valid": true,
"entries_checked": 1250,
"first_entry": "2026-01-01T00:00:00Z",
"last_entry": "2026-01-15T10:30:00Z",
"broken_links": [],
"checked_at": "2026-01-15T10:35:00Z"
}
}GET /v1/tenant/fiscal/integrity/history
Historique des verifications d'integrite.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/integrity/history \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/fiscal/integrity/{date}
Verification d'integrite pour une date specifique.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/integrity/2026-01-15 \
-H "X-Tenant-Key: sk_live_xxxxxx"22. Fiscal Rules
Regles fiscales applicables (taux TVA, exonerations, mentions obligatoires).
GET /v1/tenant/fiscal/rules
Liste les regles fiscales actives.
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/rules \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/fiscal/rules/{key}
Details d'une regle fiscale specifique.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/rules/vat_standard_rate \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/fiscal/rules/{key}/history
Historique des modifications d'une regle.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/rules/vat_standard_rate/history \
-H "X-Tenant-Key: sk_live_xxxxxx"GET /v1/tenant/fiscal/rules/export
Exporte toutes les regles fiscales.
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/rules/export \
-H "X-Tenant-Key: sk_live_xxxxxx"POST /v1/tenant/fiscal/rules
Cree une nouvelle regle fiscale.
Authentification : Tenant Key + scope fiscal:write
curl -X POST https://api.scell.io/api/v1/tenant/fiscal/rules \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"key": "vat_reduced_rate",
"value": 5.5,
"description": "Taux reduit TVA",
"effective_from": "2026-01-01"
}'PUT /v1/tenant/fiscal/rules/{id}
Met a jour une regle fiscale.
curl -X PUT https://api.scell.io/api/v1/tenant/fiscal/rules/{id} \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"value": 10.0, "effective_from": "2026-07-01"}'POST /v1/tenant/fiscal/rules/replay
Rejoue les regles fiscales sur les ecritures existantes (recalcul).
Authentification : Tenant Key + scope fiscal:write
curl -X POST https://api.scell.io/api/v1/tenant/fiscal/rules/replay \
-H "X-Tenant-Key: sk_live_xxxxxx"23. Fiscal Anchors
Ancrage cryptographique des donnees fiscales (horodatage RFC 3161).
GET /v1/tenant/fiscal/anchors
Liste les ancrages fiscaux.
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/anchors \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": [
{
"id": "uuid",
"type": "daily_closing",
"entity_id": "uuid",
"data_hash": "sha256:...",
"anchor_reference": "RFC3161:...",
"anchored_at": "2026-01-15T00:01:00Z",
"verified": true
}
]
}24. Fiscal Kill Switch
Mecanisme de securite permettant de bloquer toutes les operations fiscales en cas d'anomalie.
GET /v1/tenant/fiscal/kill-switch/status
Statut du kill-switch.
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/kill-switch/status \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"active": false,
"activated_at": null,
"activated_by": null,
"reason": null
}
}POST /v1/tenant/fiscal/kill-switch/activate
Active le kill-switch. Toutes les operations de creation de factures et avoirs sont bloquees.
Authentification : Tenant Key + scope fiscal:admin
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
reason | string | oui | Motif d'activation |
curl -X POST https://api.scell.io/api/v1/tenant/fiscal/kill-switch/activate \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"reason": "Anomalie detectee dans la chaine de hachage"}'POST /v1/tenant/fiscal/kill-switch/deactivate
Desactive le kill-switch.
Authentification : Tenant Key + scope fiscal:admin
curl -X POST https://api.scell.io/api/v1/tenant/fiscal/kill-switch/deactivate \
-H "X-Tenant-Key: sk_live_xxxxxx"25. Fiscal Export
GET /v1/tenant/fiscal/fec
Exporte le Fichier des Ecritures Comptables (FEC) au format reglementaire.
Authentification : Tenant Key + scope fiscal:read
Parametres :
| Parametre | Type | Description |
|---|---|---|
year | integer | Annee d'export |
month | integer | Mois (optionnel) |
curl -X GET "https://api.scell.io/api/v1/tenant/fiscal/fec?year=2026" \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-o fec_2026.txtLe FEC est genere au format tabule conforme a l'article A47 A-1 du LPF.
GET /v1/tenant/fiscal/forensic-export
Export forensique complet (toutes les donnees avec preuves de chaine).
Authentification : Tenant Key + scope fiscal:read
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/forensic-export \
-H "X-Tenant-Key: sk_live_xxxxxx"26. Admin
Endpoints reserves aux administrateurs de la plateforme Scell.io.
Authentification : Bearer Token + permission admin access
GET /v1/admin/stats
Statistiques globales de la plateforme.
curl -X GET https://api.scell.io/api/v1/admin/stats \
-H "Authorization: Bearer <ADMIN_TOKEN>"GET /v1/admin/users
Liste des utilisateurs.
curl -X GET https://api.scell.io/api/v1/admin/users \
-H "Authorization: Bearer <ADMIN_TOKEN>"POST /v1/admin/users/{id}/toggle-status
Active ou desactive un utilisateur.
curl -X POST https://api.scell.io/api/v1/admin/users/{id}/toggle-status \
-H "Authorization: Bearer <ADMIN_TOKEN>"GET /v1/admin/companies
Liste des entreprises (admin).
curl -X GET https://api.scell.io/api/v1/admin/companies \
-H "Authorization: Bearer <ADMIN_TOKEN>"GET /v1/admin/companies/{id}
Details d'une entreprise (admin).
curl -X GET https://api.scell.io/api/v1/admin/companies/{id} \
-H "Authorization: Bearer <ADMIN_TOKEN>"POST /v1/admin/companies/{id}/toggle-status
Active ou desactive une entreprise.
curl -X POST https://api.scell.io/api/v1/admin/companies/{id}/toggle-status \
-H "Authorization: Bearer <ADMIN_TOKEN>"POST /v1/admin/users/{userId}/credit
Ajoute des credits a un utilisateur.
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
amount | number | oui | Montant a crediter |
reason | string | oui | Motif |
curl -X POST https://api.scell.io/api/v1/admin/users/{userId}/credit \
-H "Authorization: Bearer <ADMIN_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"amount": 50.00, "reason": "Credit offert"}'POST /v1/admin/users/{userId}/debit
Retire des credits a un utilisateur.
curl -X POST https://api.scell.io/api/v1/admin/users/{userId}/debit \
-H "Authorization: Bearer <ADMIN_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"amount": 10.00, "reason": "Ajustement"}'Admin KYB
| Methode | Endpoint | Description |
|---|---|---|
| GET | /v1/admin/kyb/pending | Documents KYB en attente de validation |
| POST | /v1/admin/kyb/documents/{document}/review | Valider ou rejeter un document KYB |
| GET | /v1/admin/kyb/documents/{document}/download | Telecharger un document KYB |
Admin OpenAPI (Signature Provider)
| Methode | Endpoint | Description |
|---|---|---|
| GET | /v1/admin/openapi/config | Configuration OpenAPI.com |
| POST | /v1/admin/openapi/config | Sauvegarder la configuration |
| POST | /v1/admin/openapi/config/verify | Verifier la configuration |
| GET | /v1/admin/openapi/credit | Credit restant OpenAPI.com |
| GET | /v1/admin/openapi/tokens | Lister les tokens OAuth |
| POST | /v1/admin/openapi/tokens | Creer un token OAuth |
| DELETE | /v1/admin/openapi/tokens/{id} | Supprimer un token |
| POST | /v1/admin/openapi/tokens/{id}/refresh | Rafraichir un token |
27. MCP Server
Serveur MCP (Model Context Protocol) pour l'integration avec les agents IA (Claude, etc.).
GET /mcp
Informations du serveur MCP.
Authentification : Aucune
curl -X GET https://api.scell.io/mcpReponse (200) :
{
"name": "scell-mcp-server",
"version": "1.2.0",
"protocol": "2024-11-05",
"tools_count": 54,
"capabilities": ["tools", "resources"]
}POST /mcp
Endpoint JSON-RPC 2.0 principal. Supporte les methodes MCP standard.
Authentification : X-API-Key
Methodes disponibles :
| Methode | Description |
|---|---|
initialize | Initialise la session MCP |
tools/list | Liste les 54 outils disponibles |
tools/call | Execute un outil |
curl -X POST https://api.scell.io/mcp \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'Outils disponibles (54) :
| Categorie | Outils |
|---|---|
| Factures | create_invoice, get_invoice, list_invoices, download_invoice |
| Signatures | create_signature, get_signature, list_signatures, download_signed, cancel_signature, send_reminder |
| Avoirs | create_credit_note, get_credit_note, list_credit_notes, download_credit_note, delete_credit_note, send_credit_note, get_remaining_creditable |
| Fiscal | list_fiscal_entries, list_fiscal_closings, check_fiscal_integrity, get_fiscal_compliance, get_fiscal_attestation, get_kill_switch_status, list_fiscal_rules |
| Compte | get_balance, get_audit_trail |
| Validation | validate_siret, validate_vat |
| Systeme | health_check, validate_api_key |
GET /mcp/stream
Transport SSE (Server-Sent Events) pour les reponses en streaming.
curl -X GET https://api.scell.io/mcp/stream \
-H "X-API-Key: sk_live_xxx" \
-H "Accept: text/event-stream"Sandbox
L'environnement sandbox permet de tester l'API sans debit reel.
Endpoints sandbox
Tous les endpoints sont aussi disponibles via le prefix /v1/sandbox/ :
POST /v1/sandbox/invoices
GET /v1/sandbox/invoices
GET /v1/sandbox/invoices/{id}
GET /v1/sandbox/invoices/{id}/download/{type}
GET /v1/sandbox/invoices/{id}/audit-trail
POST /v1/sandbox/signatures
GET /v1/sandbox/signatures
GET /v1/sandbox/signatures/{id}
GET /v1/sandbox/signatures/{id}/download/{type}
POST /v1/sandbox/signatures/{id}/remind
POST /v1/sandbox/signatures/{id}/cancelDifferences avec la production
| Aspect | Production | Sandbox |
|---|---|---|
| Facturation | 0.04 EUR/facture | Gratuit |
| Signature | 1.20 EUR/signature | Gratuit |
| Rate limit | 60/min | 1000/min |
| Prefixe cle | sk_live_ | sk_test_ |
| Envoi reel | Oui | Non (simule) |
Webhooks entrants (providers)
Endpoints recevant les callbacks des fournisseurs externes.
| Endpoint | Provider | Description |
|---|---|---|
POST /webhooks/openapi/signature | OpenAPI.com | Callback de signature electronique |
POST /webhooks/superpdp/invoice | SuperPDP | Callback de facturation PDP |
POST /webhooks/superpdp/document | SuperPDP | Callback de document |
POST /webhooks/superpdp | SuperPDP | Callback generique |
Ces endpoints ne sont pas destines a etre appeles par les integrateurs. Ils sont documentes a titre de reference technique.
Health Check
GET /api/health
Verification de disponibilite de l'API.
curl -X GET https://api.scell.io/api/healthReponse (200) :
{
"status": "ok",
"timestamp": "2026-01-15T10:30:00Z"
}Resume des endpoints
| Section | Endpoints | Authentification |
|---|---|---|
| Auth | 8 | Aucune / Bearer Token |
| Companies | 7 | Bearer Token |
| Invoices | 7 | API Key / Bearer Token |
| Signatures | 6 | API Key / Bearer Token |
| Credit Notes | 7 | Bearer Token |
| API Keys | 4 | Bearer Token |
| Balance | 4 | Bearer Token |
| Webhooks | 8 | Bearer Token |
| Incoming Invoices | 5 | Bearer Token |
| Tenant | 7 | Tenant Key |
| Sub-Tenants | 7 | Tenant Key |
| Tenant Invoices | 12 | Tenant Key |
| Tenant Credit Notes | 9 | Tenant Key |
| Tenant Billing | 7 | Tenant Key |
| Tenant Incoming Invoices | 6 | Tenant Key |
| KYB Documents | 6 | Tenant Key |
| Onboarding | 7 | Publishable Key |
| Fiscal | 20 | Tenant Key + scope |
| Admin | 16 | Bearer Token (admin) |
| MCP | 3 | API Key |
| Sandbox | 11 | API Key (sk_test_) |
| Tenant Auth | 7 | Aucune / Tenant Key |
| Tenant Onboarding | 7 | Tenant Key / Publishable Key |
| ISCA Fiscal Documents | 3 | Tenant Key |
| Public | 1 | Aucune |
28. Sandbox
Le sandbox reproduit tous les endpoints de production avec des donnees de test. Utiliser des cles sk_test_ pour acceder au mode sandbox.
Authentification : API Key (sk_test_ prefix)
POST /v1/sandbox/invoices
Cree une facture de test. Meme corps de requete que POST /v1/invoices.
curl -X POST https://api.scell.io/api/v1/sandbox/invoices \
-H "X-API-Key: sk_test_xxx" \
-H "Content-Type: application/json" \
-d '{
"invoice_number": "TEST-2026-001",
"direction": "outgoing",
"output_format": "facturx",
"issue_date": "2026-01-15",
"total_ht": 1000.00,
"total_tax": 200.00,
"total_ttc": 1200.00,
"seller_siret": "12345678901234",
"seller_name": "Ma Societe SAS",
"seller_address": {"line1": "1 Rue de la Paix", "postal_code": "75001", "city": "Paris"},
"buyer_siret": "98765432109876",
"buyer_name": "Client SARL",
"buyer_address": {"line1": "10 Avenue des Champs", "postal_code": "75008", "city": "Paris"},
"lines": [{"description": "Test", "quantity": 1, "unit_price": 1000.00, "tax_rate": 20.00, "total_ht": 1000.00, "total_tax": 200.00, "total_ttc": 1200.00}]
}'Reponse (201) :
{
"message": "Facture de test creee",
"data": {
"id": "uuid",
"invoice_number": "TEST-2026-001",
"status": "draft",
"environment": "sandbox",
"created_at": "2026-01-15T10:30:00Z"
}
}GET /v1/sandbox/invoices
Liste les factures de test. Meme pagination que GET /v1/invoices.
curl -X GET "https://api.scell.io/api/v1/sandbox/invoices?per_page=20&page=1" \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"data": [...],
"meta": {"current_page": 1, "last_page": 1, "per_page": 20, "total": 5}
}GET /v1/sandbox/invoices/{id}
Recupere une facture de test par son ID.
curl -X GET https://api.scell.io/api/v1/sandbox/invoices/{id} \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"data": {
"id": "uuid",
"invoice_number": "TEST-2026-001",
"status": "draft",
"environment": "sandbox",
"total_ttc": 1200.00
}
}Erreurs : 404 (facture introuvable)
GET /v1/sandbox/invoices/{id}/audit-trail
Piste d'audit d'une facture de test.
curl -X GET https://api.scell.io/api/v1/sandbox/invoices/{id}/audit-trail \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"data": [
{
"event": "invoice_created",
"performed_at": "2026-01-15T10:30:00Z",
"actor": "api_key:sk_test_..."
}
]
}GET /v1/sandbox/invoices/{id}/download/{type}
Telecharge une facture de test. Types disponibles : pdf, xml, facturx.
curl -X GET https://api.scell.io/api/v1/sandbox/invoices/{id}/download/pdf \
-H "X-API-Key: sk_test_xxx" \
-o invoice_test.pdfReponse : Fichier binaire avec header Content-Type adapte (application/pdf, application/xml, application/octet-stream).
Erreurs : 404 (facture introuvable), 422 (type invalide)
POST /v1/sandbox/signatures
Cree une demande de signature de test. Meme corps que POST /v1/signatures.
curl -X POST https://api.scell.io/api/v1/sandbox/signatures \
-H "X-API-Key: sk_test_xxx" \
-H "Content-Type: application/json" \
-d '{
"title": "Contrat de test",
"signers": [{"name": "Jean Dupont", "email": "jean@example.com"}],
"document_base64": "base64encodedpdf..."
}'Reponse (201) :
{
"message": "Signature de test creee",
"data": {
"id": "uuid",
"title": "Contrat de test",
"status": "pending",
"environment": "sandbox",
"created_at": "2026-01-15T10:30:00Z"
}
}GET /v1/sandbox/signatures
Liste les demandes de signature de test.
curl -X GET https://api.scell.io/api/v1/sandbox/signatures \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"data": [...],
"meta": {"current_page": 1, "last_page": 1, "per_page": 20, "total": 3}
}GET /v1/sandbox/signatures/{id}
Recupere une demande de signature de test par son ID.
curl -X GET https://api.scell.io/api/v1/sandbox/signatures/{id} \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"data": {
"id": "uuid",
"title": "Contrat de test",
"status": "pending",
"environment": "sandbox",
"signers": [{"name": "Jean Dupont", "email": "jean@example.com", "signed_at": null}]
}
}Erreurs : 404 (signature introuvable)
POST /v1/sandbox/signatures/{id}/cancel
Annule une demande de signature de test.
curl -X POST https://api.scell.io/api/v1/sandbox/signatures/{id}/cancel \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"message": "Signature de test annulee",
"data": {"id": "uuid", "status": "cancelled"}
}Erreurs : 404 (signature introuvable), 422 (deja annulee ou completee)
GET /v1/sandbox/signatures/{id}/download/{type}
Telecharge les documents d'une signature de test. Types disponibles : signed_pdf, proof.
curl -X GET https://api.scell.io/api/v1/sandbox/signatures/{id}/download/signed_pdf \
-H "X-API-Key: sk_test_xxx" \
-o signed_test.pdfReponse : Fichier binaire (application/pdf pour signed_pdf, application/json pour proof).
Erreurs : 404 (signature introuvable), 422 (type invalide), 409 (signature non completee)
POST /v1/sandbox/signatures/{id}/remind
Envoie un rappel pour une signature de test.
curl -X POST https://api.scell.io/api/v1/sandbox/signatures/{id}/remind \
-H "X-API-Key: sk_test_xxx"Reponse (200) :
{
"message": "Rappel envoye (simulation sandbox)",
"data": {"reminded_at": "2026-01-15T11:00:00Z"}
}Erreurs : 404 (signature introuvable), 422 (signature deja completee ou annulee)
29. Tenant Authentication
Authentification des tenants via cle publishable ou cle tenant.
POST /v1/tenant/auth/register
Inscrit un nouveau tenant. Utilise une cle publishable pour identifier le partenaire.
Authentification : Aucune (cle publishable dans le corps)
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
publishable_key | string | oui | Cle publishable du partenaire |
name | string | oui | Nom du tenant |
email | string (email) | oui | Email de contact |
password | string | oui | Mot de passe |
siret | string (14 car.) | oui | Numero SIRET |
curl -X POST https://api.scell.io/api/v1/tenant/auth/register \
-H "Content-Type: application/json" \
-d '{
"publishable_key": "pk_live_xxxxxx",
"name": "Mon Tenant",
"email": "contact@mon-tenant.fr",
"password": "motdepasse",
"siret": "12345678901234"
}'Reponse (201) :
{
"message": "Tenant cree avec succes",
"data": {
"tenant_id": "uuid",
"api_key": "sk_live_newkey...",
"environment": "production"
}
}Erreurs : 422 (validation), 409 (email deja utilise)
POST /v1/tenant/auth/login
Authentifie un tenant et retourne un token.
Authentification : Aucune
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
email | string (email) | oui | Email du tenant |
password | string | oui | Mot de passe |
curl -X POST https://api.scell.io/api/v1/tenant/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "contact@mon-tenant.fr", "password": "motdepasse"}'Reponse (200) :
{
"data": {
"token": "sk_live_...",
"tenant_id": "uuid",
"expires_at": null
}
}Erreurs : 401 (identifiants invalides), 429 (trop de tentatives)
POST /v1/tenant/auth/logout
Revoque le token tenant actuel.
Authentification : Tenant Key
curl -X POST https://api.scell.io/api/v1/tenant/auth/logout \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"message": "Deconnexion reussie"
}GET /v1/tenant/auth/me
Recupere le profil du tenant authentifie.
Authentification : Tenant Key
curl -X GET https://api.scell.io/api/v1/tenant/auth/me \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"id": "uuid",
"name": "Mon Tenant",
"email": "contact@mon-tenant.fr",
"siret": "12345678901234",
"kyb_status": "verified",
"environment": "production",
"created_at": "2026-01-10T08:00:00Z"
}
}GET /v1/tenant/auth/keys
Liste les cles API du tenant.
Authentification : Tenant Key
curl -X GET https://api.scell.io/api/v1/tenant/auth/keys \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": [
{
"id": "uuid",
"type": "secret",
"prefix": "sk_live_",
"last_four": "xxxx",
"created_at": "2026-01-10T08:00:00Z",
"last_used_at": "2026-01-15T10:30:00Z"
}
]
}POST /v1/tenant/auth/keys/secret
Genere une nouvelle cle secrete pour le tenant.
Authentification : Tenant Key
curl -X POST https://api.scell.io/api/v1/tenant/auth/keys/secret \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (201) :
{
"message": "Cle secrete generee",
"data": {
"id": "uuid",
"key": "sk_live_newkey...",
"type": "secret",
"created_at": "2026-01-15T10:30:00Z"
}
}La cle complete n'est visible qu'une seule fois. Conservez-la immediatement.
POST /v1/tenant/auth/keys/publishable
Genere une nouvelle cle publishable pour le tenant.
Authentification : Tenant Key
curl -X POST https://api.scell.io/api/v1/tenant/auth/keys/publishable \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (201) :
{
"message": "Cle publishable generee",
"data": {
"id": "uuid",
"key": "pk_live_newkey...",
"type": "publishable",
"created_at": "2026-01-15T10:30:00Z"
}
}30. Tenant Onboarding
Flux d'onboarding pour les tenants souhaitant inscrire leurs propres sous-tenants via une interface integree.
POST /v1/tenant/onboarding/sessions
Cree une session d'onboarding pour un sous-tenant.
Authentification : Tenant Key ou Publishable Key
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
mode | string | oui | api, redirect ou embedded |
external_id | string | non | Identifiant dans votre systeme |
callback_url | string (url) | non | URL de callback apres completion |
metadata | object | non | Donnees personnalisees |
curl -X POST https://api.scell.io/api/v1/tenant/onboarding/sessions \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"mode": "redirect",
"callback_url": "https://monapp.com/callback",
"external_id": "client_456"
}'Reponse (201) :
{
"message": "Session creee",
"data": {
"id": "uuid",
"mode": "redirect",
"status": "pending",
"redirect_url": "https://app.scell.io/onboarding/uuid",
"expires_at": "2026-01-15T11:30:00Z"
}
}GET /v1/tenant/onboarding/sessions/{id}
Recupere le statut d'une session d'onboarding.
Authentification : Tenant Key ou Publishable Key
curl -X GET https://api.scell.io/api/v1/tenant/onboarding/sessions/{id} \
-H "X-Tenant-Key: sk_live_xxxxxx"Reponse (200) :
{
"data": {
"id": "uuid",
"status": "completed",
"external_id": "client_456",
"sub_tenant_id": "uuid",
"completed_at": "2026-01-15T11:00:00Z"
}
}Erreurs : 404 (session introuvable)
POST /v1/tenant/onboarding/superpdp/authorize
Genere l'URL OAuth2 SuperPDP a ouvrir dans un popup. SuperPDP gere ensuite l'inscription, le KYB et la verification d'identite.
Authentification : Publishable Key
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
session_id | uuid | oui | ID de la session d'onboarding |
curl -X POST https://api.scell.io/api/v1/tenant/onboarding/superpdp/authorize \
-H "X-Publishable-Key: pk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{"session_id": "session_uuid"}'Reponse (200) :
{
"authorize_url": "https://api.superpdp.tech/oauth2/authorize?client_id=...&state=...&redirect_uri=...&response_type=code",
"state": "scell_session_state_random"
}Erreurs : 404 (session introuvable), 503 (SuperPDP indisponible)
POST /v1/tenant/onboarding/exchange
Echange un token de session contre des credentials d'authentification. Rate limit strict (5/min).
Authentification : Publishable Key
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
session_id | uuid | oui | ID de la session completee |
authorization_code | string | oui | Code d'autorisation recu apres completion |
curl -X POST https://api.scell.io/api/v1/tenant/onboarding/exchange \
-H "X-Publishable-Key: pk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"session_id": "uuid",
"authorization_code": "auth_code_xyz..."
}'Reponse (200) :
{
"data": {
"sub_tenant_id": "uuid",
"api_key": "sk_live_subtenantkey...",
"environment": "production"
}
}Erreurs : 401 (code invalide), 410 (code expire), 429 (trop de tentatives)
POST /v1/tenant/onboarding/superpdp/callback
Echange le code OAuth2 SuperPDP contre des tokens, recupere les infos entreprise depuis SuperPDP, cree le sous-tenant Scell avec les tokens stockes et retourne un authorization_code Scell.
Authentification : Publishable Key
Corps :
| Champ | Type | Requis | Description |
|---|---|---|---|
session_id | uuid | oui | ID de la session |
code | string | oui | Code OAuth2 retourne par SuperPDP apres inscription |
state | string | oui | State retourne par /superpdp/authorize (verification CSRF) |
curl -X POST https://api.scell.io/api/v1/tenant/onboarding/superpdp/callback \
-H "X-Publishable-Key: pk_live_xxxxxx" \
-H "Content-Type: application/json" \
-d '{
"session_id": "session_uuid",
"code": "auth_xyz789...",
"state": "scell_session_state_random"
}'Reponse (200) :
{
"success": true,
"authorization_code": "scell_auth_code_xyz",
"tenant": {
"id": "uuid",
"name": "Acme SAS",
"siret": "12345678901234",
"environment": "production"
}
}Erreurs : 400 (state invalide ou session expiree), 404 (session introuvable), 503 (echec exchange ou SuperPDP indisponible)
31. ISCA Fiscal Documents
Documents fiscaux ISCA (Independant Software and Compliance Attestation) disponibles en telechargement pour les tenants.
Authentification : Tenant Key
GET /v1/tenant/fiscal/isca/self-attestation/download
Telecharge l'auto-attestation ISCA (PDF).
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/isca/self-attestation/download \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-o isca_self_attestation.pdfReponse : Fichier PDF (Content-Type: application/pdf).
Erreurs : 401 (non authentifie), 403 (acces refuse)
GET /v1/tenant/fiscal/isca/technical-dossier/download
Telecharge le dossier technique ISCA (PDF).
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/isca/technical-dossier/download \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-o isca_technical_dossier.pdfReponse : Fichier PDF (Content-Type: application/pdf).
Erreurs : 401 (non authentifie), 403 (acces refuse)
GET /v1/tenant/fiscal/isca/measures-register/download
Telecharge le registre des mesures ISCA (PDF).
curl -X GET https://api.scell.io/api/v1/tenant/fiscal/isca/measures-register/download \
-H "X-Tenant-Key: sk_live_xxxxxx" \
-o isca_measures_register.pdfReponse : Fichier PDF (Content-Type: application/pdf).
Erreurs : 401 (non authentifie), 403 (acces refuse)
32. Public Endpoints
Endpoints publics ne necessitant aucune authentification.
GET /v1/pricing
Retourne les informations de tarification publiques.
Authentification : Aucune
curl -X GET https://api.scell.io/api/v1/pricingReponse (200) :
{
"data": {
"invoice_price": 0.04,
"signature_price": 1.20,
"credit_note_price": 0.04,
"currency": "EUR"
}
}| Sandbox | 12 | API Key | | Health | 1 | Aucune | | Total | ~163 | |