[Deterministische Mock-Konnektoren, kein ausgehender Live-Traffic]

Sandbox-Umgebung

Testen Sie Integrationen gegen deterministische Mock-Konnektoren ohne ausgehenden Live-Partner-Traffic. Stellen Sie auf `auth.knogin.com` einen Sandbox-Token (`aud=sandbox`) aus, rufen Sie dieselbe v2026.4-Oberfläche auf `https://sandbox-api.knogin.com` auf und erhalten Sie bei jedem Replay desselben Payloads byteweise identische Antworten.

Sandbox-Umgebung

Erste Schritte

Der Sandbox-Zugang läuft über den Standard-Flow für Plattform-Admins. Mit dem Scope `argus:platform:admin` auf einem Bearer-Token rufen Sie `POST /v1/platform/apps/{client_id}/sandbox-token` auf, um ein Sandbox-JWT für die App auszustellen, die Sie verdrahten. Die Antwort liefert den Sandbox-Host (`https://sandbox-api.knogin.com`) und die an den Token gepinnten Scenarios. Richten Sie Ihr bestehendes Partner-SDK auf den Sandbox-Host aus, tauschen Sie den Live-Token gegen den Sandbox-Token und die gesamte v2026.4-Oberfläche wird transparent zu deterministischen Mocks geleitet.

Token-Ausstellung

`POST /v1/platform/apps/{client_id}/sandbox-token` akzeptiert ein optionales `scenarios`-Array (pinnt die Sandbox auf bestimmte Daten, z. B. `["wallet.high-risk", "entity.sanctioned"]`) und ein optionales `ttl_seconds` (auf den inklusiven Bereich [60, 86400] geklemmt; Werte außerhalb werden vor dem Signieren normalisiert). Die Antwort enthält den signierten Sandbox-Token, sein `expires_at`, `audience: "sandbox"`, das in den Token eingebettete Scope-Set, den Sandbox-Host und die gepinnten Scenarios. Der Sandbox-Token verwendet denselben RS256-Schlüsselsatz von auth_service; der `kid`-Header zeigt auf dasselbe JWKS wie `/oauth/token`, sodass Partner-SDKs Sandbox-Tokens out of the box validieren.

Scenario-Katalog

Fünf Scenarios werden im ersten Release ausgeliefert. Pinnen Sie eines oder mehrere im Feld `scenarios` zur Token-Ausstellungszeit, damit die Sandbox bei jedem Replay dieselben Daten zurückgibt; lassen Sie das Feld weg für die gemischte Standard-Rotation.

Doppeltes Tor

Argus erzwingt No-Leak in beide Richtungen. Der Sandbox-Host (`sandbox-api.knogin.com`) lehnt Live-Tokens ab: die Routing-Middleware prüft den JWT-Claim `aud` und antwortet mit 403, wenn `aud != "sandbox"`. Live-Konnektoren lehnen Sandbox-Tokens ab: jede Live-Factory `<provider>_client.py` prüft `request.state.sandbox` und wirft 403, wenn die Anfrage im Sandbox-Scope liegt. Tests decken beide Richtungen ab, sodass ein Live-Token nicht versehentlich Mock-Daten lesen und ein Sandbox-Token nicht in Live-Partnersysteme gelangen kann.

Determinismus

Sandbox-Antworten sind deterministisch. Derselbe Payload, zweimal mit denselben gepinnten Scenarios abgesetzt, liefert eine byteweise identische Antwort. Das ist Absicht: Partner-CI-Pipelines können Sandbox-Antworten als Snapshot ablegen und bei jedem Build ohne Retry-Flakiness dagegen asserten. Sandbox-Antworten tragen zusätzlich `X-Argus-Sandbox: true`, damit Partner-Debug-Tools auf einen Blick sehen, dass die Antwort synthetisch ist, behalten aber den Standard-`X-Argus-Trace-ID` aus G2 für die End-to-End-Korrelation mit Ihren eigenen Logs.

Abrechnung und Kontingent

Sandbox-Aufrufe verbrauchen kein Live-Partner-Konnektorkontingent und sind nicht abrechenbar. Sie berühren niemals echte OSINT- oder Finanzanbieter, treffen nie sensible Datensätze und gehen nie in die Rate-Limit-Budgets ein, die Sie für die Produktion ausgehandelt haben. Audit-Einträge aus Sandbox-Verkehr werden mit `secrecy_level=sandbox` getaggt, sodass Operatoren Sandbox-Verkehr aus Compliance-Reports filtern können. Nutzen Sie die Sandbox großzügig für Integrationstests, Partner-Onboarding-Proben, Demo-Aufnahmen und explorative CI; Produktionsbudgets bleiben unangetastet.

Migration zur Produktion

Wenn Ihre Integration bereit ist, tauschen Sie die Basis-URL von `https://sandbox-api.knogin.com` zurück auf `https://api.knogin.com` und stellen Sie über den Standard-Flow `POST /v1/oauth/token` mit Ihren Produktionsscopes erneut einen Live-Token aus. Wire-Form, Header, Statuscodes und Trace-Propagation sind zwischen Sandbox und Live identisch, sodass ein in der Sandbox validierter Client keine Verhaltensänderung benötigt. Der einzige Unterschied zur Laufzeit ist der JWT-Claim `aud` und der Host, auf den Sie zeigen.

Scenario-Katalog

Scenario-IDBezeichnungBeschreibung
wallet.high-riskWallet mit hohem RisikoLiefert Anreicherungen, die Sanktions-Treffer, Mixer-Interaktion und großvolumige Schnellüberweisungen anzeigen.
wallet.cleanSaubere WalletLiefert Anreicherungen, die niedriges Risiko und keine Sanktions-Treffer anzeigen.
entity.sanctionedSanktionierte EntitätLiefert OSINT-Anreicherungen mit Treffern auf OFAC-, UN- und EU-Sanktionslisten.
incident.escalatingEskalierender VorfallLiefert Dispatch- und ePCR-Signale, die mit einer sich verschlechternden Lage übereinstimmen.
device.offlineOffline-MedizingerätLiefert Telemetrie mit einem Last-Seen vor N Stunden und veraltetem Batteriezustand.

Sandbox-Token ausstellen

# Mint a sandbox token (requires argus:platform:admin)
curl -X POST https://auth.knogin.com/v1/platform/apps/app_123/sandbox-token \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "scenarios": ["wallet.high-risk", "entity.sanctioned"],
    "ttl_seconds": 3600
  }'

# 200 OK
# {
#   "token": "<sandbox-jwt>",
#   "expires_at": "2026-05-08T13:00:00Z",
#   "audience": "sandbox",
#   "scopes": [
#     "argus:profiles:read",
#     "argus:profiles:write",
#     "argus:jobs:read",
#     "argus:jobs:write"
#   ],
#   "sandbox_host": "https://sandbox-api.knogin.com",
#   "scenarios": ["wallet.high-risk", "entity.sanctioned"]
# }

Sandbox-Scenarios auflisten

# Discover the scenario catalogue (sandbox host only)
curl https://sandbox-api.knogin.com/v1/sandbox/scenarios \
  -H "Authorization: Bearer $SANDBOX_TOKEN"

# 200 OK
# {
#   "scenarios": [
#     { "id": "wallet.high-risk", "label": "High-risk wallet", "description": "..." },
#     { "id": "wallet.clean", "label": "Clean wallet", "description": "..." },
#     { "id": "entity.sanctioned", "label": "Sanctioned entity", "description": "..." },
#     { "id": "incident.escalating", "label": "Escalating incident", "description": "..." },
#     { "id": "device.offline", "label": "Offline medical device", "description": "..." }
#   ]
# }

# A live token against the sandbox host fails closed:
# HTTP/1.1 403 Forbidden
# X-Argus-Sandbox-Reason: live-token-on-sandbox-host

Sandbox-Oberfläche aufrufen

# Same v2026.4 surface, sandbox host, sandbox token.
# Two replays of the same payload return a byte-equal response.
curl -X POST https://sandbox-api.knogin.com/v1/jobs \
  -H "Authorization: Bearer $SANDBOX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "intelligence.enrich.bulk",
    "payload": { "profile_ids": ["p1", "p2"] }
  }'

# Response carries:
#   X-Argus-Sandbox: true
#   X-Argus-Trace-ID: <32-hex>   (G2 trace propagation, unchanged)

# When ready for production, swap the base URL and re-mint a live token:
curl -X POST https://auth.knogin.com/v1/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=app_123&client_secret=<secret>&scope=argus:jobs:write"

curl -X POST https://api.knogin.com/v1/jobs \
  -H "Authorization: Bearer $LIVE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "kind": "intelligence.enrich.bulk", "payload": { "profile_ids": ["p1"] } }'

Bereit, Ihre Integration über die Sandbox zu verdrahten?

Öffnen Sie die API-Referenz für den öffentlichen Vertrag oder sprechen Sie mit Knogin, wenn Sie eine maßgeschneiderte Scenario-Fixture für Ihren Partner-Workflow benötigen.