API
Un solo endpoint compatible con la API de OpenAI para hablarle a los ocho proveedores que soporta TokenGate. Autenticás con tu API key, elegís el model por su slug, y el gateway se encarga del resto: traducir al dialecto del proveedor, medir tokens y descontar tu saldo.
Qué hace el gateway con cada request
Cada llamada a /v1/chat/completions pasa por el mismo pipeline sea cual sea el proveedor real detrás del slug. Los pasos donde puede fallar son justamente los códigos de la tabla de errores comunes más abajo.
Valida la key
Hash de tu Bearer token contra la base. Si no matchea o fue revocada → 401.
Estima el costo
Calcula costo estimado del request y lo compara contra tu saldo y tus límites. Si no alcanza → 402.
Dialecto del proveedor
Traduce tu body estilo OpenAI al formato nativo del proveedor real (Anthropic, Google, etc.).
Llama al modelo real
Si el proveedor responde con error o timeout → 502 provider_error.
Descuenta el saldo real
Mide tokens reales de entrada/salida (y caché si aplica) y descuenta el costo exacto — no el estimado.
Autenticación
Todos los requests van con tu API key como Bearer token en el header Authorization. Las keys empiezan con tg_live_ y se generan desde /dashboard/keys.
Authorization: Bearer tg_live_51f...
Content-Type: application/jsonTu API key se muestra una sola vez al crearla. Guardala en un secret manager o variable de entorno — TokenGate solo guarda su hash, no puede volver a mostrártela.
Con la librería de OpenAI
Como TokenGate habla el mismo dialecto, el SDK oficial de OpenAI funciona sin modificaciones — solo cambiás base_url y api_key, y usás el slug de TokenGate en model. Funciona igual sea cual sea el proveedor real detrás del modelo, por ejemplo MiniMax:
from openai import OpenAI
client = OpenAI(
base_url="https://tokengate.work/v1",
api_key="tg_live_...",
)
response = client.chat.completions.create(
model="MiniMax-M2.7",
messages=[{"role": "user", "content": "Hola"}],
)
print(response.choices[0].message.content)No hay nada específico de MiniMax en el código de arriba — el mismo client sirve para cualquier modelo del catálogo, cambiando solo el valor de model.
Chat completions
El endpoint principal. Acepta el mismo body que POST /v1/chat/completions de OpenAI: model, messages, temperature, max_tokens, tools, stream, etc. Usá el slug del modelo (ver catálogo de modelos) en el campo model.
POST /v1/chat/completions
Authorization: Bearer tg_live_...
{
"model": "gpt-5.4",
"messages": [
{"role": "system", "content": "Sos un asistente conciso."},
{"role": "user", "content": "Resumime la ley de Amdahl en 2 líneas."}
],
"stream": false
}{
"id": "chatcmpl-8f2c...",
"object": "chat.completion",
"model": "gpt-5.4",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "La ley de Amdahl..."},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 24, "completion_tokens": 61, "total_tokens": 85}
}Streaming (SSE)
Agregá "stream": true para recibir la respuesta token por token vía server-sent events, igual que en la API de OpenAI.
stream = client.chat.completions.create(
model="claude-haiku-4-5",
messages=[{"role": "user", "content": "Contame un chiste corto"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)Modelos con razonamiento
Los modelos que soportan esfuerzo de razonamiento (ver columna reasoning en /docs/modelos) aceptan reasoning_effort en el body, con valores que varían por modelo (low, medium, high, xhigh, o el booleano on según el proveedor). El nivel de razonamiento afecta el costo: más esfuerzo, más tokens de salida facturados.
{
"model": "claude-opus-4-8",
"reasoning_effort": "high",
"messages": [{"role": "user", "content": "Diseñá un rate limiter distribuido"}]
}
Listar modelos disponibles
Trae el catálogo activo en formato compatible con OpenAI — útil para poblar un selector en tu propia app o verificar qué slug usar.
GET /v1/models
Authorization: Bearer tg_live_...{
"object": "list",
"data": [
{"id": "claude-sonnet-5", "object": "model", "owned_by": "anthropic"},
{"id": "gpt-5.4", "object": "model", "owned_by": "openai"}
]
}Errores comunes
TokenGate devuelve errores con la misma forma que OpenAI ({"error": {"code": "...", "message": "..."}}). Estos son los códigos que vas a ver más seguido:
| Status | Código | Por qué pasa | Cómo lo arreglás |
|---|---|---|---|
| 401 | invalid_api_key | La key está mal escrita o fue revocada | Generá una nueva en /dashboard/keys |
| 402 | insufficient_balance | No hay saldo suficiente para cubrir el request estimado | Cargá saldo — ver billing |
| 402 | spending_limit_exceeded | Superaste tu límite diario o mensual configurado | Subí el límite o esperá al siguiente período — ver límites |
| 404 | model_not_found | El slug no existe o el modelo está desactivado | Revisá el slug contra /docs/modelos o GET /v1/models |
| 400 | tools_not_supported | Mandaste tools a un modelo sin tool use | Elegí un modelo con agentic_tools en sus fortalezas |
| 429 | rate_limit_exceeded | Demasiados requests en poco tiempo | Aplicá backoff exponencial y reintentá |
| 502 | provider_error | El proveedor del modelo devolvió un error o timeout | Reintentá; si persiste, probá otro modelo del mismo proveedor |
Error típico: mandar stream: true junto con tools a un modelo que no soporta ambos combinados puede devolver la respuesta ya armada en un solo evento en vez de ir token por token — no es un bug, es el proveedor resolviendo la llamada a herramienta antes de poder empezar a transmitir.