TokenAPIDocumentación de la API
Referencia de la API

Integra en dos líneas: base URL y API key.

TokenAPI habla los formatos Chat Completions y Responses de OpenAI y el formato Messages de Anthropic. Usa los SDK oficiales sin cambios y elige un ID de la lista de modelos.

Inicio rápido

Base URL

https://tokenapi.biz/v1

Todos los endpoints:

GET/v1/models

Listar modelos

IDs de modelo públicos con capacidades, longitud de contexto y precios.

GET/v1/models/{id}

Obtener un modelo

Un único objeto de modelo.

POST/v1/chat/completions

Chat Completions

Formato Chat Completions de OpenAI, con y sin streaming.

POST/v1/responses

Responses

Formato Responses de OpenAI (sin estado), con y sin streaming.

POST/v1/messages

Messages

Formato Messages de Anthropic, para el SDK de Anthropic.

curl
curl https://tokenapi.biz/v1/chat/completions \
  -H "Authorization: Bearer $TOKENAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tokenapi-pro",
    "messages": [{ "role": "user", "content": "Hello!" }]
  }'
Node.js · openai
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://tokenapi.biz/v1",
  apiKey: process.env.TOKENAPI_KEY,
});

const res = await client.chat.completions.create({
  model: "tokenapi-pro",
  messages: [{ role: "user", content: "Hello!" }],
});
console.log(res.choices[0].message.content);
Python · openai
import os
from openai import OpenAI

client = OpenAI(base_url="https://tokenapi.biz/v1", api_key=os.environ["TOKENAPI_KEY"])

res = client.chat.completions.create(
    model="tokenapi-pro",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(res.choices[0].message.content)
Autenticación

Envía tu key como token Bearer.

Authorization: Bearer sk-tk-…

También se acepta la cabecera x-api-key al estilo Anthropic. Las keys empiezan por sk-tk-, se muestran una sola vez al crearlas y pueden limitarse individualmente (solicitudes por minuto, tope de gasto, modelos permitidos, caducidad). Guarda las keys en el servidor; nunca las incluyas en código de navegador o móvil. Para obtener una key, escribe a hello@tokenapi.biz.

Modelos

IDs de modelo estables.

Usa el id de GET /v1/models como parámetro model. Un ID de modelo es un producto estable: podemos mejorar o cambiar el backend que lo sirve para mantener la calidad y la disponibilidad, sin ningún cambio por tu parte. Las respuestas siempre indican el ID que llamaste.

GET /v1/models
{
  "object": "list",
  "data": [
    {
      "id": "tokenapi-pro",
      "object": "model",
      "owned_by": "tokenapi",
      "display_name": "TokenAPI Pro",
      "capabilities": ["streaming", "tools", "json_output"],
      "context_length": 131072,
      "pricing": {
        "currency": "USD",
        "prompt": "0.0000015",
        "completion": "0.000006",
        "input_per_million": 1.5,
        "output_per_million": 6
      }
    }
  ]
}

pricing.prompt / pricing.completion son USD por token (cadenas); input_per_million / output_per_million son USD por millón de tokens.

POST /v1/chat/completions

Chat Completions

La solicitud y la respuesta siguen el formato de OpenAI: messages con texto e imágenes, tools / tool_choice, response_format, temperature, top_p, stop, max_tokens o max_completion_tokens. Cada respuesta incluye la cabecera x-request-id; indícala al contactar con soporte.

Si omites max_tokens, se aplica la longitud máxima de salida del modelo.

Streaming

Server-sent events

Indica stream: true. Los fragmentos llegan como líneas data: y el stream termina con data: [DONE]. Añade stream_options.include_usage para recibir el uso de tokens en un último fragmento.

Node.js
const stream = await client.chat.completions.create({
  model: "tokenapi-pro",
  messages: [{ role: "user", content: "Write a haiku." }],
  stream: true,
  stream_options: { include_usage: true }, // final chunk carries usage
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
POST /v1/responses

Responses API

Admite input como cadena o array, instructions, herramientas de función, text.format (JSON Schema) y la secuencia completa de eventos de streaming (response.output_text.delta, response.completed, …).

Node.js
const res = await client.responses.create({
  model: "tokenapi-pro",
  instructions: "Answer in one sentence.",
  input: "What is a token?",
});
console.log(res.output_text);
POST /v1/messages

Anthropic Messages

Para código escrito con el SDK de Anthropic. Admite system, bloques de texto e imagen, tools con tool_use / tool_result y eventos de streaming. Los errores usan el formato de Anthropic.

Node.js · @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";

const anthropic = new Anthropic({
  baseURL: "https://tokenapi.biz",   // SDK appends /v1/messages
  apiKey: process.env.TOKENAPI_KEY,
});

const msg = await anthropic.messages.create({
  model: "tokenapi-pro",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Hello!" }],
});
Errores

Objetos de error al estilo OpenAI

Ejemplo
{
  "error": {
    "message": "The model 'nope' does not exist or is disabled.",
    "type": "invalid_request_error",
    "code": "model_not_found",
    "param": null
  }
}
400invalid_request_error

JSON mal formado, falta model/messages o un parámetro no soportado.

401invalid_api_key

API key ausente, incorrecta, desactivada o caducada.

402insufficient_quota

El saldo no cubre el coste máximo de esta solicitud o se alcanzó el tope de gasto de la key. Recarga o reduce max_tokens.

403model_not_allowed

Esta key está restringida a otros modelos.

404model_not_found

ID de modelo desconocido o desactivado. Consulta los IDs válidos con GET /v1/models.

429rate_limit_exceeded

Se superó el límite de solicitudes por minuto de la key. Reintenta tras el tiempo de la cabecera Retry-After.

502upstream_unavailable

Fallaron todas las rutas de backend de este modelo. Puedes reintentar con seguridad.

Los fallos del proveedor se reintentan automáticamente en otra ruta antes de devolverte un error. Un 502 significa que fallaron todas las rutas y no se te cobró.

Facturación y límites

Prepago, por token, sin saldo negativo.

  • Los precios son por modelo, en USD por millón de tokens de entrada y de salida (ver Modelos).
  • Antes de ejecutar una solicitud se reserva de tu saldo su coste máximo posible (prompt más max_tokens). Si el saldo no alcanza, recibes un 402 y no se envía nada al proveedor.
  • Al terminar la solicitud se te cobran los tokens reales y el resto de la reserva se libera al instante.
  • Las solicitudes que fallan antes de que el modelo empiece a responder (cualquier respuesta de error 4xx/5xx) no se cobran. Si un stream se cancela o se corta a mitad, solo se cobran los tokens ya generados.
  • Los límites de tasa son por API key, en solicitudes por minuto; si los superas recibes un 429 con Retry-After.
Compatibilidad

Aún no compatible

  • /v1/responses: previous_response_id (envía la conversación completa), herramientas integradas como web_search y entradas file_id.
  • /v1/messages: se ignoran el thinking extendido y cache_control.
  • n > 1 en Chat Completions.
¿Dudas? Contáctanos