Aller au contenu principal
Prouvez l'intégrité & l'existence de vos documents • API de notarisation blockchain • Horodatage qualifié eIDAS

Documentation

Démarrez avec l'API Anchorify

REST API

L'API Anchorify est une API REST JSON simple. Authentifiez-vous avec une clé API via le header X-API-Key.

URL de base

https://api.anchorify.cloud

Spécification OpenAPI

openapi.json

Démarrage rapide

L'API Anchorify vous permet de créer des preuves infalsifiables en ancrant des hashes sur des blockchains publiques. Voici comment commencer :

1

1. Obtenez votre clé API

Créez un compte et générez une clé API depuis la console.

2

2. Hashez vos données localement

Générez un hash de votre fichier ou donnée. Les données originales n'ont jamais besoin de quitter votre système.

# Générer un hash SHA-256 (sortie hexadécimale)
openssl dgst -sha256 document.pdf
# SHA256(document.pdf)= e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

# Utilisez la chaîne hexadécimale directement dans l'API
3

3. Soumettez le hash

Envoyez le hash encodé en hexadécimal à notre API REST pour créer une notarisation. Vous recevrez un ID de notarisation pour le suivi.

POST /v1/notarizations
curl -X POST https://api.anchorify.cloud/v1/notarizations \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "algorithm": "SHA256",
    "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "name": "document.pdf"
  }'
Réponse (201)
{
  "id": "019c0e1a-d891-7f1f-ab6e-5588c46c2a4b",
  "algorithm": "SHA256",
  "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "status": "pending",
  "blockchain_proofs": [
    { "provider_name": "Algorand", "status": "pending", "created_at": "2026-01-30T08:52:46Z" },
    { "provider_name": "Base", "status": "pending", "created_at": "2026-01-30T08:52:46Z" },
    { "provider_name": "Polygon", "status": "pending", "created_at": "2026-01-30T08:52:46Z" }
  ],
  "created_at": "2026-01-30T08:52:46Z",
  "name": "document.pdf"
}
4

4. Interrogez le statut

Vérifiez le statut de la preuve. Une fois ancrée sur la blockchain, vous pouvez exporter votre document de preuve signé.

GET /v1/notarizations/{id}
curl https://api.anchorify.cloud/v1/notarizations/019c0e1a-d891-7f1f-ab6e-5588c46c2a4b \
  -H "X-API-Key: YOUR_API_KEY"
Réponse (200)
{
  "id": "019c0e1a-d891-7f1f-ab6e-5588c46c2a4b",
  "algorithm": "SHA256",
  "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "status": "completed",
  "timestamp_proof": {
    "status": "timestamped",
    "tsa_provider": { "name": "FreeTSA" },
    "data": "MIIB...",
    "timestamped_at": "2026-01-30T08:52:48Z",
    "created_at": "2026-01-30T08:52:47Z"
  },
  "blockchain_proofs": [
    {
      "provider_name": "Polygon",
      "transaction_id": "0xabc123...",
      "explorer_url": "https://polygonscan.com/tx/0xabc123...",
      "status": "anchored",
      "anchored_at": "2026-01-30T08:53:32Z",
      "created_at": "2026-01-30T08:52:47Z"
    }
  ],
  "merkle_proof": {
    "hash_algorithm": "SHA256",
    "leaf_index": 2,
    "siblings": [{ "position": "left", "hash": "9f8e7d6c..." }]
  },
  "merkle_root": "a1b2c3d4...",
  "accumulator": {
    "merkle_root": "a1b2c3d4...",
    "sealed_at": "2026-01-30T08:52:47Z"
  },
  "created_at": "2026-01-30T08:52:46Z",
  "updated_at": "2026-01-30T08:53:32Z",
  "notarized_at": "2026-01-30T08:53:32Z",
  "name": "document.pdf"
}

Référence API

POST /v1/notarizations

Créer une notarisation

Body : algorithm (requis, SHA256 | SHA384 | SHA512), hash (requis, chaîne hexadécimale), name (optionnel), qualified_timestamp (optionnel)

GET /v1/notarizations/{id}

Récupérer une notarisation par ID

Chemin : id (requis, UUID)

Webhooks

Pro

Les webhooks permettent à votre application de recevoir des notifications HTTP POST en temps réel lorsque des événements de notarisation se produisent. Configurez les URL d'endpoint et abonnez-vous aux types d'événements depuis la console.

Types d'événements

Abonnez-vous aux événements pertinents pour votre workflow. Chaque livraison webhook inclut un snapshot complet de la notarisation avec l'état actuel des preuves.

Type d'événement Description
notarization.created Notarisation soumise et acceptée.
notarization.sealed Accumulateur scellé, preuve Merkle assignée. L'ancrage blockchain commence.
notarization.timestamped Horodatage RFC 3161 obtenu. Le champ event_context inclut les détails de timestamp_proof.
notarization.anchor_submitted Transaction blockchain soumise pour un fournisseur. Déclenché par fournisseur.
notarization.anchored Transaction blockchain confirmée on-chain pour un fournisseur.
notarization.completed Succès terminal : l'horodatage RFC 3161 et l'ancrage blockchain sont tous deux terminés. Le champ event_context inclut completed_at.
notarization.failed Échec terminal : l'horodatage ou l'ancrage blockchain n'a pas pu aboutir. Le champ event_context inclut failure_reason.

Garanties des événements terminaux

notarization.completed et notarization.failed sont terminaux, mutuellement exclusifs et livrés exactement une fois par notarisation. Vous ne recevrez jamais les deux pour une même notarisation, dans un sens comme dans l'autre.

  • completed n'est envoyé qu'une fois l'horodatage et l'ancrage blockchain terminés — jamais après le premier des deux seulement.
  • Une notarisation ancrée par au moins un fournisseur blockchain aboutit à completed, même si d'autres fournisseurs du même profil d'ancrage ont échoué. Le tableau anchors[] détaille le résultat par fournisseur.
  • Si tous les fournisseurs échouent définitivement, la notarisation est signalée failed : elle n'a aucune preuve blockchain.
  • L'ordre de livraison n'est pas garanti. Les événements sont émis dans l'ordre du cycle de vie, mais les livraisons sont des requêtes HTTP indépendantes : ordonnez vos traitements sur le created_at de l'enveloppe, pas sur l'ordre d'arrivée.

Structure du payload

Chaque livraison webhook envoie une enveloppe JSON avec un snapshot complet de la notarisation. L'objet data.notarization est autonome — vous n'avez pas besoin d'appeler GET /v1/notarizations/{id}.

POST (livraison webhook)
{
  "id": "019c0e1a-e7a2-7f3b-8c1d-4a9b2e6f8d3c",
  "type": "notarization.completed",
  "api_version": "2026-09-01",
  "created_at": "2026-01-30T08:53:32Z",
  "organization_id": "019b7a3c-5d2e-7f1a-9b4c-3e8f1a2d5c7b",
  "data": {
    "notarization": {
      "id": "019c0e1a-d891-7f1f-ab6e-5588c46c2a4b",
      "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "algorithm": "SHA256",
      "status": "completed",
      "name": "document.pdf",
      "created_at": "2026-01-30T08:52:46Z",
      "updated_at": "2026-01-30T08:53:32Z",
      "notarized_at": "2026-01-30T08:53:32Z",
      "merkle_root": "a1b2c3d4e5f6...",
      "timestamp_proof": {
        "status": "timestamped",
        "serial_number": "1A2B3C",
        "tsa_provider": {
          "name": "FreeTSA",
          "cert_subject": "CN=FreeTSA,O=Free TSA,C=DE",
          "cert_serial": "04B9A5",
          "cert_ski": "A1B2C3D4E5F6...",
          "policy_oid": "1.2.3.4.1"
        },
        "timestamped_at": "2026-01-30T08:52:48.123456Z",
        "created_at": "2026-01-30T08:52:47.987654Z"
      },
      "blockchain_proofs": [
        {
          "provider_name": "Polygon",
          "status": "anchored",
          "transaction_id": "0xabc123...",
          "explorer_url": "https://polygonscan.com/tx/0xabc123...",
          "submitted_at": "2026-01-30T08:52:50Z",
          "anchored_at": "2026-01-30T08:53:32Z",
          "created_at": "2026-01-30T08:52:47.987654Z"
        }
      ],
      "accumulator": {
        "merkle_root": "a1b2c3d4e5f6..."
      }
    },
    "event_context": {
      "completed_at": "2026-01-30T08:53:32Z"
    }
  }
}

Note : Le champ timestamp_proof.data (le jeton ASN.1 RFC 3161, encodé en base64) n'est inclus que si l'endpoint a activé l'option include_timestamp_token. Le merkle_proof est toujours délivré.

En-têtes HTTP

Chaque requête webhook inclut les en-têtes suivants :

En-tête Valeur
Content-Type application/json
User-Agent Anchorify-Webhooks/1.0
X-Anchorify-Signature t=<unix>,v1=<hex> (HMAC-SHA256)
X-Anchorify-Event-Type Type d'événement
X-Anchorify-Event-ID UUID de l'événement
X-Anchorify-Delivery-ID UUID de la tentative de livraison

Vérification de la signature

Chaque webhook est signé avec HMAC-SHA256 en utilisant le secret de votre endpoint. Le format de l'en-tête de signature est t=<timestamp>,v1=<hex_signature>, calculé sur <timestamp>.<raw_body>. Nous recommandons de vérifier la signature et la fraîcheur du timestamp (tolérance de 5 minutes).

import hmac
import hashlib
import time

def verify_webhook(payload: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    timestamp = parts["t"]
    signature = parts["v1"]

    # Check timestamp freshness (5 min tolerance)
    if abs(time.time() - int(timestamp)) > 300:
        raise ValueError("Timestamp expired")

    expected = hmac.new(
        secret.encode(),
        f"{timestamp}.".encode() + payload,
        hashlib.sha256,
    ).hexdigest()

    return hmac.compare_digest(expected, signature)

Politique de retry

Les livraisons échouées sont relancées avec un backoff exponentiel. Votre endpoint doit répondre avec un statut 2xx dans les 30 secondes.

  • Jusqu'à 5 tentatives par livraison.
  • Backoff exponentiel : min(30s × 2^tentative, 24h) + 0–5s de jitter.
  • 2xx — 2xx — livraison réussie.
  • 429 / 5xx — 429 ou 5xx — relancé avec backoff.
  • 410 — 410 Gone — endpoint immédiatement désactivé.
  • 4xx — Autres 4xx — échec définitif, pas de relance.
  • Les endpoints sont automatiquement désactivés après 10 échecs consécutifs.

Algorithmes de hachage supportés

Algorithmes supportés : SHA-256 (tous les plans), SHA-384 et SHA-512 (Pro et Enterprise). Le hash doit être fourni sous forme de chaîne encodée en hexadécimal.

API asynchrone

L'API est asynchrone. Soumettez votre hash et interrogez le statut, ou utilisez les webhooks (Pro) pour les notifications.

Documents de preuve signés

Les plans Pro et Enterprise peuvent exporter des documents de preuve signés contenant toutes les preuves cryptographiques. Pro

Horodatages qualifiés

Les plans Pro et Enterprise peuvent ajouter des horodatages qualifiés eIDAS pour une valeur juridique renforcée. Enterprise