# Destinos y claves de proveedor

> Pon, reemplaza o quita la clave del proveedor de un destino, y añade o borra tus propios destinos HTTPS en la pasarela de egress alojada.

Un **destino** es una API de proveedor a la que pueden llamar tus agentes: uno del [catálogo](https://developers.openwaf.dev/es/egress/cloud/reference/#catalog) (OpenRouter, OpenAI, Anthropic y otros) o un **destino propio** que añades tú. Cada destino tiene como mucho una **clave de proveedor** para toda la organización; la usan todos los agentes que pueden llamar a ese destino. Cada cambio necesita un `admin` de toda la organización.

## Cómo se guardan las claves

- Una clave es de solo escritura. OpenWAF la guarda cifrada en su almacén de credenciales y nunca la devuelve, la escribe en un registro ni la guarda en su base de datos; la API y el panel solo enseñan su huella (`sha256:` y 12 caracteres hexadecimales), quién la puso y cuándo.
- Se pone desde el panel o la API, nunca por MCP: pasaría por la conversación del asistente. Por MCP sí se puede quitar.
- Una clave tiene de 1 a 8192 caracteres, sin espacios ni caracteres de control.
- La pasarela guarda una clave en caché hasta cinco minutos, así que una clave reemplazada o quitada se puede seguir usando ese tiempo.

## Poner o reemplazar una clave

Al guardar una clave se reemplaza la actual para todos los agentes a la vez.

**Panel**

En **Egress IA → Credenciales**, elige **Poner clave** (o **Reemplazar clave**) en la fila del proveedor, pega la clave y guarda.
**API**

```sh
read -rs KEY && printf '{"secret":"%s"}' "$KEY" | curl -sS -X PUT \
  "https://dash.openwaf.dev/v1/orgs/$ORG/egress/targets/openai/credential" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" -H "Content-Type: application/json" --data-binary @- && unset KEY
```


## Quitar una clave

Los agentes que llamen al destino reciben `502 credential_resolution_failed` hasta que se ponga una clave nueva.

**Panel**

En **Egress IA → Credenciales**, quita la clave desde la fila del proveedor y confirma.
**API**

```sh
curl -sS -X DELETE "https://dash.openwaf.dev/v1/orgs/$ORG/egress/targets/openai/credential" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" -H "X-Change-Reason: ya no usamos este proveedor"
```
**MCP**

`egress_remove_credential` con `target` y `reason`, y después otra vez con `confirm=true`.


## Añadir un destino propio

Cualquier API HTTPS a la que tus agentes llamen con una clave, como un servidor de modelos propio o un proveedor que no está en el catálogo.

| Campo | Regla |
|---|---|
| `id` | De 2 a 32 minúsculas, dígitos o guiones, empezando por una letra, y que no sea un id del catálogo. Aparece en la URL de la pasarela |
| `name` | Nombre que se muestra, hasta 100 caracteres |
| `base_url` | `https://` en el puerto por defecto 443, con un nombre DNS público: sin dirección IP, credenciales, query ni fragmento, y sin nombres `.local`, `.internal`, `.localhost`, `.lan`, `.home.arpa`, `.onion` ni de DNS inverso |
| `auth_header` | Cabecera que lleva la clave. Por defecto `Authorization` |
| `auth_prefix` | Texto que va delante de la clave, hasta 32 caracteres. Por defecto `Bearer ` con `Authorization` y vacío con cualquier otra cabecera |

La pasarela comprueba además en cada petición que el nombre solo resuelve a direcciones públicas (`403 ssrf_blocked`).

**Panel**

En **Egress IA → Credenciales**, elige **Añadir destino propio**, rellena **Identificador**, **Nombre**, **URL base**, **Cabecera de autenticación** y **Prefijo**, y guarda. Después ponle su clave.
**API**

```sh
curl -sS -X POST "https://dash.openwaf.dev/v1/orgs/$ORG/egress/targets" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" -H "Content-Type: application/json" \
  -d '{"id": "mi-llm", "name": "LLM propio", "base_url": "https://llm.example.com/v1"}'
```
**MCP**

`egress_add_target` con `id`, `name`, `base_url`, opcionalmente `auth_header` y `auth_prefix`, y `reason`; después otra vez con `confirm=true`. Su clave se pone en el panel o en la API.


## Borrar un destino propio

Al borrar un destino propio también se borra su clave, y no se puede deshacer. Se rechaza con `409 target_in_use` mientras algún agente lo permita: quítalo antes de esos agentes. Los destinos del catálogo no se pueden borrar (`422 invalid`); quita su clave.

En el panel, bórralo desde su fila en **Egress IA → Credenciales**; en la API envía `DELETE …/egress/targets/{id}`; por MCP llama a `egress_remove_target`.

## Auditoría

Cada cambio deja una entrada en la auditoría de la organización: `egress.credential.set` (con la huella), `egress.credential.delete`, `egress.target.create` y `egress.target.delete`.
