Référence développeurs
Créez et suivez des notifications certifiées par programmation. Chaque appel produit la même preuve juridique que l'interface web : empreinte SHA-256, signature RSA-4096, horodatage RFC 3161 et chaîne de preuve vérifiable.
API REST, requêtes et réponses en JSON (UTF-8), sur HTTPS uniquement. Toutes les routes sont préfixées par la version.
# URL de base https://app.signifio.ca/api/v1 # Format Content-Type: application/json; charset=utf-8 Authorization: Bearer sk_votre_cle_api
| Méthode & chemin | Scope | Description |
|---|---|---|
GET /api/v1 | read | Index de découverte (liste des endpoints) |
GET /api/v1/account | read | Profil, plan et soldes de crédits |
GET /api/v1/usage | read | Quotas et consommation |
POST /api/v1/notifications | send | Créer et envoyer une notification certifiée |
GET /api/v1/notifications | read | Lister vos notifications (filtres + pagination) |
GET /api/v1/notifications/{uid} | read | Statut + rapport de preuve d'une notification |
GET /api/v1/notifications/{uid}/events | read | Chaîne d'événements de preuve |
GET /api/v1/notifications/{uid}/proof | read | Cahier de preuves complet (JSON) |
POST /api/v1/notifications/{uid}/cancel | send | Annuler une notification non ouverte |
POST /api/v1/notifications/{uid}/attachments | send | Téléverser une pièce jointe |
GET /api/v1/dossiers | read | Lister vos dossiers (filtres + pagination) |
POST /api/v1/dossiers | dossiers:write | Créer un dossier |
GET /api/v1/dossiers/{uid} | read | Détail d'un dossier (+ notifications, échéances) |
GET /api/v1/dossiers/{uid}/notifications | read | Notifications d'un dossier (paginé) |
GET /api/v1/contacts | read | Lister/rechercher les contacts |
POST /api/v1/contacts | contacts:write | Créer un contact |
GET /api/v1/webhooks | read | Lister les webhooks |
POST /api/v1/webhooks | webhooks:write | Créer un webhook |
DELETE /api/v1/webhooks/{id} | webhooks:write | Supprimer un webhook |
GET /api/v1/templates | read | Lister les modèles disponibles |
GET /api/v1/analytics | read | Statistiques d'engagement |
POST /api/v1/demo | aucun | Envoyer une preuve test (sans clé, limité) |
Sécurité
L'API utilise une authentification par clé secrète via l'en-tête Authorization au format Bearer. Vos clés se gèrent depuis votre compte (section API). La clé n'est affichée qu'une seule fois à la création — elle est stockée hachée (SHA-256) côté serveur.
Authorization: Bearer sk_live_a1b2c3d4e5f6...
Chaque clé porte un ou plusieurs scopes. Un appel à un endpoint exige le scope correspondant, sinon la réponse est 403.
read — lecture (listes, statuts, preuve, événements, compte, analytics)send — création/envoi de notifications, pièces, annulationdossiers:write — création de dossierscontacts:write — création de contactswebhooks:write — création/suppression de webhooksUne clé peut avoir une date d'expiration. Les clés expirées ou révoquées renvoient 401. Révoquez une clé compromise à tout moment depuis votre compte — l'effet est immédiat.
Fiabilité
Chaque clé dispose d'une limite par minute (100 par défaut, configurable). Au dépassement, l'API renvoie 429 avec un en-tête Retry-After: 60.
Les erreurs renvoient un code HTTP approprié et un corps JSON décrivant le problème.
// Exemple de réponse d'erreur (HTTP 422) { "error": { "code": "validation_failed", "message": "Adresse destinataire invalide." } }
| Code HTTP | Signification |
|---|---|
200 / 201 | Succès / Ressource créée |
400 | Corps JSON invalide |
401 | Clé manquante, invalide ou expirée |
402 | Crédits insuffisants (quota) |
403 | Scope insuffisant ou compte inactif |
404 | Ressource introuvable |
405 | Méthode non autorisée |
409 | Conflit (ex. notification verrouillée) |
422 | Validation échouée |
429 | Limite de débit dépassée |
Endpoint · scope send
POST /api/v1/notifications — valide, scelle l'empreinte, envoie le courriel certifié et démarre la chaîne de preuve. Supporte un mode bac à sable dry_run.
| Champ | Type | Requis | Description |
|---|---|---|---|
recipient_email | string | Oui | Adresse du destinataire (MX vérifié, jetables refusées) |
recipient_name | string | Oui | Nom du destinataire |
subject | string | Oui | Objet de la communication |
body | string | Oui | Contenu du message |
type | string | Non | Catégorie libre (défaut general) |
dossier_uid | string | Non | Rattache la notification à un dossier existant |
dry_run | boolean | Non | Si true : valide et calcule l'empreinte sans envoyer ni consommer de crédit |
curl -X POST https://app.signifio.ca/api/v1/notifications \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "recipient_email": "[email protected]", "recipient_name": "Jean Tremblay", "subject": "Avis d'augmentation de loyer", "body": "Conformément au bail...", "type": "avis" }'
{
"success": true,
"notification": {
"uid": "a1b2c3d4-...-....",
"status": "sent",
"content_hash": "23c422e3561a...",
"verification_code": "A1B2C3D4E5F6"
},
"proof_url": "https://app.signifio.ca/proof/a1b2c3d4-...",
"verify_url": "https://app.signifio.ca/verify?code=A1B2C3D4E5F6"
}
En mode dry_run, la réponse (HTTP 200) contient "dry_run": true, le content_hash et un objet would_create, sans créer d'envoi.
Endpoint · scope read
GET /api/v1/notifications — retourne vos notifications, les plus récentes d'abord. Pagination via page et per_page (max 100).
curl https://app.signifio.ca/api/v1/notifications?page=1&per_page=25 \ -H "Authorization: Bearer sk_live_..." // Réponse { "data": [ { "uid": "a1b2c3d4-...", "recipient_email": "[email protected]", "recipient_name": "Jean Tremblay", "subject": "Avis d'augmentation", "status": "opened", "sent_at": "2026-06-14 10:32:19", "opened_at": "2026-06-14 14:45:03", "content_hash": "23c422e3...", "created_at": "2026-06-14 10:32:18" } ], "pagination": { "page": 1, "per_page": 25, "total": 148, "pages": 6 } }
Endpoint · scope read
GET /api/v1/notifications/{uid} — statut détaillé, horodatages du cycle de vie et résumé du rapport de certification (validité de l'intégrité).
{
"data": {
"uid": "a1b2c3d4-...",
"subject": "Avis d'augmentation",
"recipient": { "email": "[email protected]", "name": "Jean Tremblay" },
"status": "opened",
"timestamps": {
"scheduled_at": null,
"sent_at": "2026-06-14 10:32:19",
"delivered_at": "2026-06-14 10:32:21",
"opened_at": "2026-06-14 14:45:03",
"acknowledged_at": null,
"refused_at": null,
"created_at": "2026-06-14 10:32:18"
},
"proof_score": 95,
"proof": {
"integrity_valid": true,
"total_events": 4,
"content_hash": "23c422e3..."
}
}
}
Valeurs possibles de status : queued, sent, delivered, opened, acknowledged, refused, bounced, failed.
Endpoint · scope read
GET /api/v1/notifications/{uid}/events — liste les maillons de la chaîne de preuve (sous-ensemble non confidentiel). Les données personnelles ne sont jamais exposées ici.
{
"data": {
"notification_uid": "a1b2c3d4-...",
"integrity_valid": true,
"total_events": 4,
"events": [
{ "event_type": "created", "created_at": "...", "tsa_status": "ok", "data_hash": "..." },
{ "event_type": "sent", "created_at": "...", "tsa_status": "ok", "data_hash": "..." },
{ "event_type": "delivered", "created_at": "...", "tsa_status": "ok", "data_hash": "..." },
{ "event_type": "opened", "created_at": "...", "tsa_status": "ok", "data_hash": "..." }
]
}
}
Endpoint · scope send
POST /api/v1/notifications/{uid}/attachments — ajoute une pièce à une notification. Envoi multipart/form-data, champ file. La pièce est analysée par antivirus et stockée par empreinte SHA-256.
409)curl -X POST \
https://app.signifio.ca/api/v1/\
notifications/{uid}/attachments \
-H "Authorization: Bearer sk_live_..." \
-F "[email protected]"
Endpoint · scope read
GET /api/v1/dossiers (liste paginée) et GET /api/v1/dossiers/{uid} (détail). Un dossier regroupe des notifications par affaire.
{
"data": [
{
"uid": "f1e2d3c4-...",
"name": "Dossier — 123 rue Principale",
"type": "bail",
"status": "actif",
"case_number": "TAL-2026-00123",
"created_at": "2026-05-01 09:00:00"
}
],
"pagination": { "page": 1, "per_page": 25, "total": 12, "pages": 1 }
}
Endpoint · scope read
GET /api/v1/account (profil, plan, crédits, compteurs) et GET /api/v1/usage (quotas et consommation du mois). GET /api/v1 renvoie l'index de découverte de l'API.
// GET /api/v1/account { "data": { "name": "...", "email": "...", "plan": "entreprise", "account_type": "postpaid", "credits": { "balance": 200, "low_threshold": 10 }, "counts": { "notifications": 143, "dossiers": 12, "contacts": 26 } } }
Fiabilité des écritures
Sur les requêtes POST de création, ajoutez un en-tête Idempotency-Key (chaîne unique de votre choix). Si vous rejouez la même requête (retry réseau), l'API renvoie la réponse d'origine au lieu de créer un doublon. La réponse rejouée porte l'en-tête Idempotent-Replayed: true. Les clés sont conservées 24 h.
curl -X POST https://app.signifio.ca/api/v1/notifications \ -H "Authorization: Bearer sk_live_..." \ -H "Idempotency-Key: 9f3k2m-unique-2026" \ -H "Content-Type: application/json" \ -d '{ ... }'
Chaque réponse inclut aussi les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset.
Endpoint · scope read / contacts:write
GET /api/v1/contacts (liste/recherche, filtres type, category, search) et POST /api/v1/contacts (création). Un courriel déjà présent pour votre compte renvoie 409.
curl -X POST https://app.signifio.ca/api/v1/contacts \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "email": "[email protected]", "name": "Jean", "last_name": "Tremblay", "type": "avocat", "company": "Cabinet X" }'
Endpoint · scope read
GET /api/v1/templates liste vos modèles et les modèles système québécois (filtre category). GET /api/v1/analytics renvoie votre tableau d'engagement : entonnoir de livraison, taux (livraison, ouverture, accusé), délai moyen d'ouverture et tendance sur 6 mois.
Chaque modèle expose nom, objet, catégorie, indicateur système/public et compteur d'utilisation.
Les mêmes chiffres que votre tableau de bord web : funnel, reliability, avg_open_hours, monthly.
Temps réel
Plutôt que d'interroger l'API, recevez les événements du cycle de vie sur vos propres endpoints. Les événements d'envoi réussi déclenchent par exemple notification.sent. Les livraisons en échec sont réessayées automatiquement.
La communication a été transmise avec succès au serveur destinataire.
Chaque webhook inclut une charge JSON avec l'uid, le destinataire et le canal d'origine.
Les webhooks en échec sont remis en file et réessayés — pas de perte d'événement.
POST /api/v1/demoEnvoie une preuve de démonstration à une adresse, sans clé API. Limité par IP/adresse (anti-abus). Utile pour tester le rendu et la livraison avant intégration.
GET /api/healthPoint de contrôle pour la supervision (uptime). Protégé par un jeton (?token=...). Renvoie 200 si sain, 503 si dégradé.
Créez un compte, générez une clé API avec les scopes voulus, et passez votre premier appel en quelques minutes.
Votre première communication certifiée est gratuite. Aucune carte de crédit requise.