Sovereign
client api · ssp 1.0

Die Client-API.

Die Integrations-API für vorgelagerte Client-Systeme. Sie eröffnen einen Fall mit client-signierten Lebenszyklus-Ereignissen, verfolgen ihn bis zur Versiegelung und prüfen die Aufzeichnung über einen öffentlichen Endpunkt. Jedes Client-Ereignis wird beim Eingang geprüft — kanonischer Hashwert und ed25519-Signatur — und als Präzedenzfall verknüpft.

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

Sechs Endpunkte. Drei authentifiziert, drei öffentlich.

POST /client/cases Eröffnet einen Fall. Übermittelt werden das Artefakt, der Fachkontext und die client-signierten vorgelagerten Ereignisse; bei Erfolg erscheint der Fall in der Warteschlange der Genehmiger. due_at ist Pflicht — jeder Fall trägt ein explizites Freigabe-SLA.
GET /client/cases/{id} Der Fallstatus: pending mit Quorum-Fortschritt, sealed mit ledger_uuid, Ergebnis und verify_url, oder cancelled, wenn der Fall abgelaufen ist.
POST /client/outcome Hält fest, was das Client-System mit der versiegelten Entscheidung getan hat — ein client-signiertes outcome.executed-Ereignis, mit der Aufzeichnung verknüpft. Der Auditor sieht so nicht nur, was freigegeben, sondern auch, was ausgeführt wurde.
GET /verify/{uuid} Öffentlich. Die decodierte Aufzeichnung und das Ergebnis jeder kryptografischen Prüfung — Claim-Hashwert, webauthn-Nutzersignatur, ed25519-Vertrauenssignatur, rekor set / inclusion / checkpoint, rfc 3161-Zeitstempel.
GET /verify/{uuid}/attestation Öffentlich. Die Attestierung ohne Personendaten (.sspa): Aufzeichnung, Anker, rfc 3161-Token und tsa-ca in einem Zip. Offline prüfbar.
GET /trust-key Der öffentliche ed25519-Vertrauensschlüssel (pem). Übergeben Sie ihn dem Prüfwerkzeug auf separatem Weg als Vertrauensanker — ein Bündel trägt seinen Vertrauensschlüssel nie selbst.
02 / fall eröffnen

Ein Aufruf eröffnet den Fall. Die Antwort nennt seine Präzedenzien.

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 / freigaberichtlinien

Standardmässig eine freigebende Person. Ein Quorum, wo die Richtlinie es verlangt.

Die Zusammensetzung ist eine einzeilige DSL — Rollen mit Anzahl oder namentlich benannte Personen. Der Ablauf ist ratify (eine Entscheidung gemeinsam signieren) oder independent (Stimme oder Veto). Die erforderliche Zahl ergibt sich aus den Slots; es gibt keinen Schwellenwert, der sich falsch konfigurieren liesse. Für eine einzelne freigebende Person lassen Sie quorum einfach weg.

Ein bei der Fallanlage registrierter Webhook wird genau einmal ausgelöst — beim Versiegeln der Entscheidung. Die Payload gestalten Sie selbst; die Zustellung wird dreimal wiederholt, und die Zahl der Versuche erscheint im Fallstatus.

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 / prüfung

Der Verify-Endpunkt liefert jede Prüfung, kein Urteil.

Ein Boolean pro Prüfung, über der decodierten Aufzeichnung. Der Endpunkt ist öffentlich; der rohe Fachkontext bleibt authentifizierten internen Prüfern vorbehalten. Wer keinem Server vertrauen will, lädt die Attestierung herunter und nutzt den Offline-Prüfer in den SDKs.

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