Aller au contenu
✓ Conforme LCCJTI (Québec) ✓ Chaîne de preuve SHA-256 ✓ Horodatage RFC 3161 ✓ Hébergement Canada Nouveau Module Études d'huissiers →

Documentation de l'API REST v1

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.

Aperçu

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

Authentification

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...

Scopes (permissions)

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, annulation
  • dossiers:write — création de dossiers
  • contacts:write — création de contacts
  • webhooks:write — création/suppression de webhooks

Expiration & révocation

Une 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.

Limites de débit & erreurs

Rate limiting

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.

Format d'erreur

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."
  }
}

Créer une notification certifiée

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.

Paramètres (corps JSON)

Exemple de requête

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"
  }'

Réponse (HTTP 201)

{
  "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.

Lister les notifications

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 }
}

Statut & preuve d'une notification

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.

Chaîne d'événements de preuve

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": "..." }
    ]
  }
}

Téléverser une pièce jointe

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.

Contraintes

  • Formats : PDF, DOCX, DOC, HTML
  • Taille max : 10 Mo
  • Analyse antivirus (rejet si infecté)
  • Refusé si la notification est verrouillée (409)

Exemple

curl -X POST \
 https://app.signifio.ca/api/v1/\
notifications/{uid}/attachments \
 -H "Authorization: Bearer sk_live_..." \
 -F "[email protected]"

Dossiers

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 }
}

Compte & consommation

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 }
  }
}

Idempotence

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.

Contacts

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"
  }'

Modèles & analytique

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.

Modèles

Chaque modèle expose nom, objet, catégorie, indicateur système/public et compteur d'utilisation.

Analytique

Les mêmes chiffres que votre tableau de bord web : funnel, reliability, avg_open_hours, monthly.

Webhooks

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.

notification.sent

La communication a été transmise avec succès au serveur destinataire.

Signature de charge

Chaque webhook inclut une charge JSON avec l'uid, le destinataire et le canal d'origine.

Relance automatique

Les webhooks en échec sont remis en file et réessayés — pas de perte d'événement.

Configurer un webhook dans votre compte →

Endpoints utilitaires

Preuve test — POST /api/v1/demo

Envoie 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.

État du service — GET /api/health

Point de contrôle pour la supervision (uptime). Protégé par un jeton (?token=...). Renvoie 200 si sain, 503 si dégradé.

Prêt à intégrer la preuve ?

Créez un compte, générez une clé API avec les scopes voulus, et passez votre premier appel en quelques minutes.

Obtenir une clé API

Commencez à générer des preuves juridiques en moins de 2 minutes

Votre première communication certifiée est gratuite. Aucune carte de crédit requise.

🔒 Essayer gratuitement