Saltar al contenido

Una línea de código y ya estás en la Unión Europea.

La API es compatible con OpenAI. Tus SDK, tus frameworks y tu código siguen funcionando: cambias la base_url y eliges un tier en lugar de un nombre de modelo.

Quickstart: tu primera llamada a la API

Crea una clave en tu panel, en Ajustes, Claves API. El secreto lo ves una sola vez. Después solo guardamos un hash y el prefijo. Ponlo en una variable de entorno, nunca en tu repositorio.

curl
curl https://api.europeanailab.eu/v1/chat/completions \
  -H "Authorization: Bearer $UNION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eu-standard",
    "messages": [{"role": "user", "content": "Explica la inversión del sujeto pasivo del IVA."}]
  }'
python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["UNION_API_KEY"],
    base_url="https://api.europeanailab.eu/v1",   # la única línea que cambia
)

resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Explica la inversión del sujeto pasivo del IVA."}],
)
print(resp.choices[0].message.content)

¿Node, Go, Java, .NET?

Funciona cualquier SDK oficial de OpenAI: pon la base URL en https://api.europeanailab.eu/v1 y usa tu clave de Union AI. Implementamos el contrato de chat completions, con streaming, tools y JSON schemas incluidos.

Tiers de modelo y ventanas de contexto

En el campo model pasas un tier, no un nombre de modelo. Así tu integración sigue funcionando cuando cambiemos el modelo de debajo, y lo haremos, porque los modelos open-weight se retiran y otros los superan.

TierContextoEntrada / 1 MSalida / 1 MIdeal para
eu-lite131K0,40 €1,60 €Trabajo rápido y barato: clasificación, extracción, respuestas cortas.
eu-standard262K0,70 €3,50 €El tier para todo. Por defecto en el chat y en la mayor parte del tráfico de la API.
eu-long1000K1,00 €2,00 €Expedientes completos, contratos y bases de código en un solo prompt.
eu-pro1000K4,00 €12,00 €Razonamiento exigente, agentes, código complejo.

Si superas la ventana de contexto de un tier, recibes un 400 con el máximo indicado: nunca recortamos tu prompt sin avisar.

Respuestas en streaming

El streaming funciona como esperas, con una diferencia importante que debes conocer porque afecta a tu dinero.

Activa include_usage

Con el streaming compatible con OpenAI, la API no envía el consumo de tokens por defecto. Sin stream_options: {"include_usage": true} no puedes ver al final del stream cuánto costó la llamada. Nosotros lo medimos igualmente: se trata de que tú también puedas verlo y comprobarlo.
python
stream = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Escribe un resumen."}],
    stream=True,
    # Sin esto no hay objeto usage y no puedes ver el coste.
    stream_options={"include_usage": True},
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
    if chunk.usage:                      # último chunk
        print("\n", chunk.usage)

Si cortas un stream a medias, solo pagas lo generado hasta ese momento. Si por la conexión caída no llega el chunk de consumo, estimamos el uso y lo corregimos en la conciliación diaria con nuestro proveedor. Esa línea aparece en tu resumen de uso como estimated hasta que se liquida.

Function calling y uso de tools

Las tools siguen el esquema de siempre. Si un modelo genera una llamada que no encaja con tu esquema, la registramos: en la versión 1 no la corregimos sin decir nada, porque arreglar tu salida a escondidas es peor que un fallo visible.

python
tools = [{
    "type": "function",
    "function": {
        "name": "find_invoice",
        "description": "Busca una factura por su número.",
        "parameters": {
            "type": "object",
            "properties": {"number": {"type": "string"}},
            "required": ["number"],
        },
    },
}]

resp = client.chat.completions.create(
    model="eu-standard", messages=messages, tools=tools
)

Salida estructurada con un JSON schema

Pasa un JSON schema y valida la respuesta por tu parte. Nuestro consejo: valida siempre, aunque el modelo suela portarse bien.

python
resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Extrae el nombre y el importe."}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "invoice",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "amount_eur": {"type": "number"},
                },
                "required": ["name", "amount_eur"],
            },
        },
    },
)

Cabeceras de respuesta: coste, tier y enrutamiento

Cada respuesta te dice qué ha pasado. No es un extra para depurar, es lo importante: puedes comprobar por ti mismo que has recibido lo que has pagado.

CabeceraSignificado
X-EU-Model-TierEl tier en el que se ha ejecutado la petición.
X-EU-RoutedAparece cuando la petición se ha desviado a otro modelo, con el motivo: censorship o error.
X-EU-Degradedtrue cuando el modelo sustituto es más débil o tiene una ventana de contexto menor. En ese caso pagas la más baja de las dos tarifas.
X-EU-Refusal-ClassAparece en una negativa que no hemos podido desviar, por ejemplo A-unrouteable cuando ninguna alternativa tiene contexto suficiente.
X-EU-Tokens-In / -OutTokens medidos en esta petición.
X-EU-Cost-EURLo que esta petición ha descontado de tu saldo, en euros.
X-EU-Balance-EURTu saldo restante después de esta petición.

Límites de uso y topes de gasto

Hay un límite por clave y por cuenta, más los topes que fijas tú. Estos últimos importan más de lo que parece: sin tope, una clave filtrada o un bucle infinito en tu propio código pueden vaciar un saldo en una noche.

  • Peticiones por minuto, por clave y por cuenta.
  • Tope diario y mensual en euros, configurable por clave.
  • Cuentas nuevas: un máximo de 25 € al día durante las primeras 48 horas, sea cual sea el saldo.
  • Si en una hora vemos más de diez veces tu media semanal, pausamos la clave automáticamente y te enviamos un email. Mejor una falsa alarma que una cartera vacía.
  • Una petición solo empieza si tu saldo es de al menos 0,05 €.

Códigos de error y qué hacer

CódigoSignificadoQué hacer
400Petición no válida, o un prompt que supera la ventana de contexto.Corrige la petición; el máximo aparece en el mensaje de error.
401Clave desconocida, revocada o pausada.Revisa la clave en tu panel.
402Saldo insuficiente.Recarga. La respuesta incluye un enlace directo.
403La petición no cumple la política de uso.Consulta el uso razonable más abajo.
429Límite de uso o tope alcanzado.Espera y reintenta; respeta Retry-After.
502 / 503Modelo upstream no disponible y sin alternativa posible.Reintenta. Consulta la página de estado.

Las peticiones fallidas no te cuestan nada: si no ha llegado una respuesta utilizable, no se descuenta nada de tu saldo.

Uso razonable y política de uso

Rechazamos dar instrucciones sobre armas, malware y fraude, y generar material que haga daño a menores. Esas negativas son definitivas: nunca reenviamos una petición así a otro modelo para sacarle una respuesta de todos modos.

Otra cosa es que un modelo se niegue a responder una pregunta legítima sobre política, historia o un tema socialmente delicado: eso lo tratamos como un defecto y la enviamos a un modelo sin ese punto ciego. Lo ves en la cabecera X-EU-Routed: censorship.

Uno de nuestros modelos tiene una licencia con su propia política de uso. Esa política se aplica en su totalidad: desviar la petición no sirve para saltarse los términos de una licencia.

¿No sabes si tu caso de uso encaja? Escribe a hello@europeanailab.eu. Una respuesta por adelantado nos sale más barata a los dos que una clave bloqueada después.

Preguntas frecuentes

Las preguntas que nos llegan por email antes de que nadie cree una clave: con qué es compatible la API, cuánto cuesta una petición y dónde se ejecuta.

¿Qué SDK de OpenAI funcionan con una API compatible con OpenAI?

Todos los oficiales, porque son clientes ligeros sobre el contrato de chat completions y aceptan la base URL como argumento del constructor. Los SDK de Python y Node son los casos más habituales; Go, Java y .NET funcionan igual. Conservas tu lógica de reintentos, tu gestión del streaming y tus tipos.

¿Puedo usarla con LangChain o con el Vercel AI SDK?

Sí. Los dos permiten configurar la base URL en su proveedor de OpenAI, así que la apuntas a nuestro host y usas una clave de Union AI. Cualquier otra herramienta que te deje cambiar la base URL funciona igual, incluidos la mayoría de frameworks de agentes y de evaluación.

¿La API admite streaming y function calling?

Sí, las dos cosas, y además salida estructurada contra un JSON schema. Las respuestas en streaming incluyen el consumo de tokens al final del stream, así que puedes medir una petición en streaming con la misma precisión que una normal.

¿Cuáles son los límites de uso de la API?

Hay un límite de peticiones por minuto por clave y por cuenta, más unos topes diarios y mensuales en euros que fijas tú. Las cuentas nuevas tienen un tope de 25 € al día durante las primeras 48 horas, sea cual sea el saldo. Si alcanzas un límite, recibes un 429 con una cabecera Retry-After.

¿Cómo gestiono los errores 429 y los reintentos?

Respeta Retry-After en lugar de reintentar al instante, y usa backoff exponencial con jitter para que una ráfaga no se sincronice entre tus workers. No reintentes un 402: significa que el saldo está vacío y un bucle solo repetirá el fallo. Normalmente basta con un reintento, porque un segundo fallo rara vez trae una respuesta distinta.

¿Cómo veo cuánto ha costado una petición?

Cada respuesta lleva cabeceras: X-EU-Tokens-In y X-EU-Tokens-Out con los tokens medidos, X-EU-Cost-EUR con lo que se descontó de tu saldo y X-EU-Balance-EUR con lo que te queda. Así tus propios logs pueden responder qué cuesta cada funcionalidad o cada cliente sin abrir ningún panel.

¿Qué modelo hay detrás de cada tier?

Cada tier corresponde a un modelo open-weight concreto, publicado con su licencia y su ventana de contexto en la página de transparencia de la IA. Compras el tier, no el nombre del modelo, así que podemos cambiar el modelo de debajo sin romper tu integración, y te avisamos cuando lo hacemos.

Migrar una integración existente son tres líneas: la clave, la base URL y el nombre de un tier. El cambio completo, y lo que no se puede portar, está en cambiar en tres líneas. ¿Te queda alguna duda? Las tarifas de cada tier están en la página de precios, el modelo y la licencia de cada tier en transparencia de la IA, y lo que pasa durante una caída en la página de estado. Dos lecturas más largas: cuánto cuesta una API de IA por token y adónde van de verdad tus prompts.

Empieza con IA para europeos.

Usa IA sin enviar tus datos al extranjero: todo en servidores europeos, a un precio europeo.

13 € al mes por el chat, cancela cuando quieras. O por token, con crédito desde 10 €.

¿Aún no lo tienes claro? Haz el test de 60 segundos →