Cas d’usage
Flow signature eIDAS EU-SES (création → polling → download)
Workflow complet de signature simple en 3 étapes
Le flow signature Scell.io suit 3 étapes : (1) `POST /api/v1/signatures` avec PDF + signataires + ui_config → retourne `signature_id` et `signing_urls[]`, (2) le signataire ouvre l'URL, signe via le tunnel d'OpenAPI.com, prestataire certifié eIDAS (typed/drawn/both), reçoit OTP SMS BulkGate, (3) côté serveur, écouter le webhook `signature.completed` ou poller `GET /api/v1/signatures/{id}` jusqu'au statut `completed`, puis télécharger le PDF signé via `GET /api/v1/signatures/{id}/download`. Le PDF signé inclut le certificat eIDAS EU-SES et la piste d'audit (audit trail PDF). Conservation 10 ans automatique.
À retenir
- Étape 1 : POST avec PDF base64 + signers + ui_config
- Étape 2 : signataire ouvre `signing_url`, OTP SMS via BulkGate
- Étape 3 : webhook `signature.completed` ou polling status
- Statuts : `pending` → `in_progress` → `completed` / `expired`
- Audit trail PDF inclus dans le download (preuve eIDAS)
- Expiration par défaut 30 jours, configurable
Exemple de code
import { ScellClient } from '@scell/sdk';
import { readFileSync } from 'node:fs';
const scell = new ScellClient({ apiKey: process.env.SCELL_SECRET_KEY! });
// 1. Créer la signature
const sig = await scell.signatures.create({
document: { name: 'contrat.pdf', content_base64: readFileSync('contrat.pdf').toString('base64') },
signers: [{ email: 'client@example.com', phone: '+33612345678', first_name: 'Jean', last_name: 'Dupont' }],
signature_options: { signature_mode: 'both', timezone: 'Europe/Paris' },
ui_config: { sidebar_color: '#4F46E5', button_color: '#4F46E5' },
});
console.log('Signing URL:', sig.signing_urls[0]);
// 2. Webhook recommandé, sinon polling
let status = sig.status;
while (status !== 'completed' && status !== 'expired') {
await new Promise((r) => setTimeout(r, 10_000));
status = (await scell.signatures.retrieve(sig.id)).status;
}
// 3. Télécharger le PDF signé
const signedPdf = await scell.signatures.download(sig.id);