[Deterministyczne mock-konektory, brak ruchu wychodzącego live]

Środowisko sandbox

Testuj integracje z deterministycznymi mock-konektorami bez ruchu wychodzącego do live partnera. Wystaw token sandbox (`aud=sandbox`) na `auth.knogin.com`, wywołuj tę samą powierzchnię v2026.4 wobec `https://sandbox-api.knogin.com` i otrzymuj odpowiedzi identyczne bajt po bajcie przy każdym replay tego samego payload.

Środowisko sandbox

Pierwsze kroki

Dostęp do sandboxa odbywa się przez standardowy flow admina platformy. Mając scope `argus:platform:admin` na bearer tokenie, wywołaj `POST /v1/platform/apps/{client_id}/sandbox-token`, aby wystawić sandbox-JWT dla aplikacji, którą podłączasz. Odpowiedź zawiera host sandboxa (`https://sandbox-api.knogin.com`) i listę scenarios przypiętych do tokena. Skieruj swój istniejący partnerski SDK na host sandboxa, podmień token live na sandbox i cała powierzchnia v2026.4 zostanie przezroczyście skierowana do deterministycznych mocków.

Wystawianie tokenów

`POST /v1/platform/apps/{client_id}/sandbox-token` przyjmuje opcjonalną tablicę `scenarios` (przypina sandbox do konkretnych przygotowanych danych, np. `["wallet.high-risk", "entity.sanctioned"]`) i opcjonalny `ttl_seconds` (ograniczony do inkluzywnego zakresu [60, 86400]; wartości spoza zakresu są normalizowane przed podpisem). Odpowiedź zawiera podpisany token sandbox, jego `expires_at`, `audience: "sandbox"`, zestaw scope wpisany w token, host sandboxa i przypięte scenarios. Token sandbox używa istniejącego zestawu kluczy RS256 z auth_service; nagłówek `kid` wskazuje na ten sam JWKS, którego używa `/oauth/token`, więc partnerskie SDK walidują tokeny sandbox bez zmian.

Katalog scenarios

Pięć scenarios trafia do pierwszego wydania. Przypnij jeden lub kilka w polu `scenarios` przy wystawianiu tokena, aby sandbox zwracał te same przygotowane dane przy każdym replay; pomiń pole, aby otrzymać domyślną mieszaną rotację.

Podwójna bramka

Argus wymusza no-leak w obu kierunkach. Host sandboxa (`sandbox-api.knogin.com`) odrzuca tokeny live: middleware routingu sprawdza claim `aud` JWT i odrzuca z 403, gdy `aud != "sandbox"`. Konektory live odrzucają tokeny sandbox: każda fabryka `<provider>_client.py` live sprawdza `request.state.sandbox` i rzuca 403, jeśli żądanie jest w scope sandbox. Testy pokrywają oba kierunki, więc token live nie może przypadkiem czytać danych mock, a token sandbox nie może dosięgnąć systemów live partnera.

Determinizm

Odpowiedzi sandboxa są deterministyczne. Ten sam payload, wysłany dwa razy z tymi samymi przypiętymi scenarios, zwraca odpowiedź identyczną bajt po bajcie. To celowe: partnerskie pipeliny CI mogą snapshotować odpowiedzi sandbox i asercjować na nich w każdym buildzie bez retry-flake. Odpowiedzi sandbox dodatkowo niosą `X-Argus-Sandbox: true`, dzięki czemu narzędzia debug partnera widzą od razu, że odpowiedź jest syntetyczna, zachowując standardowy `X-Argus-Trace-ID` z G2 dla korelacji end-to-end z twoimi logami.

Rozliczenia i kontyngent

Wywołania sandboxa nie konsumują twojego live kontyngentu konektorów partnerskich i nie są fakturowane. Nigdy nie dotykają realnych dostawców OSINT ani finance, nigdy nie sięgają wrażliwych zbiorów danych i nigdy nie wchodzą w budżety rate-limit wynegocjowane dla produkcji. Wpisy audytu z ruchu sandbox są tagowane `secrecy_level=sandbox`, więc operatorzy mogą filtrować ruch sandbox z raportów zgodności. Korzystaj z sandboxa swobodnie do testów integracji, prób onboardingu partnera, nagrań demo i eksploracyjnego CI; budżety produkcyjne pozostają nietknięte.

Migracja do produkcji

Gdy twoja integracja jest gotowa, podmień base URL z `https://sandbox-api.knogin.com` z powrotem na `https://api.knogin.com` i ponownie wystaw token live przez standardowy flow `POST /v1/oauth/token` ze swoimi scope produkcyjnymi. Kształt wire, nagłówki, kody statusu i propagacja trace są identyczne między sandboxem a live, więc klient zwalidowany w sandboxie nie potrzebuje zmian behawioralnych. Jedyną różnicą w runtime jest claim `aud` JWT oraz host, na który wskazujesz.

Katalog scenarios

ID scenarioEtykietaOpis
wallet.high-riskWallet wysokiego ryzykaZwraca wzbogacenia wskazujące na trafienia w sankcje, interakcję z mixerem i wysokowolumenowe szybkie przelewy.
wallet.cleanCzysta walletZwraca wzbogacenia wskazujące na aktywność niskiego ryzyka i brak trafień w sankcje.
entity.sanctionedSankcjonowana encjaZwraca wzbogacenia OSINT z trafieniami na listach OFAC, UN i UE.
incident.escalatingEskalujący incydentZwraca sygnały dispatch i ePCR spójne z pogarszającą się sytuacją.
device.offlineOffline urządzenie medyczneZwraca telemetrię wskazującą last-seen N godzin temu z nieaktualnym stanem baterii.

Wystawić token sandbox

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

Wylistować scenarios sandbox

# 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

Wywołać powierzchnię sandbox

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

Gotowy podpiąć integrację przez sandbox?

Otwórz referencję API dla publicznego kontraktu lub skontaktuj się z Knogin, jeśli potrzebujesz niestandardowego fixture scenario dla swojego flow partnerskiego.