# Headers

## Request

| Header | Required | Purpose |
|---|---|---|
| `Authorization` | yes | `Bearer sb_…` or OAuth JWT |
| `Content-Type` | for JSON bodies | `application/json` |
| `Idempotency-Key` | side-effect / hub-idempotent ops | Stable key; reused across cell failover |
| `SB-Feature` | no | Product/feature attribution (`onboarding`, `spine`, …) |
| `SB-Customer` | no | Customer namespace for BYOK / spend (`atlas-crm:cus_2210`) |
| `SB-Region` | no | Preferred region — no silent cross-region fallback |
| `SB-Lane` | no | `batch` selects preemptible lane |
| `SB-Model` | no | Optional model hint on some proxy paths |

## Response (streams / OpenAI-compat)

| Header | Meaning |
|---|---|
| `SB-Schema` | Envelope schema version (`v1`) |
| `SB-Request-Id` | Correlation id |
| `SB-Outcome` | `sent` / `failed` / … |
| `SB-Cache` | `hit` / `miss` / `bypass` |
| `SB-Stream` | `1` when streaming |
| `SB-Provider` | Provider account when known |
| `SB-Idempotent-Replay` | `1` when hub returned a cached idempotent result |

JSON envelope responses also put these facts inside `meta`.
