[Deterministische mock-connectoren, geen live partner-egress]

Sandbox-omgeving

Test integraties tegen deterministische mock-connectoren zonder live partner-egress. Sla op `auth.knogin.com` een sandbox-token uit (`aud=sandbox`), roep dezelfde v2026.4-surface aan tegen `https://sandbox-api.knogin.com` en ontvang bij elke replay van dezelfde payload byte-voor-byte identieke responses.

Sandbox-omgeving

Aan de slag

Sandbox-toegang loopt via de standaard platform-admin-flow. Met het scope `argus:platform:admin` op een bearer token roep je `POST /v1/platform/apps/{client_id}/sandbox-token` aan om een sandbox-JWT uit te slaan voor de app die je aansluit. De respons bevat de sandbox-host (`https://sandbox-api.knogin.com`) en de aan het token vastgepinde scenarios. Wijs je bestaande partner-SDK naar de sandbox-host, vervang het live token door het sandbox-token en de hele v2026.4-surface wordt transparant naar deterministische mocks geleid.

Token-uitgifte

`POST /v1/platform/apps/{client_id}/sandbox-token` accepteert een optioneel `scenarios`-array (pin de sandbox vast op specifieke voorbereide data, bijv. `["wallet.high-risk", "entity.sanctioned"]`) en een optionele `ttl_seconds` (geklemd op het inclusieve bereik [60, 86400]; waarden buiten bereik worden vóór ondertekening genormaliseerd). De respons bevat het ondertekende sandbox-token, zijn `expires_at`, `audience: "sandbox"`, de in het token gebakken scope-set, de sandbox-host en de vastgepinde scenarios. Het sandbox-token hergebruikt de bestaande RS256-sleutelset van auth_service; de `kid`-header verwijst naar dezelfde JWKS als `/oauth/token`, zodat partner-SDKs sandbox-tokens out of the box valideren.

Scenario-catalogus

Vijf scenarios verschijnen in de eerste release. Pin er één of meer vast in het veld `scenarios` bij token-uitgifte zodat de sandbox bij elke replay dezelfde voorbereide data teruggeeft; laat het veld weg voor de standaard gemengde rotatie.

Dubbele poort

Argus dwingt no-leak in beide richtingen af. De sandbox-host (`sandbox-api.knogin.com`) weigert live tokens: de routing-middleware controleert de JWT-claim `aud` en wijst af met 403 wanneer `aud != "sandbox"`. Live connectoren weigeren sandbox-tokens: elke live `<provider>_client.py`-factory controleert `request.state.sandbox` en gooit 403 als het verzoek in sandbox-scope is. Tests dekken beide richtingen, zodat een live token niet per ongeluk mock-data kan lezen en een sandbox-token niet bij live partner-systemen kan komen.

Determinisme

Sandbox-responses zijn deterministisch. Dezelfde payload, tweemaal afgevuurd met dezelfde vastgepinde scenarios, geeft een byte-voor-byte identieke respons. Dat is bewust: partner-CI-pipelines kunnen sandbox-responses als snapshot vastleggen en er bij elke build tegenaan asserteren zonder retry-flake. Sandbox-responses dragen daarnaast `X-Argus-Sandbox: true` zodat partner-debugtools in één oogopslag zien dat de respons synthetisch is, en zetten tegelijk de standaard `X-Argus-Trace-ID` uit G2 voor end-to-end-correlatie met je eigen logs.

Facturatie en quota

Sandbox-calls verbruiken je live partner-connector-quota niet en zijn niet factureerbaar. Ze raken nooit echte OSINT- of finance-providers, raken nooit gevoelige datasets en gaan nooit ten koste van de rate-limit-budgetten die je voor productie hebt onderhandeld. Audit-entries van sandbox-verkeer krijgen het label `secrecy_level=sandbox` zodat operators sandbox-verkeer uit compliance-rapporten kunnen filteren. Gebruik de sandbox royaal voor integratietests, partner-onboarding-repetities, demo-opnames en exploratieve CI; productiebudgetten blijven intact.

Migratie naar productie

Wanneer je integratie klaar is, wissel je de base URL van `https://sandbox-api.knogin.com` terug naar `https://api.knogin.com` en sla je via de standaard `POST /v1/oauth/token`-flow opnieuw een live token uit met je productiescopes. Wire-vorm, headers, statuscodes en trace-propagatie zijn identiek tussen sandbox en live, dus een in de sandbox gevalideerde client heeft geen gedragswijziging nodig. Het enige verschil bij runtime is de JWT-claim `aud` en de host waar je naar wijst.

Scenario-catalogus

Scenario-IDLabelBeschrijving
wallet.high-riskWallet met hoog risicoGeeft verrijking terug die wijst op sanctie-hits, mixer-interactie en hoogvolume snelle overboekingen.
wallet.cleanSchone walletGeeft verrijking terug die wijst op laag-risicogedrag en geen sanctie-hits.
entity.sanctionedGesanctioneerde entiteitGeeft OSINT-verrijking terug met treffers op OFAC-, UN- en EU-sanctielijsten.
incident.escalatingEscalerend incidentGeeft dispatch- en ePCR-signalen terug die passen bij een verslechterende situatie.
device.offlineOffline medisch apparaatGeeft telemetrie terug die last-seen N uur geleden en een verouderde batterijstatus aangeeft.

Een sandbox-token uitslaan

# 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 opvragen

# 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

De sandbox-surface aanroepen

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

Klaar om je integratie via de sandbox aan te sluiten?

Open de API-referentie voor het publieke contract of neem contact op met Knogin als je een maatwerk-scenario fixture nodig hebt voor je partner-workflow.