Sovereign
api client · ssp 1.0

L’API client.

L’API d’intégration des systèmes clients en amont. Ouvrez un dossier avec vos événements de cycle de vie signés côté client, suivez-le jusqu’au scellement, puis vérifiez l’enregistrement sur un endpoint public. Chaque événement client est vérifié à la réception — empreinte canonique et signature ed25519 — puis rattaché au dossier comme précédent.

auth: x-api-key header · authorization: bearer·openapi 3.0
01 / endpoints

Six endpoints. Trois authentifiés, trois publics.

POST /client/cases Ouvre un dossier. Transmettez l’artefact, le contexte métier et les événements amont signés côté client ; en cas de succès, le dossier apparaît dans la file de l’approbateur. Le champ due_at est obligatoire — chaque dossier porte un délai d’approbation explicite.
GET /client/cases/{id} Statut du dossier : pending, avec l’avancement du quorum ; sealed, avec ledger_uuid, l’issue et verify_url ; ou cancelled, lorsque le dossier a expiré.
POST /client/outcome Consigne ce que le système client a fait de la décision scellée — un événement outcome.executed signé côté client et rattaché à l’enregistrement : l’auditeur voit non seulement ce qui a été approuvé, mais aussi ce qui a été exécuté.
GET /verify/{uuid} Public. L’enregistrement décodé et le résultat de chaque contrôle cryptographique — empreinte du claim, signature utilisateur webauthn, signature de confiance ed25519, set / inclusion / checkpoint rekor, horodatage rfc 3161.
GET /verify/{uuid}/attestation Public. L’attestation sans données personnelles (.sspa) : enregistrement, ancrages, jeton rfc 3161 et tsa ca dans une seule archive zip. Vérifiable hors ligne.
GET /trust-key La clé publique de confiance ed25519 (pem). Remettez-la au vérificateur par un canal séparé, comme racine de confiance — une archive n’embarque jamais sa propre clé de confiance.
02 / ouvrir un dossier

Une requête ouvre le dossier. La réponse en nomme les précédents.

POST /client/cases
{
  "domain": "finance",
  "topic": "Vendor wire",
  "party": "ACME Supplies",
  "due_at": "2026-12-31T17:00:00Z",
  "artifact_b64": "UGF5IEFDTUUgMTIsNzUwIFVTRA==",
  "context": {
    "transaction_id": "TXN-1",
    "amount_usd": 12750,
    "account_id": "ACC-1"
  },
  "quorum": {
    "dsl": "Senior Credit Officer*2, Compliance",
    "mode": "parallelRoles",
    "workflow": { "type": "ratify" }
  },
  "client_events": [
    {
      "claim": { "type": "ai.inference.completed", "tenant": { "id": "acme-bank" } },
      "claim_canonical_hash": { "alg": "sha256", "value": "0c0aefa439f0..." },
      "signature": { "alg": "ed25519", "value": "MEUCIQ...", "public_key": "q1WrCN..." }
    }
  ]
}
201 created
{
  "submission_id": "d3057aae793ecc4e...",
  "tenant": "acme-bank",
  "precedents": [
    { "type": "policy.committed",       "hash": "94b54bd4f73d..." },
    { "type": "ai.inference.completed", "hash": "0c0aefa439f0..." },
    { "type": "guardrail.evaluated",    "hash": "8b3345c3c9e1..." }
  ],
  "quorum": { "required": 3, "collected": 0 },
  "approver_url": "https://app.sovereign.example/approver",
  "status_url": "/client/cases/d3057aae793ecc4e..."
}
03 / politiques d’approbation

Un approbateur par défaut. Un quorum quand la politique l’exige.

La composition tient en une ligne de dsl — des rôles avec leur effectif, ou des utilisateurs nommés. Le processus est ratify (cosigner une même décision) ou independent (voter, ou opposer un veto). Le nombre de signatures requises découle des sièges définis : aucun seuil à mal configurer. Omettez quorum pour un approbateur unique.

Un webhook enregistré à la création du dossier se déclenche une seule fois, au scellement de la décision. Vous en rédigez la charge utile ; la livraison est retentée trois fois et le nombre de tentatives figure dans le statut du dossier.

quorum
{
  "dsl": "Senior Credit Officer*2, Compliance",
  "mode": "parallelRoles",
  "workflow": { "type": "ratify" },
  "sla": {
    "approval_duration": "PT24H",
    "expire_by": "2026-07-01T00:00:00Z"
  }
}

// named users instead of roles:
// "dsl": "@jdoe, @bofficer"
// independent vote / veto:
// "workflow": { "type": "independent", "approval_mode": "vote" }
04 / vérification

L’endpoint de vérification renvoie chaque contrôle, pas un verdict.

Un booléen par contrôle, calculé sur l’enregistrement décodé. L’endpoint est public ; le contexte métier brut n’est communiqué qu’aux réviseurs internes authentifiés. Pour une vérification qui ne fait confiance à aucun serveur, téléchargez l’attestation et utilisez le vérificateur hors ligne des SDK.

GET /verify/{uuid}
{
  "status": "verified",
  "ledger_uuid": "0000000075bcd156...",
  "user_signature_valid": true,
  "trust_signature_valid": true,
  "quorum": { "required": 3, "collected": 3, "met": true },
  "rekor_set_valid": true,
  "rekor_inclusion_valid": true,
  "rekor_checkpoint_valid": true,
  "tsa_valid": true,
  "tsa_time": "2026-06-15T11:02:44Z"
}