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

# Autenticación

> Cómo la plataforma protege tus funciones con API keys, el uso de runtime tokens legacy, y cómo hacer funciones públicas.

Toda función desplegada está protegida por defecto. Las peticiones sin una credencial válida reciben `401 Unauthorized`.

## Inicio rápido

<Steps>
  <Step title="Despliega tu función">
    ```bash theme={null}
    jelou functions deploy
    # ✓ Deployed
    # ▸ URL: https://mi-funcion.fn.jelou.ai
    ```

    El deploy no genera ninguna credencial automáticamente. Para llamar tu función necesitas una API key de plataforma (ver el siguiente paso).
  </Step>

  <Step title="Llama con tu API key">
    Crea una API key en [apps.jelou.ai](https://apps.jelou.ai), en la sección de configuración de la app, y envíala en el header `Authorization`:

    ```bash theme={null}
    curl -X POST https://mi-funcion.fn.jelou.ai \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer sk_..." \
      -d '{"query": "test"}'
    ```

    Respuesta exitosa:

    ```json theme={null}
    { "results": [] }
    ```

    Sin API key o con una inválida:

    ```json theme={null}
    { "error": "Unauthorized", "message": "Missing or invalid auth token (use X-Jelou-Token or Authorization: Bearer)" }
    ```
  </Step>
</Steps>

## ¿Cómo funciona?

1. Crea una API key de plataforma en [apps.jelou.ai](https://apps.jelou.ai), en la sección de configuración de la app
2. Cada petición debe incluirla en el header `Authorization: Bearer sk_...`
3. El SDK valida la key contra el gateway de Jelou, confirma que pertenece a la misma organización dueña de la función, y cachea el resultado en memoria
4. Si la key es válida, la petición llega a tu handler. Si no, retorna `401`

## API keys (recomendado)

<Warning>
  La creación de nuevos runtime tokens (`jelou functions tokens create`) está **deprecada** y responde `410 Gone`. Los deploys tampoco generan uno automáticamente — el mecanismo soportado para autenticar funciones, nuevas o existentes, es una API key de plataforma.
</Warning>

Los runtime tokens `jfn_rt_...` creados antes de esta migración se siguen validando con `X-Jelou-Token` (compatibilidad hacia atrás) y pueden listarse o revocarse con `jelou functions tokens list` / `jelou functions tokens revoke`, pero no pueden crearse nuevos ni se generan en deploys nuevos.

## Rutas sin autenticación

Las rutas `/__health` y `/openapi.json` nunca requieren credencial. Los triggers cron tampoco — la plataforma los autentica automáticamente.

## Ejemplos de uso

<Tabs>
  <Tab title="curl">
    ```bash theme={null}
    curl -X POST https://mi-funcion.fn.jelou.ai \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer sk_..." \
      -d '{"telefono": "593987654321"}'
    ```
  </Tab>

  <Tab title="Node.js">
    ```javascript theme={null}
    const res = await fetch("https://mi-funcion.fn.jelou.ai", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${process.env.JELOU_FUNCTION_API_KEY}`,
      },
      body: JSON.stringify({ telefono: "593987654321" }),
    });
    const data = await res.json();
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    import requests
    import os

    res = requests.post(
        "https://mi-funcion.fn.jelou.ai",
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {os.environ['JELOU_FUNCTION_API_KEY']}",
        },
        json={"telefono": "593987654321"},
    )
    data = res.json()
    ```
  </Tab>

  <Tab title="Brain Studio (MCP)">
    Para conectar tu función como servidor MCP externo en Brain Studio:

    1. URL: `https://mi-funcion.fn.jelou.ai/mcp`
    2. Header: `Authorization` → `Bearer sk_...`

    <Tip>
      Consulta la [guía de Brain Studio](/guides/functions/brain) para instrucciones paso a paso.
    </Tip>
  </Tab>
</Tabs>

<Warning>
  La plataforma no valida nada — tu código es responsable.
</Warning>
