# Llaves y entornos

Toda llamada lleva la cabecera:

```
x-switch-key: <tu-comercio>:<llave>
```

## Dos tipos de llave

| Llave | Empieza con | Qué hace |
|---|---|---|
| Prueba | `sk_test_` | Simula todo de punta a punta. **Nunca mueve dinero** |
| Producción | `sk_live_` | Cobra de verdad |

**El modo lo decide la llave, no tu código.** No hay ningún campo `test=true`: la misma petición con `sk_test_` es de prueba y con `sk_live_` es real. Un cobro creado en prueba queda de prueba para siempre, aunque lo abra alguien de verdad.

**Cada llave sólo ve y toca lo de su modo.** Con `sk_test_` no se consulta, lista, edita ni cancela nada creado con `sk_live_` (enlaces, lotes, órdenes, suscripciones, productos, propinas y equipo): responde `404` como si no existiera. Y una `idempotency_key` usada en prueba no se cruza con producción.

**Hay dos cosas del comercio que no tienen modo y por eso exigen `sk_live_`:** los webhooks (`POST`, `PATCH` y `DELETE /switch/v1/webhooks`, porque reciben también los avisos de producción) y la configuración de tus Flows de WhatsApp (`POST /switch/v1/flow/config`, `PUT /switch/v1/flows/definicion`). Con `sk_test_` responden `403` con `{ "error": "requiere_llave_live" }`; listar y ver webhooks sí funciona con cualquier llave. Si aún no tienes llave de producción, registra tu URL desde el portal (Integraciones › Webhooks).

## Dónde se sacan

En tu portal, **Integraciones › Llaves de API**:

- La de prueba la creas cuando quieras.
- La de producción se activa cuando tu cuenta está aprobada.
- La llave se muestra **una sola vez**. Si la pierdes, revócala y crea otra.
- Puedes tener varias (una por sistema) y revocar cada una por separado: lo que use una llave revocada recibe `401` de inmediato.
- Por API (`POST /switch/v1/api-keys` y `POST /switch/v1/api-keys/:id/revoke`), **una llave de prueba sólo crea y revoca llaves de prueba**. Para crear o revocar una de producción, llama con una `sk_live_`; con una `sk_test_` responde `403` con `{ "error": "requiere_llave_live" }`.
- El `label` de una llave nueva (1 a 120 caracteres) es libre, salvo que no puede empezar por `service-key:` ni `partner:` (son de uso interno): responde `400` con `{ "error": "label_reservado" }`.

## Dónde se guardan

> **Sólo en tu servidor**, en una variable de entorno o un gestor de secretos. Nunca en el código del navegador, en una app móvil ni en un repositorio.

## URL base

| | URL |
|---|---|
| API | `https://pay.pagaconquickpay.com/switch/v1` |
| Página de pago | `https://pay.pagaconquickpay.com/l/<id>` |

Es la misma para prueba y producción: cambia sólo la llave.
