TokenGate
Documentación
docs / api

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.

01 · Auth

Valida la key

Hash de tu Bearer token contra la base. Si no matchea o fue revocada → 401.

02 · Saldo

Estima el costo

Calcula costo estimado del request y lo compara contra tu saldo y tus límites. Si no alcanza → 402.

03 · Traducción

Dialecto del proveedor

Traduce tu body estilo OpenAI al formato nativo del proveedor real (Anthropic, Google, etc.).

04 · Proveedor

Llama al modelo real

Si el proveedor responde con error o timeout → 502 provider_error.

05 · Billing

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.

HEADER
Authorization: Bearer tg_live_51f...
Content-Type: application/json
⚠️

Tu 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:

PYTHON
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
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
}
200
{
  "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.

PYTHON
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
GET /v1/models
Authorization: Bearer tg_live_...
200
{
  "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:

StatusCódigoPor qué pasaCómo lo arreglás
401invalid_api_keyLa key está mal escrita o fue revocadaGenerá una nueva en /dashboard/keys
402insufficient_balanceNo hay saldo suficiente para cubrir el request estimadoCargá saldo — ver billing
402spending_limit_exceededSuperaste tu límite diario o mensual configuradoSubí el límite o esperá al siguiente período — ver límites
404model_not_foundEl slug no existe o el modelo está desactivadoRevisá el slug contra /docs/modelos o GET /v1/models
400tools_not_supportedMandaste tools a un modelo sin tool useElegí un modelo con agentic_tools en sus fortalezas
429rate_limit_exceededDemasiados requests en poco tiempoAplicá backoff exponencial y reintentá
502provider_errorEl proveedor del modelo devolvió un error o timeoutReintentá; 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.