> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getovra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Sandbox

> Was simuliert ist, was real ist und wie du erkennst in welchem API-Mode du bist.

Sandbox ist der einzige Modus der in v1.2 existiert. Jeder Ovra-Kunde wird auf Sign-up auto-provisioniert in Sandbox — kein KYC, kein SEPA, kein echtes Geld. Live-Mode (echtes Banking-Partner-Onboarding, echtes KYC, echtes Settlement) ist auf der v1.3+-Roadmap, post-Raise.

<Warning>
  Keinen Production-Traffic gegen Sandbox bauen. Die IBAN-Sequence ist deterministisch, Balances sind simuliert, Webhook-Events feuern instant ohne echte Card-Network-Roundtrips. Sandbox ist nur für Development und Demos.
</Warning>

## API-Key-Präfixe

| Präfix         | Mode                                 | Quelle                         |
| -------------- | ------------------------------------ | ------------------------------ |
| `sk_sandbox_*` | Sandbox                              | Auto-provisioniert auf Sign-up |
| `sk_test_*`    | Sandbox                              | Manuell via `POST /keys`       |
| `sk_live_*`    | Live                                 | Nur v1.3+                      |
| `at_*`         | Sandbox oder Live (spiegelt Creator) | Per-Agent-Token                |
| `at_dlg_*`     | Sandbox oder Live (spiegelt Creator) | Delegation-redeemed Token      |

Jede Response trägt `X-Ovra-Mode: test` oder `X-Ovra-Mode: live` derived vom Token-Präfix. In CI inspizieren um Live-Tests gegen Sandbox-Keys (oder umgekehrt) zu verweigern.

## Was real ist in Sandbox

* Hono-API, jeder Endpoint, jeder Error-Code
* Policy-Engine + Risk-Engine-Auswertungen (echte Signale, echte Decisions)
* Webhook-Delivery, Signing, Retries
* Audit-Log-Writes (append-only, PG RULES enforced)
* Idempotency-Key-Verhalten
* Rate-Limits
* Card-Encryption (AES-256-GCM at rest)
* Multi-Card pro Agent, Freeze/Rotate/Close

## Was simuliert ist in Sandbox

* IBAN-Issuance (deterministisch `DE89370400440{N}`)
* Wallet-Balance-Funding (`POST /fund` mit `simulate: true`)
* Card-Authorization + Settlement (kein echtes Card-Network)
* SEPA-Out (kein echter SEPA-Provider)
* SEPA-In (keine Inbound-Reconciliation)
* KYC (`kycStatus: sandbox` skipt IDNOW)

## Testkarten

Für Banking-Partner-Rail Sandbox-Flows:

| Karte              | Nummer                | Verhalten             |
| ------------------ | --------------------- | --------------------- |
| Erfolg             | `4242 4242 4242 4242` | Genehmigt             |
| Decline            | `4000 0000 0000 0002` | Generic Decline       |
| Insufficient Funds | `4000 0000 0000 9995` | Unzureichende Balance |

Default-Test-Expiry `12/28`, CVV `123`.

## Auto-Provisioning-Flow

<Steps>
  <Step title="Clerk-Webhook feuert">
    `organization.created` kommt rein.
  </Step>

  <Step title="Atomic Provisioning">
    Eine einzige Transaktion:

    * Zieht nächsten Index aus `sandbox_test_counter`
    * Erstellt `customers`-Row mit `kycStatus: sandbox`, `companyName: "Sandbox Test #N"`
    * Provisioniert deterministische Banking-Partner-Identity (`iban DE89370400440{N}`)
    * Hashed und speichert `sk_sandbox_*` Key
    * Erstellt Billing-Account (Free-Tier)
    * Schreibt Default-Policy
    * Markiert `provisioning_jobs` `provisioned`
  </Step>

  <Step title="Welcome-Page polled">
    `/dashboard/welcome` polled alle 250ms (max 2s) für den Provisioning-Job.
  </Step>

  <Step title="Reveal-Modal">
    Sobald provisioniert zeigt das Dashboard deinen `sk_sandbox_*` Key plus einen vorgefüllten `mcp.json`-Snippet. **One-Shot-Reveal — jetzt kopieren.**
  </Step>
</Steps>

## Live gehen (v1.3+ — noch nicht verfügbar)

Wenn Live-Mode öffnet, wird der Pfad sein:

1. KYC abschließen via **Dashboard → Go Live** (IDNOW oder Partner-native).
2. `kycStatus` flippt `pending → submitted → verified`.
3. Echtes Banking-Partner-Onboarding via `partner.createLead()`.
4. Echte Funding-IBAN ausgegeben.
5. `sk_live_*` Keys erstellen.

## Sandbox-Indikator

Das Dashboard zeigt jederzeit eine kleine **Sandbox**-Pill in der Sidebar. Es gibt absichtlich kein page-wide Banner — die Pill ist die kanonische Platzierung.

## Weiter

<CardGroup cols={2}>
  <Card title="Funding" icon="piggy-bank" href="/de/concepts/funding">
    Wie simulierte Balance hinzufügen.
  </Card>

  <Card title="Compliance" icon="scale-balanced" href="/de/concepts/compliance">
    Warum Live erst post-Raise unlocked.
  </Card>

  <Card title="Quickstart" icon="play" href="/de/quickstart">
    Fünf-Minuten-Sandbox-Walkthrough.
  </Card>
</CardGroup>
