# Llaves y entornos

> Cómo autenticar contra la API de Lane con llaves secretas, qué diferencia hay entre sandbox y producción, y qué hacer si una llave se filtra.

Toda petición lleva una llave secreta en la cabecera. La llave decide el comercio y el entorno.

La API usa `Bearer` sobre HTTPS. No hay firma de petición ni nada que calcular: mandas la llave tal cual.

**Cabecera**
```http
Authorization: Bearer sk_test_4f8a…
```

## Los dos entornos

El entorno no es un parámetro ni una URL distinta: **lo determina la llave**. La misma ruta con una `sk_test_` cobra en sandbox y con una `sk_live_` cobra de verdad.

| Prefijo | Entorno | Dónde vive |
| --- | --- | --- |
| `sk_test_` | Sandbox. No se mueve plata. | Tu servidor y tu entorno de desarrollo. |
| `sk_live_` | Producción. Se mueve plata real. | Solo tu servidor de producción. |
| `pk_test_` · `pk_live_` | Llaves públicas, para el navegador. | Pueden ir en el front. No sirven para cobrar. |

> **Importante: La llave secreta no toca el navegador.** Una `sk_` en el front es una llave publicada: cualquiera que abra las herramientas de desarrollo puede cobrar, reembolsar y leer tus clientes. Si eso pasa, revócala en el panel y crea otra — no hay forma de rotarla sin cortar.

## Crear y revocar

Las llaves se crean en **Desarrolladores → Llaves de API**. Se guardan cifradas, así que el valor completo se muestra una sola vez, al crearla. Después solo vas a ver los últimos caracteres.

## Varias tiendas, varias llaves

Una cuenta puede tener varios comercios. Cada llave queda atada a uno, y los cobros hechos con esa llave se le acreditan a ese comercio. Para ver cuáles tienes, lista los comercios.

**Listar comercios**

```bash
curl "https://gxxazsplhgyezwxghrnn.supabase.co/functions/v1/blink-api/v1/merchants" \
  -H "Authorization: Bearer sk_test_…"
```

_Respuesta 200_

```json
{
  "object": "list",
  "has_more": false,
  "next_cursor": null,
  "data": [
    {
      "id": "b21f…",
      "name": "Café Vecino",
      "alias": "cafe-vecino",
      "default_currency": "COP"
    }
  ]
}
```

## Cuando la llave no sirve

| HTTP | Cuerpo | Qué pasó |
| --- | --- | --- |
| `401` | `{"error":"Missing or invalid secret key"}` | Falta la cabecera, o no empieza con `Bearer sk_`. |
| `401` | `{"error":"Invalid API key"}` | La llave no existe o fue revocada. |
| `401` | `{"error":"API key has expired"}` | La llave tenía fecha de vencimiento y ya pasó. |

El resto de los códigos está en [Errores](https://lane.money/docs/errores).
