Endpoints de modelos
Referencia de peticiones y respuestas de Messages, Chat Completions, Responses, Gemini y la lista de modelos en Half Off Dev, con sus cabeceras.
Estos son los endpoints propios de cada proveedor de modelos, servidos en https://halfoff.dev. Los cuerpos siguen el esquema del proveedor y pasan sin modificaciones, así que esta referencia recoge los parámetros que más vas a usar y enlaza a la documentación oficial para el resto. El comportamiento común a todos, como la conmutación por error y la caché, se explica en Cómo funciona el gateway.
Cualquier endpoint acepta tu clave como Authorization: Bearer, x-api-key, x-goog-api-key o el parámetro de consulta ?key=. Los errores usan el formato del endpoint que llamaste; consulta Errores.
Response headers
x-halfoff-request-idstringID de la llamada, como req_6f1c0b9e2d4a47a1b8c3d5e7, también visible en Logs. Se envía en las respuestas correctas y en los errores 429 de capacidad y 502.
x-halfoff-groupstringEl grupo de canales que respondió.
x-halfoff-channelstringLa etiqueta de canal de ese grupo, codificada para URL.
x-halfoff-queued-msintegerMilisegundos de espera por capacidad. No aparece si no hubo espera.
retry-afterintegerSegundos que debes esperar. Se envía con las respuestas 429 causadas por límites de la clave o capacidad ocupada.
Listar modelos#
/v1/modelsDevuelve todos los modelos que puedes usar ahora mismo, con su ventana de contexto, sus precios y los grupos de canales que los sirven. No necesita clave. El formato es compatible con models.list() de los SDK de OpenAI y de Anthropic. Los precios son los que cobra Half Off Dev, la mitad del precio oficial. El detalle de cada campo está en Modelos y precios.
Response fields
dataarrayUn elemento por modelo.
has_morebooleanSiempre false: recibes la lista completa en una sola respuesta.
curl https://halfoff.dev/v1/models{
"object": "list",
"data": [
{
"id": "claude-sonnet-5.5",
"object": "model",
"type": "model",
"display_name": "Claude Sonnet 5.5",
"created": 1700000000,
"created_at": "2025-01-01T00:00:00Z",
"owned_by": "Anthropic",
"context_length": 1000000,
"pricing": {
"input": 1,
"output": 5,
"cache_read": 0.05,
"cache_write": 1.25,
"unit": "USD per 1M tokens"
},
"groups": ["claude-value"]
}
],
"has_more": false,
"first_id": "claude-fable-5.1",
"last_id": "gpt-5.6-luna"
}Crear un mensaje#
/v1/messagesLa API Messages de Anthropic. Activa stream para recibir server-sent events. El razonamiento extendido, el uso de herramientas y la caché de prompts funcionan tal como los documenta Anthropic. Guía: Anthropic Messages.
Headers
x-api-keystringObligatorioTu clave de Half Off Dev. También se acepta Authorization: Bearer.
anthropic-versionstringPredeterminado 2023-06-01Se reenvía al modelo.
anthropic-betastringSe reenvía tal cual.
x-halfoff-groupstringGrupo de canales para esta llamada, por ejemplo claude-value. Se ignora si la clave está ligada a un grupo.
x-session-idstringID estable de la conversación, para que cada turno vaya al canal que guarda su caché.
Body parameters
modelstringObligatorioUn ID de modelo de GET /v1/models, por ejemplo claude-sonnet-5.5. Variantes como claude-sonnet-5-5 apuntan al mismo modelo.
messagesarrayObligatorioLa conversación hasta ahora, alternando turnos user y assistant.
max_tokensintegerObligatorioMáximo de tokens que puede generar el modelo.
systemstring or arrayPrompt de sistema. Los bloques de texto aceptan cache_control.
streambooleanPredeterminado falseDevuelve la respuesta como server-sent events.
thinkingobjectAjustes de razonamiento extendido.
output_configobjectAjustes de salida como effort y format.
toolsarrayHerramientas que el modelo puede invocar.
tool_choiceobjectCómo elige herramienta el modelo.
metadataobjectMetadatos de la petición.
curl https://halfoff.dev/v1/messages \
-H "x-api-key: $HALFOFF_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5.5",
"max_tokens": 512,
"messages": [{"role": "user", "content": "Propón un nombre para una app de finanzas personales."}]
}'{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-5-5",
"content": [
{"type": "text", "text": "¿Qué tal \"Alcancía\"?"}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 19,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"output_tokens": 9
}
}Contar tokens de un mensaje#
/v1/messages/count_tokensCalcula cuántos tokens de entrada usaría una petición Messages, sin ejecutarla. Es gratis y funciona incluso con saldo cero. El resultado es aproximado: útil para comprobar la ventana de contexto y presupuestar, mientras que el cargo real sale del usage de una llamada real. Consulta la guía de conteo de tokens de Anthropic.
Headers
x-api-keystringObligatorioTu clave de Half Off Dev. También se acepta Authorization: Bearer.
x-halfoff-groupstringGrupo de canales contra el que se comprueba el modelo. Se ignora si la clave está ligada a un grupo.
Body parameters
modelstringObligatorioID del modelo, igual que en POST /v1/messages.
messagesarrayObligatorioMensajes que contar.
systemstring or arrayPrompt de sistema que incluir.
toolsarrayDefiniciones de herramientas que incluir.
curl https://halfoff.dev/v1/messages/count_tokens \
-H "x-api-key: $HALFOFF_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-5.5",
"messages": [{"role": "user", "content": "¿Cuánto mide este prompt?"}]}'{
"input_tokens": 15
}Crear una chat completion#
/v1/chat/completionsLa API Chat Completions de OpenAI. Todos los modelos de GET /v1/models responden en este formato, Claude y Gemini incluidos. Las peticiones con streaming llevan siempre stream_options.include_usage: true, así que el último fragmento incluye usage. Guía: OpenAI Chat Completions.
Headers
AuthorizationstringObligatorioBearer seguido de tu clave de Half Off Dev.
openai-betastringSe reenvía tal cual.
x-halfoff-groupstringGrupo de canales para esta llamada, por ejemplo gpt-value. Se ignora si la clave está ligada a un grupo.
x-session-idstringID estable de la conversación, para que cada turno vaya al canal que guarda su caché.
Body parameters
modelstringObligatorioUn ID de modelo de GET /v1/models, por ejemplo gpt-6.1-sol.
messagesarrayObligatorioLa conversación hasta ahora: mensajes system o developer, user, assistant y tool.
streambooleanPredeterminado falseDevuelve server-sent events que terminan con data: [DONE].
max_completion_tokensintegerTope de tokens generados, incluidos los de razonamiento.
reasoning_effortstringCuánto razona un modelo de razonamiento. Los valores dependen del modelo.
toolsarrayFunciones que el modelo puede invocar.
tool_choicestring or objectCómo elige función el modelo.
response_formatobjectPide salida JSON o un JSON Schema.
prompt_cache_keystringMejora la tasa de aciertos de caché; también sirve como ID de conversación para el enrutamiento.
userstringID de tu usuario final. Se usa como ID de conversación si no envías nada más específico.
curl https://halfoff.dev/v1/chat/completions \
-H "Authorization: Bearer $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-6.1-sol",
"messages": [{"role": "user", "content": "Traduce \"buenos días\" al francés."}]
}'{
"id": "chatcmpl-B9MHDbslfkBeAs8l4bebGdFOJ6PeG",
"object": "chat.completion",
"created": 1791700000,
"model": "gpt-6.1-sol",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Bonjour."},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 16,
"completion_tokens": 3,
"total_tokens": 19,
"prompt_tokens_details": {"cached_tokens": 0},
"completion_tokens_details": {"reasoning_tokens": 0}
}
}Crear una respuesta#
/v1/responsesLa API Responses de OpenAI, la que usa Codex CLI. Solo para modelos GPT; cualquier otro modelo devuelve 404. No se guarda nada entre llamadas, así que envía la conversación completa en input cada vez. Guía: OpenAI Chat Completions.
Headers
AuthorizationstringObligatorioBearer seguido de tu clave de Half Off Dev.
openai-betastringSe reenvía tal cual.
x-halfoff-groupstringGrupo de canales para esta llamada, por ejemplo gpt-value. Se ignora si la clave está ligada a un grupo.
x-session-idstringID estable de la conversación, para que cada turno vaya al canal que guarda su caché.
Body parameters
modelstringObligatorioUn ID de modelo GPT de GET /v1/models, por ejemplo gpt-6.1-sol.
inputstring or arrayObligatorioUn prompt, o la conversación como lista de elementos de entrada.
instructionsstringInstrucciones de sistema. La respuesta las devuelve tal cual, o null.
streambooleanPredeterminado falseDevuelve server-sent events tipados que terminan con response.completed, que incluye usage.
max_output_tokensintegerTope de tokens generados, incluidos los de razonamiento.
reasoningobjectAjustes de razonamiento como effort. Los valores dependen del modelo.
toolsarrayFunciones y otras herramientas que el modelo puede invocar.
storebooleanEnvía false: las respuestas no se guardan para recuperarlas después.
prompt_cache_keystringMejora la tasa de aciertos de caché; también sirve como ID de conversación para el enrutamiento.
curl https://halfoff.dev/v1/responses \
-H "Authorization: Bearer $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-6.1-sol",
"input": "Dame un truco de git en una línea.",
"store": false
}'Generar contenido#
/v1beta/models/{model}:generateContentLa API de Gemini. Guía: Gemini.
Path parameters
modelstringObligatorioID del modelo, por ejemplo gemini-3.1-pro. Las variantes de Google como gemini-3.1-pro-preview apuntan al mismo modelo.
Headers
x-goog-api-keystringObligatorioTu clave de Half Off Dev. También funcionan Authorization: Bearer o el parámetro ?key=.
x-halfoff-groupstringGrupo de canales para esta llamada, por ejemplo gemini-value. Se ignora si la clave está ligada a un grupo.
x-session-idstringID estable de la conversación, para que cada turno vaya al canal que guarda su caché.
Body parameters
contentsarrayObligatorioLa conversación hasta ahora, como turnos user y model formados por parts.
systemInstructionobjectInstrucción de sistema, como objeto content con partes de texto.
generationConfigobjectAjustes de salida: maxOutputTokens, temperature, responseMimeType, thinkingConfig y más.
toolsarrayDeclaraciones de funciones y otras herramientas.
toolConfigobjectCómo elige funciones el modelo.
safetySettingsarrayUmbrales de seguridad por categoría.
curl "https://halfoff.dev/v1beta/models/gemini-3.1-pro:generateContent" \
-H "x-goog-api-key: $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "¿Qué es un haiku?"}]}]}'{
"candidates": [
{
"content": {"role": "model", "parts": [{"text": "Un haiku es un poema japonés de tres versos de 5, 7 y 5 sílabas."}]},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 6,
"candidatesTokenCount": 20,
"thoughtsTokenCount": 88,
"totalTokenCount": 114
},
"responseId": "mFHoaNC1Lo3HqtsP"
}Generar contenido en streaming#
/v1beta/models/{model}:streamGenerateContentLa misma petición que generateContent, entregada como stream. Añade alt=sse para recibir server-sent events, una respuesta parcial por evento; los SDK lo añaden por ti. Sin él recibes un único array JSON enviado por partes. Consulta Streaming.
Query parameters
altstringsse para server-sent events. Recomendado.
El parámetro de ruta, las cabeceras y el cuerpo son los mismos que en Generar contenido.
curl -N "https://halfoff.dev/v1beta/models/gemini-3-flash:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "Nombra los tres colores primarios."}]}]}'data: {"candidates":[{"content":{"role":"model","parts":[{"text":"Rojo, amarillo"}]}}],"usageMetadata":{"promptTokenCount":8,"candidatesTokenCount":4,"totalTokenCount":12}}
data: {"candidates":[{"content":{"role":"model","parts":[{"text":" y azul."}]},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":8,"candidatesTokenCount":7,"totalTokenCount":15}}Contar tokens de Gemini#
/v1beta/models/{model}:countTokensCalcula los tokens de contents sin ejecutar el modelo. Es gratis y funciona incluso con saldo cero. El resultado es aproximado. Referencia de Gemini.
Body parameters
contentsarrayObligatorioEl contenido que contar, con la misma forma que en generateContent.
El parámetro de ruta y las cabeceras son los mismos que en Generar contenido.
curl "https://halfoff.dev/v1beta/models/gemini-3.1-pro:countTokens" \
-H "x-goog-api-key: $HALFOFF_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "¿Cuánto mide este prompt?"}]}]}'{
"totalTokens": 8
}Listar modelos en formato Gemini#
/v1beta/modelsLista los modelos disponibles a través de los endpoints de Gemini, con la forma que usa la API de Gemini. No necesita clave. Los SDK Google Gen AI lo llaman desde models.list(). Los precios solo aparecen en GET /v1/models.
curl https://halfoff.dev/v1beta/models{
"models": [
{
"name": "models/gemini-3.1-pro",
"displayName": "Gemini 3.1 Pro",
"inputTokenLimit": 1048576,
"supportedGenerationMethods": ["generateContent", "streamGenerateContent", "countTokens"]
}
]
}