Documentos de BasicRouter
Inicio rápido
BasicRouter ofrece a los equipos de producción una API estable para el acceso a modelos, enrutamiento, respaldo, seguimiento de uso y facturación basada en créditos. El suministro de tokens de LLM proviene de cuentas de proveedores originales en la nube empresarial de confianza, con protección de privacidad, alta estabilidad y trazabilidad de solicitudes integradas en la pasarela.
https://api.basicrouter.ai/apihttps://api.basicrouter.ai/api/v1https://api.basicrouter.ai/api/v1Authorization: Bearer <key>Crear una clave API
Cree una clave API de BasicRouter en la consola. Mantenga la clave en su servidor y nunca la exponga en el código del navegador o del cliente móvil.
Estrategia de claves recomendada:
| Tipo de clave | Uso recomendado |
|---|---|
| Clave de desarrollo | Desarrollo local, staging, pruebas y prototipos. |
| Clave de producción | Solo cargas de trabajo de producción en el backend. |
| Clave de integración | Clave dedicada para herramientas como Cursor, Claude Code, Codex, Hermes o OpenClaw. |
| Clave de cliente / inquilino | Aislamiento de clave opcional para clientes empresariales, tráfico por inquilino o unidades de negocio. |
Rotar las claves cuando cambie el acceso del equipo. Revocar las claves que ya no se usen.
Apunte su SDK a BasicRouter
La mayoría de los clientes compatibles con OpenAI solo necesitan una nueva URL base y una clave API.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.BASICROUTER_API_KEY,
baseURL: "https://api.basicrouter.ai/api/v1"
});
Enviar una completación de chat
curl --request POST \
--url https://api.basicrouter.ai/api/v1/chat/completions \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-5",
"messages": [
{ "role": "user", "content": "Explain BasicRouter in one sentence." }
]
}'
Comprobar uso y saldo
curl --request GET \
--url https://api.basicrouter.ai/api/v1/billing/balance \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Descubrimiento de modelos
Use la página de Modelos o la API de Modelos para inspeccionar los modelos de texto disponibles. Los metadatos del modelo incluyen proveedor, proveedor de servicio, modalidad, longitud de contexto, familias de API soportadas, capacidades soportadas, disponibilidad, límites a nivel de cuenta y precios en créditos.
Endpoint: GET /v1/models
Propósito: Listar los modelos disponibles para la cuenta actual.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Matriz de capacidades
| Capacidad | Descripción | Usado comúnmente por |
|---|---|---|
streaming | Soporta transmisión mediante eventos enviados por el servidor. | Apps de chat, agentes de programación, UX en tiempo real. |
tool_calling | Soporta llamada a herramientas o funciones. | Agentes, automatización de flujos de trabajo, asistentes de programación. |
structured_outputs | Soporta salidas restringidas por esquema o JSON. | Extracción de datos, automatización de flujos, apps empresariales. |
json_mode | Puede devolver salida en formato JSON. | Respuestas estructuradas ligeras. |
vision | Acepta entrada de imágenes. | Chat multimodal, análisis de UI, capturas de documentos. |
prompt_caching | Soporta caché de entrada o reutilización de contexto. | Agentes de contexto largo, prompts del sistema repetidos. |
reasoning | Soporta controles explícitos de razonamiento cuando estén disponibles. | Planificación compleja, programación, flujos de análisis. |
logprobs | Soporta salida de probabilidad de tokens. | Evaluación, clasificación, flujos avanzados de NLP. |
Matriz de compatibilidad de familias de API
| Familia de API | Texto | Entrada de visión | Llamada a herramientas | Salida estructurada | Transmisión | Notas |
|---|---|---|---|---|---|---|
| OpenAI Chat Completions | Sí | Depende del modelo | Depende del modelo | Depende del modelo | Sí | Mejor opción por defecto para agentes y SDKs compatibles con OpenAI. |
| OpenAI Responses | Sí | Depende del modelo | Depende del modelo | Depende del modelo | Sí | Recomendado para flujos de agentes más nuevos de estilo OpenAI. |
| Anthropic Messages | Sí | Depende del modelo | Depende del modelo | Depende del modelo | Sí | Mejor para clientes compatibles con Claude y Claude Code. |
| BasicRouter image generation | No | Depende del modelo | No | No | No | Usa sondeo asíncrono de tareas o webhook. |
| BasicRouter video generation | No | Depende del modelo | No | No | No | Usa sondeo asíncrono de tareas o webhook. |
Autenticación
Cada solicitud API usa un token bearer. Guarde las claves en variables de entorno del lado del servidor, rótelas cuando cambie el acceso del equipo y registre los IDs de solicitud para depuración.
| Encabezado | Valor | Notas |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Obligatorio para cada solicitud. |
Content-Type | application/json | Obligatorio para cuerpos de solicitud JSON. |
Recomendaciones de seguridad de claves
- Mantenga las claves API en el servidor. No exponga las claves en código de cliente del navegador o móvil.
- Use claves separadas para desarrollo, staging, producción e integraciones de terceros.
- Limite las claves por entorno, servicio, cliente o inquilino cuando esté disponible.
- Rote las claves tras la salida de empleados, cambios de acceso de proveedores o sospecha de fuga.
- Guarde las claves en gestores de secretos o variables de entorno, no en código fuente.
Agentes de programación
BasicRouter funciona con agentes de programación y herramientas de desarrollo de IA
que soportan endpoints API compatibles con OpenAI o Anthropic. Use alias de enrutamiento
como mwf/coding-auto para que BasicRouter pueda enrutar al mejor modelo
de programación disponible sin requerir que los desarrolladores cambien la configuración
de la herramienta.
Configuración genérica compatible con OpenAI
Use esta configuración para Cursor, Codex, Hermes, OpenClaw, Continue, Aider, Cline, agentes basados en LangChain, agentes basados en LlamaIndex y runtimes de agentes personalizados compatibles con OpenAI.
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Configuración genérica compatible con Anthropic
Use esta configuración para clientes y herramientas compatibles con Claude que esperan el formato Anthropic Messages.
export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
Modelos de agente recomendados
| Caso de uso | Alias recomendado | Requisitos |
|---|---|---|
| Programación general | mwf/coding-auto | Llamada a herramientas, streaming, fuerte capacidad de programación. |
| Chat de programación rápido | mwf/coding-fast | Baja latencia y streaming. |
| Análisis de repositorios grandes | mwf/coding-long | Contexto largo y salida estable. |
| Asistente de programación sensible al costo | mwf/low-cost | Precio más bajo y calidad de programación aceptable. |
| Captura de UI / programación con visión | mwf/vision-chat | Entrada de visión y salida de texto. |
Guía rápida de Cursor
Use el endpoint compatible con OpenAI.
Base URL: https://api.basicrouter.ai/api/v1
API Key: BASICROUTER_API_KEY
Model: mwf/coding-auto
Pasos recomendados:
- Abra la configuración de Cursor.
- Agregue o habilite la configuración de clave API compatible con OpenAI.
- Establezca la URL base de OpenAI en
https://api.basicrouter.ai/api/v1. - Agregue un modelo personalizado como
mwf/coding-auto,mwf/coding-fastomwf/coding-long. - Use un modelo que soporte streaming y llamada a herramientas para el mejor comportamiento del agente.
Solución de problemas:
| Problema | Solución sugerida |
|---|---|
| Modelo no mostrado | Agregue el nombre del modelo manualmente como un modelo personalizado. |
| Falla la llamada a herramientas | Use un modelo con tool_calling: true en la página de Modelos. |
| Streaming interrumpido | Reintente con backoff o use un alias de enrutamiento con respaldo. |
| Error 401 | Verifique la clave API y la URL base. |
| Error 404 de modelo | Confirme que el modelo esté habilitado para la cuenta. |
Guía rápida de Claude Code
Use el endpoint de puerta de enlace compatible con Anthropic.
export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
BasicRouter soporta esta ruta compatible con Anthropic para Claude Code y compatibilidad con el SDK de Anthropic:
POST /api/v1/messages
Requisitos recomendados:
| Requisito | Motivo |
|---|---|
| Forma de solicitud compatible con Anthropic Messages | Claude Code espera mensajes estilo Anthropic. |
| Soporte de streaming | Claude Code depende de la UX de streaming. |
| Soporte de llamada a herramientas | Requerido para flujos de trabajo de programación agéntica. |
| Contexto largo | Útil para tareas a nivel de repositorio. |
| Respaldos estables | Útil para sesiones de programación largas. |
Guía rápida de Codex
Use BasicRouter como proveedor de modelos personalizado compatible con OpenAI.
Configuración de proveedor de ejemplo:
[model_providers.basicrouter]
name = "BasicRouter"
base_url = "https://api.basicrouter.ai/api/v1"
env_key = "BASICROUTER_API_KEY"
wire_api = "responses"
model_provider = "basicrouter"
model = "mwf/coding-auto"
Variable de entorno:
export BASICROUTER_API_KEY="br_xxx"
Modelos recomendados:
| Modelo | Caso de uso |
|---|---|
mwf/coding-auto | Modelo de agente de programación predeterminado. |
mwf/coding-long | Contexto de repositorios grandes. |
mwf/coding-fast | Iteración rápida y cambios pequeños. |
Solución de problemas:
| Problema | Solución sugerida |
|---|---|
| Error de autenticación | Confirme que env_key apunta a BASICROUTER_API_KEY. |
| Modelo no encontrado | Agregue el alias en la Consola de BasicRouter o use un ID de modelo directo. |
| Error de Responses API | Use wire_api = "responses" solo para modelos y endpoints
que soporten Responses. |
| Modelo solo de Chat Completions | Cambie a una wire API compatible con chat si el cliente lo soporta. |
Guía rápida de Hermes
Use el endpoint compatible con OpenAI a menos que su despliegue de Hermes esté configurado para otro protocolo.
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Política de modelo recomendada:
| Carga de trabajo de Hermes | Modelo |
|---|---|
| Generación de código general | mwf/coding-auto |
| Ejecución de tareas de baja latencia | mwf/coding-fast |
| Escaneo de repositorios de contexto largo | mwf/coding-long |
| Tareas en segundo plano sensibles al costo | mwf/low-cost |
Guía rápida de OpenClaw
Use el endpoint compatible con OpenAI para la configuración de runtime de agente estilo OpenAI.
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Si OpenClaw soporta múltiples proveedores, configure BasicRouter como proveedor compatible con OpenAI y use alias de enrutamiento de BasicRouter para la selección de modelos.
{
"provider": "openai-compatible",
"base_url": "https://api.basicrouter.ai/api/v1",
"api_key_env": "BASICROUTER_API_KEY",
"model": "mwf/coding-auto"
}
Lista de verificación de compatibilidad de agentes
| Capacidad | Requerida para |
|---|---|
| Streaming | Buena UX en terminal/editor. |
| Llamada a herramientas | Programación agéntica, ediciones de archivos, ejecución de comandos. |
| Contexto largo | Repositorios grandes y cambios en múltiples archivos. |
| Salidas estructuradas | Planificación, descomposición de tareas, flujos de trabajo automatizados. |
| Entrada de visión | Análisis de capturas de UI y flujos de trabajo de diseño a código. |
| Respaldo | Estabilidad de producción y tareas de larga duración. |
Uso de la Consola
La Consola de BasicRouter es el plano de control operativo para el acceso API, la disponibilidad de modelos, las políticas de enrutamiento, la visibilidad de uso y la administración de facturación. Ofrece a los administradores de cuenta una vista centralizada de claves, modelos, solicitudes, créditos y controles a nivel de cuenta para el tráfico de modelos en producción.
Gestión de claves API
Cree, rote, revoque y etiquete claves API desde la consola. Use claves separadas para desarrollo, staging, producción y servicios individuales para que el uso pueda ser auditado y aislado por entorno o aplicación.
| Práctica | Descripción |
|---|---|
| Separar entornos | Use diferentes claves API para tráfico de desarrollo, staging y producción. |
| Use etiquetas descriptivas | Etiquete las claves por aplicación, servicio, entorno o integración. |
| Rotar regularmente | Rote las claves cuando cambie el acceso o cuando las credenciales puedan haber sido expuestas. |
| Evitar exposición en el cliente | Mantenga las claves API solo en sistemas del lado del servidor. No exponga las claves en código de cliente del navegador o móvil. |
| Monitorear uso de claves | Revise el volumen de solicitudes, el consumo de créditos y los patrones de error por clave. |
Lista de modelos
Use la página de Modelos para revisar los modelos disponibles para la cuenta. Cada entrada de modelo puede incluir proveedor, proveedor de servicio, modalidad, familias de API soportadas, longitud de contexto, indicadores de capacidad, estado de disponibilidad e información de precios.
| Filtro | Propósito |
|---|---|
| Proveedor | Filtrar por proveedor de modelo como OpenAI, Anthropic, Google, Qwen, DeepSeek u otros proveedores. |
| Proveedor de servicio | Filtrar por proveedor de servicio o proveedor de nube. |
| Modalidad | Filtrar por soporte de texto, imagen, video, embedding, audio o multimodal. |
| Capacidad | Filtrar por streaming, llamada a herramientas, salidas estructuradas, visión, caché de prompts o soporte de razonamiento. |
| Disponibilidad | Identificar modelos que están actualmente disponibles para la cuenta. |
Para aplicaciones en producción, verifique las capacidades del modelo antes de habilitar el tráfico. Algunos parámetros y características dependen del modelo y pueden no estar soportados en todas las familias de API.
Uso y registros
La vista de Uso y Registros proporciona visibilidad operativa del tráfico API. Los equipos pueden inspeccionar el volumen de solicitudes, los modelos seleccionados, los destinos de enrutamiento resueltos, el consumo de créditos, la latencia, los códigos de error y los IDs de solicitud.
- Solucionar solicitudes fallidas.
- Identificar cargas de trabajo de alto costo.
- Comparar el uso de modelos entre aplicaciones y entornos.
- Validar el comportamiento de enrutamiento y respaldo.
- Investigar problemas de latencia o disponibilidad del proveedor.
- Proporcionar IDs de solicitud al contactar con soporte.
Cada respuesta API incluye o expone un ID de solicitud de BasicRouter. Guarde este ID en los registros de su aplicación para hacer que la depuración en producción y la escalada de soporte sean más eficientes.
Respaldo
El respaldo es el mecanismo de resiliencia de BasicRouter. Cuando el modelo principal o la política de enrutamiento falla, el sistema cambia automáticamente a un modelo de respaldo para seguir procesando la solicitud. Esto mantiene su aplicación receptiva y minimiza el riesgo de interrupción del servicio.
El respaldo actúa como una red de seguridad, manteniendo su aplicación funcionando sin problemas incluso cuando ocurre una falla de modelo, un límite de cuota o una fluctuación de red.
Por qué importa el respaldo
En producción, los servicios de modelos pueden encontrar varios problemas impredecibles:
- Falla del servicio de modelo: la API de origen queda temporalmente no disponible o se agota el tiempo de espera.
- Fluctuación de rendimiento: una alta carga del modelo provoca respuestas lentas o fallidas.
- Falla de enrutamiento: todos los modelos candidatos seleccionados por el enrutamiento inteligente quedan no disponibles.
El respaldo mantiene su aplicación disponible proporcionando una ruta de respaldo confiable.
Ventajas principales
| Ventaja | Descripción |
|---|---|
| Alta disponibilidad | La conmutación por error automática mantiene el servicio en ejecución y reduce el impacto de las interrupciones. |
| Cambio transparente | El sistema cambia de modelo automáticamente — no se requieren cambios en el código de la aplicación. |
| Configuración flexible | Soporta tanto configuración por solicitud como a nivel de cuenta para diferentes casos de uso. |
| Optimización de costos | Elija un modelo más rentable como respaldo para controlar los costos de emergencia. |
| Gestión centralizada | Configure una vez a nivel de cuenta y se aplica automáticamente a cada solicitud. |
Configuración global de modelo de respaldo
BasicRouter permite configurar un modelo de respaldo global desde el backend de la consola. Todas las solicitudes usan automáticamente este modelo como respaldo cuando fallan.
Cómo configurarlo:
- Vaya a la página de configuración de estrategia de BasicRouter.
- Busque el ajuste Modelo de respaldo predeterminado.
- Seleccione su modelo de respaldo global de la lista desplegable.
- Guarde el ajuste para aplicarlo inmediatamente.
Ventajas de la configuración global:
- Sin cambios en el código: configure una vez y se aplica globalmente, sin necesidad de repetir el ajuste en cada solicitud.
- Gestión centralizada: administre la política de respaldo en un solo lugar para facilitar el ajuste y monitoreo.
- Mantenimiento simplificado: reduce la complejidad del código y la posibilidad de errores de configuración.
- Reemplazo flexible: la configuración de respaldo a nivel de solicitud tiene prioridad y puede anular el ajuste global para escenarios específicos.
Configuración de respaldo a nivel de solicitud
Para escenarios de negocio específicos, puede especificar un modelo de respaldo en una solicitud individual para anular la configuración global.
Especifique el modelo de respaldo con el parámetro
router.fallBackModels:
{
"model": "claude-sonnet-4",
"messages": [
{
"role": "user",
"content": "Explain what quantum computing is"
}
],
"router": {
"fallBackModels": ["glm-5.2"]
}
}
Reglas de prioridad
Cuando hay múltiples configuraciones de respaldo, la prioridad va de mayor a menor:
router.fallBackModelsa nivel de solicitud: el modelo de respaldo especificado en una solicitud individual.- Modelo de respaldo predeterminado global: el modelo de respaldo global configurado en la consola.
- Sin respaldo: si no se configura ninguno, la solicitud devuelve un error al fallar.
- Si todos los modelos de respaldo fallan, el sistema devuelve el motivo de falla del último modelo intentado.
- Cuando ocurre un respaldo, la respuesta indica el modelo realmente utilizado, lo que facilita el monitoreo y análisis.
Administración de cuenta
Dependiendo del tipo de cuenta, la consola puede incluir habilitación de modelos a nivel de cuenta, controles de revendedor o distribuidor, configuración de facturación y ajustes de acceso. Los administradores pueden usar estos controles para alinear el acceso a modelos, la visibilidad de uso y la responsabilidad de facturación con aplicaciones, cuentas de cliente o unidades de negocio.
Lista de verificación de operaciones de producción
| Elemento | Recomendación |
|---|---|
| Claves API | Use claves de producción dedicadas con etiquetas claras. |
| Modelos | Confirme la disponibilidad del modelo, los precios, la longitud de contexto y las capacidades requeridas. |
| Enrutamiento | Configure alias de enrutamiento o políticas de respaldo para cargas de trabajo críticas. |
| Registros | Asegúrese de que los IDs de solicitud se capturen en los registros de la aplicación. |
| Facturación | Confirme el saldo del monedero, el estado del plan y las reglas de deducción de créditos. |
| Límites de velocidad | Revise los límites RPM, TPM, concurrencia y tareas multimedia a nivel de cuenta. |
| Alertas | Monitoree el crecimiento de uso, el saldo de créditos, los errores y la disponibilidad del proveedor. |
Facturación y créditos
BasicRouter usa un modelo de facturación basado en créditos para cargas de trabajo de texto, imagen, video y otros modelos soportados. Los créditos proporcionan una unidad unificada para el uso de múltiples modelos y proveedores, de modo que los equipos puedan gestionar el consumo de manera consistente entre modalidades y familias de API.
Los precios detallados de los modelos están disponibles en la página de Modelos o a través de las APIs de metadatos de modelos. Los precios pueden variar según el modelo, proveedor, modalidad, resolución, tipo de token, longitud de salida, duración de la tarea, tipo de cuenta y acuerdo comercial.
Recargar y monedero
Las cuentas pueden añadir créditos de monedero de pago por uso para un uso flexible. Los créditos del monedero se usan después de que se hayan consumido los créditos del plan mensual y los paquetes de recursos, a menos que se aplique una regla de facturación personalizada a la cuenta.
Los créditos del monedero no expiran a menos que se especifique lo contrario en los términos comerciales aplicables. Se cobra una tarifa de servicio al recargar el monedero de pago por uso.
Planes mensuales y paquetes de recursos
Cada usuario o cuenta puede seleccionar un plan mensual activo. Los planes mensuales proporcionan una cantidad definida de capacidad de uso, términos comerciales y configuración de acceso a nivel de cuenta para el período de facturación.
Los usuarios también pueden comprar múltiples paquetes de recursos para capacidad de uso adicional. Los paquetes de recursos pueden separar el uso comprometido del saldo del monedero de pago por uso y son útiles para uso intensivo de texto, imagen, video o cargas de trabajo dedicadas.
Orden de deducción
A menos que se configuren reglas de facturación personalizadas, los créditos se deducen en el siguiente orden:
| Prioridad | Origen de crédito | Descripción |
|---|---|---|
| 1 | Plan mensual | La capacidad de uso mensual incluida se consume primero. |
| 2 | Paquetes de recursos | Los paquetes comprados adicionalmente se consumen después de los créditos del plan mensual. |
| 3 | Monedero de pago por uso | El saldo del monedero se consume después de los créditos del plan y paquetes de recursos. |
Para cuentas con términos comerciales personalizados, el orden de deducción, las reglas de expiración, el uso incluido y los precios pueden diferir. Las reglas específicas de cuenta se muestran en la consola o se proporcionan a través del acuerdo comercial.
Precios personalizados
Los precios pueden personalizarse para cada usuario o cuenta. Los clientes empresariales, las cuentas de revendedor, las cuentas de distribuidor y los clientes de alto volumen pueden ser elegibles para precios personalizados. Contacte con ventas para obtener una cotización.
Los precios personalizados pueden configurarse por cuenta, modelo, proveedor, modalidad, región, volumen de uso o acuerdo comercial. Cuando se habilitan precios personalizados, la consola y las APIs de facturación reflejan los precios y reglas de deducción específicos de la cuenta cuando estén disponibles.
Unidades de precio
Diferentes modalidades de modelo usan diferentes unidades de medida. BasicRouter convierte estas unidades en créditos según las reglas de precios del modelo.
| Modalidad | Base común de precios |
|---|---|
| Texto | Tokens de entrada, tokens de salida, tokens de lectura en caché, tokens de escritura en caché, tokens de razonamiento o categorías de token específicas del modelo. |
| Imagen | Modelo, resolución, número de imágenes generadas, uso de imagen de entrada, modo de edición o ajuste de calidad. |
| Video | Modelo, resolución de salida, segundos generados, relación de aspecto, uso de imagen o video de entrada, y tipo de tarea. |
| Embeddings | Tokens de entrada o número de registros de embedding. |
| Audio | Duración de entrada, duración de salida, longitud de transcripción o unidades de audio específicas del modelo. |
Las unidades de precio pueden variar según el modelo. Consulte siempre la página de detalles del modelo o los metadatos de precios antes de habilitar un modelo en producción.
Atribución de uso
El uso de BasicRouter puede revisarse por cuenta, clave API, modelo, modalidad o rango de tiempo. Esto permite a los equipos atribuir costos a aplicaciones, entornos, clientes o unidades de negocio internas.
| Dimensión | Descripción |
|---|---|
| Clave API | Agrupar uso por aplicación, servicio o entorno. |
| Modelo | Comparar costo y volumen por modelo seleccionado. |
| Modelo resuelto | Revisar el modelo realmente usado después del enrutamiento o respaldo. |
| Modalidad | Separar uso de texto, imagen, video, embedding y audio. |
| Rango de tiempo | Revisar períodos de reporte diarios, mensuales o personalizados. |
| Metadatos | Agrupar uso por metadatos personalizados de solicitud como ID de cliente, ID de inquilino, ID de usuario o entorno. |
Saldo de créditos
Verifique cuántos créditos están disponibles en su cuenta. El saldo se divide en tres monederos que se deducen en orden: la asignación del plan mensual, los paquetes de recursos comprados y el monedero de pago por uso. También está disponible un total combinado de recursos (plan mensual + paquetes de recursos, excluyendo pago por uso) para rastrear el uso incluido separadamente del gasto de recarga.
Para obtener esto mediante programación, consulte
GET /v1/billing/balance en la Referencia
API.
Detalles de uso
Revise una lista paginada y cronológica de registros de uso individuales para reportes, monitoreo y asignación interna de costos. Cada registro muestra el modelo, el tipo de modelo (texto, imagen o video), los créditos deducidos y un desglose de qué monedero se usó para cada deducción. Los resultados pueden filtrarse a un rango de tiempo específico.
Para obtener esto mediante programación, consulte
GET /v1/usage en la Referencia API.
Historial de transacciones
Use el historial de transacciones para revisar movimientos de créditos, incluyendo recargas, asignaciones de planes, concesiones de paquetes de recursos, deducciones de uso, ajustes y correcciones administrativas.
Para obtener esto mediante programación, consulte
GET /v1/billing/transactions en la
Referencia API.
Solicitudes fallidas y reembolsos
Los errores de validación, los errores de autenticación y los errores de permisos generalmente no se facturan porque no ocurre ejecución del modelo. Las solicitudes que llegan a un modelo de origen o que generan salida parcial pueden consumir créditos dependiendo del modelo, el proveedor y el estado de la respuesta.
Para tareas asíncronas de imagen y video, el comportamiento de facturación depende de si la tarea fue aceptada, iniciada, completada, fallida o cancelada. La respuesta de detalle de la tarea incluye información de uso cuando se han consumido créditos.
Las recargas, los planes mensuales, los paquetes de recursos y los créditos consumidos no son reembolsables a menos que se especifique lo contrario en el acuerdo comercial aplicable o lo exija la ley.
Referencia API
Convenciones comunes
URL base
Todos los endpoints se sirven bajo el prefijo /v1.
Autenticación
Las llamadas a los endpoints /v1/* usan autenticación de
Clave API (no JWT). La clave API se pasa mediante el siguiente
encabezado:
| Encabezado | Formato | Descripción |
|---|---|---|
Authorization | Bearer <api_key> | Estilo OpenAI. El endpoint compatible con Anthropic también acepta
x-api-key con anthropic-version: 2023-06-01. |
Las claves faltantes o inválidas devuelven 401.
Verificación previa de saldo
Todos los endpoints de llamada a modelos ejecutan una verificación previa de saldo antes de la ejecución:
- Un saldo insuficiente devuelve
Insufficient credit, asignado a:- Protocolo OpenAI: HTTP
400,code = insufficient_quota - Protocolo Anthropic: HTTP
402,type = billing_error
- Protocolo OpenAI: HTTP
- Algunos endpoints también estiman un costo mínimo por modelo para una segunda verificación previa.
POST https://api.basicrouter.ai/api/v1/chat/completions
Endpoint compatible con OpenAI Chat Completions. Soporta streaming y no streaming, llamadas a herramientas, modo JSON y entrada multimodal.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
model | String | Sí | Nombre del modelo. |
messages | Message[] | Sí | Mensajes de la conversación. |
stream | Boolean | No | Modo streaming, predeterminado false. |
temperature | Double | No | Temperatura de muestreo. |
max_tokens | Integer | No | Máximo de tokens de salida. |
top_p | Double | No | Muestreo de núcleo. |
presence_penalty | Double | No | — |
frequency_penalty | Double | No | — |
tools | Tool[] | No | Definiciones de herramientas. |
tool_choice | String|Object | No | auto / none / required / función
específica. |
response_format | Object | No | {type, json_schema:{name,schema,strict}};
text/json_object/json_schema. |
parallel_tool_calls | Boolean | No | — |
metadata | Map | No | Metadatos de paso a través. |
Campos de Message:
| Campo | Tipo | Descripción |
|---|---|---|
role | String | system / user / assistant /
tool. |
content | String|Array | Texto plano o arreglo de bloques de contenido multimodal
([{type:"text",text},{type:"image_url",image_url:{url}}]). |
tool_call_id | String | Vincula a tool_calls cuando role=tool. |
tool_calls | ToolCall[] | Presente cuando role=assistant hace llamadas a herramientas. |
| Campo | Tipo | Descripción |
|---|---|---|
type | String | Fijo function. |
function | Object | Definición de función. |
function.name | String | Nombre de la función. |
function.description | String | Descripción de la función. |
function.parameters | Object | JSON Schema para las entradas. |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/chat/completions \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}],
"stream": false,
"temperature": 0.7
}'
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1721380000,
"model": "glm-5.2",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Hangzhou is ..."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 12, "completion_tokens": 18, "total_tokens": 30}
}
Campos de respuesta (no streaming):
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID de completación. |
object | String | Fijo chat.completion. |
created | Long | Marca de tiempo de creación (segundos). |
model | String | Nombre del modelo. |
choices | Choice[] | {index, message:{role, content, tool_calls?}, finish_reason}. |
usage | Object | {prompt_tokens, completion_tokens, total_tokens}. |
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID de llamada a herramienta. |
type | String | Fijo function. |
function | Object | Detalles de la llamada a función. |
function.name | String | Nombre de la función. |
function.arguments | Object | Argumentos de la función. |
Ejemplo de respuesta en streaming:
data: {"object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant","content":"..."}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"..."}}]}
data: [DONE]
POST https://api.basicrouter.ai/api/v1/responses
Endpoint compatible con OpenAI Responses. Usa input en lugar de
messages, instructions en lugar de un mensaje del sistema, y
un bloque text en lugar de response_format.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
model | String | Sí | Nombre del modelo. |
input | String|Array | Sí | Cadena plana (mensaje de usuario) o arreglo de objetos de mensaje. |
instructions | String | No | Prompt del sistema. |
stream | Boolean | No | Predeterminado false. |
max_output_tokens | Integer | No | Máximo de tokens de salida. |
temperature | Double | No | Predeterminado 1. |
top_p | Double | No | — |
tools | Tool[] | No | Nivel superior {type, name, description, parameters}. |
tool_choice | String|Object | No | auto/none/required/{type,name}. |
text | Object | No | {format:{type, name, schema, strict}};
text/json_object/json_schema. |
metadata | Map | No | — |
previous_response_id | String | No | ID de respuesta previa para conversación multi-turno. |
parallel_tool_calls | Boolean | No | — |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/responses \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"input": "Describe Hangzhou in one sentence.",
"instructions": "Be concise.",
"stream": false
}'
{
"id": "resp_xxx",
"object": "response",
"model": "glm-5.2",
"status": "completed",
"created_at": 1721380000,
"output": [
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"content": [{"type": "output_text", "text": "Hangzhou is ..."}],
"status": "completed"
}
],
"usage": {"input_tokens": 12, "output_tokens": 18, "total_tokens": 30}
}
Campos de respuesta (no streaming):
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID de respuesta. |
object | String | Fijo response. |
model | String | Nombre del modelo. |
status | String | por ejemplo completed. |
created_at | Long | Marca de tiempo de creación (segundos). |
output | Array | Elementos de salida. Elementos de mensaje:
{id, type:"message", role, content:[{type:"output_text",
text}], status}. Elementos de llamada a herramienta:
{type:"function_call", id, name, call_id, arguments, status}. |
usage | Object | {input_tokens, output_tokens, total_tokens}. Para modelos Claude,
input_tokens incluye cache_read y
output_tokens incluye cache_write. |
El streaming sigue los eventos de la API de Responses:
| Evento | Descripción |
|---|---|
response.created | Inicio del flujo de respuesta. |
response.output_text.delta | Actualización incremental de salida de texto. |
response.completed | Fin del flujo de respuesta. |
POST https://api.basicrouter.ai/api/v1/messages
Endpoint compatible con Anthropic Messages. Acepta encabezados x-api-key y
anthropic-version: 2023-06-01. Los bloques de contenido soportan
text, image, tool_use, tool_result,
thinking y redacted_thinking.
| Campo | Tipo | Requerido | Campo JSON | Descripción |
|---|---|---|---|---|
model | String | Sí | model | Nombre del modelo. |
messages | Message[] | Sí | messages | Mensajes de la conversación. |
system | String|Array | No | system | Prompt del sistema, cadena o [{type,text}]. |
maxTokens | Integer | Sí | max_tokens | Máximo de tokens de salida. |
stream | Boolean | No | stream | Streaming. |
temperature | Double | No | temperature | — |
topP | Double | No | top_p | — |
topK | Integer | No | top_k | — |
tools | Tool[] | No | tools | Definiciones de herramientas (input_schema). |
toolChoice | Object | No | tool_choice | — |
metadata | Map | No | metadata | — |
thinking | Object | No | thinking | Configuración de pensamiento extendido. |
stopSequences | Object | No | stop_sequences | — |
anthropicBeta | Object | No | anthropic_beta | Encabezado de función beta. |
| Campo | Tipo | Descripción |
|---|---|---|
role | String | Rol del mensaje, por ejemplo user / assistant. |
content | String|ContentBlock[] | Texto plano o un arreglo de bloques de contenido. |
| Campo | Tipo | Descripción |
|---|---|---|
type | String | Uno de text, image, tool_use,
tool_result, thinking,
redacted_thinking. |
text | String | Presente cuando el tipo es text. |
source | Object | Presente cuando el tipo es image. |
Ejemplos de bloque de imagen:
{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }
| Campo | Tipo | Descripción |
|---|---|---|
name | String | Nombre de la función. |
description | String | Descripción de la función. |
input_schema | Object | JSON Schema para las entradas. |
cache_control | Object | Control de caché opcional. |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/messages \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-4.6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}]
}'
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4.6",
"content": [{"type": "text", "text": "Hangzhou is ..."}],
"stop_reason": "end_turn",
"usage": {"input_tokens": 12, "output_tokens": 18}
}
Campos de respuesta (no streaming):
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID del mensaje. |
type | String | Fijo message. |
role | String | Fijo assistant. |
model | String | Nombre del modelo. |
content | ContentBlock[] | Bloques de contenido de la respuesta (por ejemplo
{type:"text", text},
{type:"tool_use", ...}). |
stop_reason | String | por ejemplo end_turn, tool_use,
max_tokens. |
usage | Object | {input_tokens, output_tokens}. |
| Evento | Descripción |
|---|---|
message_start | Inicio del flujo de mensajes. |
content_block_start | Inicio de un nuevo bloque de contenido. |
content_block_delta | Actualización incremental para un bloque de contenido. |
content_block_stop | Fin de un bloque de contenido. |
message_delta | Actualización incremental para el mensaje. |
message_stop | Fin del flujo de mensajes. |
GET https://api.basicrouter.ai/api/v1/models
Devuelve todos los modelos API en línea y habilitados.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"object": "list",
"data": [
{
"id": "glm-5.2",
"object": "model",
"display_name": "glm-5.2",
"created": 1721380000,
"owned_by": "Zai",
"input_modalities": ["text", "image"],
"output_modalities": ["text"],
"context_length": 128000
}
]
}
Campos de cada entrada de modelo (data[]):
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID del modelo. |
object | String | Fijo model. |
display_name | String | Nombre para mostrar. |
created | Long | Marca de tiempo de creación (segundos). |
owned_by | String | Propietario / proveedor. |
input_modalities | String[] | por ejemplo ["text","image"]. |
output_modalities | String[] | por ejemplo ["text"]. |
context_length | Integer | Longitud máxima de contexto. |
GET https://api.basicrouter.ai/api/v1/models/{model}
Devuelve un único modelo con la misma estructura que una entrada de lista. Devuelve HTTP 404 cuando el modelo no existe.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models/gpt-5.5 \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Respuesta exitosa: un objeto de modelo único con los mismos campos que una entrada de
lista de /v1/models.
Cuando el modelo no existe, devuelve HTTP 404:
{"error": {"message": "The model 'xxx' does not exist", "type": "invalid_request_error", "code": "invalid_model_error"}}
GET https://api.basicrouter.ai/api/v1/image-models
Consulta las resoluciones, relaciones y cantidades máximas soportadas por un modelo de
imagen antes de llamar a /v1/image-generations. No requiere
autenticación.
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID del modelo. |
object | String | Fijo image_model. |
displayName | String | Nombre para mostrar. |
description | String | Descripción del modelo. |
icon | String | URL del icono. |
created | Long | Marca de tiempo de creación (segundos). |
maxCount | Integer | Máximo de imágenes por solicitud. |
fileMax | Integer | Máximo de imágenes de referencia. |
resolutions | String[] | Resoluciones soportadas, por ejemplo
["720p","1080p"]. |
ratios | String[] | Relaciones de aspecto soportadas, por ejemplo
["1:1","3:2"]. |
curl --request GET \
--url https://api.basicrouter.ai/api/v1/image-models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"object": "list",
"data": [
{
"id": "gpt-image-2",
"object": "image_model",
"displayName": "GPT Image 1",
"description": "...",
"icon": "...",
"created": 1721380000,
"maxCount": 4,
"fileMax": 10,
"resolutions": ["720p", "1080p"],
"ratios": ["1:1", "3:2"]
}
]
}
GET https://api.basicrouter.ai/api/v1/video-models
Consulta los valores de videoType soportados, el rango de duración, las
resoluciones y las relaciones de un modelo de video antes de llamar a
/v1/video-generations. No requiere autenticación.
| Campo | Tipo | Descripción |
|---|---|---|
id | String | ID del modelo. |
object | String | Fijo video_model. |
displayName | String | Nombre para mostrar. |
description | String | Descripción del modelo. |
icon | String | URL del icono. |
created | Long | Marca de tiempo de creación (segundos). |
allowedVideoTypes | VideoTypeOption[] | Lista de videoType soportados. |
videoDurationMin | Integer | Segundos mínimos por clip. |
videoDurationMax | Integer | Segundos máximos por clip. |
videoDurationSuggest | Integer[] | Pasos de duración recomendados, por ejemplo [5,8,10]. |
resolutions | String[] | Resoluciones soportadas. |
ratios | String[] | Relaciones de aspecto soportadas. |
resolutionOptions | ResolutionOption[] | Combinaciones estructuradas de resolución+relación+tamaño. |
fileMax | Integer | Máximo de recursos de referencia. |
Campos de VideoTypeOption:
| Campo | Tipo | Descripción |
|---|---|---|
code | Integer | El valor de videoType que se pasa a
/v1/video-generations. |
name | String | Nombre localizado del tipo (text-to-video / image-to-video / ...). |
curl --request GET \
--url https://api.basicrouter.ai/api/v1/video-models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"object": "list",
"data": [
{
"id": "sora-2",
"object": "video_model",
"displayName": "Sora 2",
"description": "...",
"icon": "...",
"created": 1721380000,
"allowedVideoTypes": [
{"code": 1, "name": "text-to-video"},
{"code": 2, "name": "image-to-video"},
{"code": 3, "name": "image-to-video (first/last frame)"}
],
"videoDurationMin": 5,
"videoDurationMax": 10,
"videoDurationSuggest": [5, 8, 10],
"resolutions": ["1080p", "720p"],
"ratios": ["16:9", "9:16"],
"fileMax": 5
}
]
}
POST https://api.basicrouter.ai/api/v1/image-generations
Envía asíncronamente una tarea de generación de imágenes. Devuelve un
taskId inmediatamente; recupere el resultado consultando
GET /v1/image-generations/{taskId} o a través de un webhook
callbackUrl.
El model, los valores soportados de resolution /
ratio, el límite superior de count y el límite de subida de
imágenes de referencia (fileMax) deben obtenerse primero de
GET /v1/image-models. Solo se aceptan los valores anunciados por la especificación de ese modelo.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
text | String | Sí | Prompt. |
model | String | Sí | Nombre del modelo. |
imageUrls | String[] | No | URLs de imágenes de referencia (image-to-image). |
count | Integer | No | Número de imágenes (≥0). |
resolution | String | No | Resolución (ver /v1/image-models). |
ratio | String | No | Relación de aspecto. |
callbackUrl | String | No | URL del webhook a nivel de tarea. |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/image-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": []
}'
{
"code": 200,
"message": "image task is commit",
"data": {"taskId": "img_xxx"}
}
Respuestas de error:
// Insufficient credit
{ "code": 500, "message": "Insufficient credit" }
// Model not found
{ "code": 404, "message": "Model not found: xxx" }
GET https://api.basicrouter.ai/api/v1/image-generations/{taskId}
Consulta una tarea de generación de imágenes. status es
pending / success / failed.
images es un arreglo de URLs de imágenes serializado en JSON;
text contiene cualquier descripción de texto adjunta por el modelo (por
ejemplo, salida multimodal de Gemini), null en caso contrario.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/image-generations/img_xxx \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"code": 200,
"message": "success",
"data": {
"taskId": "img_xxx",
"status": "success",
"errorMessage": null,
"images": "[\"https://.../1.png\"]",
"text": null
}
}
Campos de respuesta data:
| Campo | Tipo | Descripción |
|---|---|---|
taskId | String | ID de la tarea. |
status | String | pending / success / failed. |
errorMessage | String | Motivo de falla, null en caso de éxito. |
images | String | Arreglo de URLs de imágenes serializado en JSON, por ejemplo
"[\"https://.../1.png\"]". |
text | String | Descripción de texto adjunta por el modelo (por ejemplo, salida multimodal de
Gemini); null en caso contrario. |
Tarea no encontrada:
{ "code": 500, "message": "task not found" }
Si se proporcionó callbackUrl al enviar, el servidor envía el resultado
final success / failed a través del webhook con la misma
estructura de data.
Ejemplo completo (envío + consulta)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ImageGenerationExample {
private static final String BASE = "https://api.basicrouter.ai/api/v1";
private static final String API_KEY = System.getenv("BASICROUTER_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task.
String body = "{"
+ "\"model\":\"seedream-4.5\","
+ "\"text\":\"A cat drinking water by the river\","
+ "\"count\":1,"
+ "\"resolution\":\"2k\","
+ "\"ratio\":\"1:1\","
+ "\"imageUrls\":[]"
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status.
String status = "pending";
while ("pending".equals(status)) {
Thread.sleep(15_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
status = extract(poll.body(), "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("image generation failed: " + status);
}
// images is a JSON-stringified array of URLs.
String images = extract(pollResult(http, taskId), "images");
System.out.println("images = " + images);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
private static String pollResult(HttpClient http, String taskId) throws Exception {
return http.send(HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString()).body();
}
}
import os
import time
import requests
BASE = "https://api.basicrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['BASICROUTER_API_KEY']}"}
# 1. Submit the task.
resp = requests.post(
f"{BASE}/image-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": [],
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status.
while True:
time.sleep(15)
poll = requests.get(f"{BASE}/image-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"image generation failed: {data.get('errorMessage')}")
# images is a JSON-stringified array of URLs.
import json
images = json.loads(data["images"])
print(f"images = {images}")
POST https://api.basicrouter.ai/api/v1/video-generations
Envía asíncronamente una tarea de generación de video. Devuelve un
taskId inmediatamente; recupere el resultado consultando
GET /v1/video-generations/{taskId} o a través de un webhook
callbackUrl.
El model, los valores permitidos de videoType, el rango de
duración (videoDurationMin/Max), la resolution /
ratio soportadas y el límite de subida de recursos de referencia
(fileMax) deben obtenerse primero de
GET /v1/video-models. Solo se aceptan los códigos de videoType listados en
allowedVideoTypes de ese modelo.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
text | String | Sí | Prompt. |
model | String | Sí | Nombre del modelo. |
videoType | Integer | Sí | 1 text-to-video / 2 image-to-video (primer frame) / 3 image-to-video (primer y último frame) / 4 image-to-video (referencia) / 5 toda referencia. |
imageUrls | String[] | No | URLs de recursos de imagen. |
videoUrls | VideoUrl[]|String[] | No | URLs de recursos de video. |
audioUrls | String[] | No | URLs de recursos de audio. |
resolution | String | No | Resolución. |
ratio | String | No | Relación de aspecto. |
duration | Long | No | Segundos (>0). |
callbackUrl | String | No | URL del webhook a nivel de tarea. |
Ejemplos para cada videoType:
1. Texto a video (videoType=1)
Genera un video solo a partir de un prompt de texto; no se necesitan recursos de referencia.
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0"
}'
2. Imagen a video - primer frame (videoType=2)
Proporcione un único frame inicial en imageUrls; el modelo genera un video
que comienza desde ese frame.
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 2,
"text": "Happily shaking head",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": ["https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/first-frame.png"]
}'
3. Imagen a video - primer y último frame (videoType=3)
Proporcione tanto el primer como el último frame en imageUrls (orden:
[primero, último]); el modelo genera un video de transición entre los dos
frames.
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 3,
"text": "Put on the hat",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": [
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/first-frame.png",
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/last-frame.png"
]
}'
4. Imagen a video - referencia (videoType=4)
Proporcione una o más imágenes de referencia en imageUrls; el modelo usa
su estilo/contenido como referencia (no como primer/último frame forzado) para generar
el video.
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 4,
"text": "Two cats playing together",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "kling-v3-omni-video",
"imageUrls": [
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/ref-1.png",
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/ref-2.png"
]
}'
5. Toda referencia (videoType=5)
Referencias mixtas de imagen / video / audio. Referencie recursos por posición en el
prompt: la 1ª entrada en imageUrls es @图片 1, la 1ª en
videoUrls es @视频 1, la 1ª en audioUrls es
@音频 1. videoUrls también acepta cadenas de URL simples.
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 5,
"text": "Use the first-person framing of @视频 1 and @音频 1 as background music. First-person tea ad; start frame is @图片 1 ... end frame is @图片 2.",
"model": "seedance-2.0",
"imageUrls": [
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic1.jpg",
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic2.jpg"
],
"videoUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_tea_video1.mp4"],
"audioUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_audio/r2v_tea_audio1.mp3"],
"resolution": "1080p",
"ratio": "16:9",
"duration": 11
}'
Respuesta de envío (los cinco tipos):
{
"code": 200,
"message": "success",
"data": {"taskId": "vid_xxx"}
}
GET https://api.basicrouter.ai/api/v1/video-generations/{taskId}
Consulta una tarea de generación de video. status es
pending / success / failed;
videoUrl es la URL del video generado y lastFrameUrl es la URL
del último frame (escenarios de image-to-video).
curl --request GET \
--url https://api.basicrouter.ai/api/v1/video-generations/vid_xxx \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"code": 200,
"message": "success",
"data": {
"status": "success",
"videoUrl": "https://.../out.mp4",
"lastFrameUrl": null,
"message": null
}
}
Campos de respuesta data:
| Campo | Tipo | Descripción |
|---|---|---|
status | String | pending / success / failed. |
videoUrl | String | URL del video generado. |
lastFrameUrl | String | URL del último frame (escenarios de image-to-video); null en caso
contrario. |
message | String | Motivo de falla, null en caso de éxito. |
Si se proporcionó callbackUrl al enviar, el servidor envía el resultado
final a través del webhook con la misma estructura de data.
Ejemplo completo (envío + consulta)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class VideoGenerationExample {
private static final String BASE = "https://api.basicrouter.ai/api/v1";
private static final String API_KEY = System.getenv("BASICROUTER_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task (videoType=1: text-to-video).
String body = "{"
+ "\"videoType\":1,"
+ "\"text\":\"A cat jumping on a bed\","
+ "\"resolution\":\"480p\","
+ "\"ratio\":\"16:9\","
+ "\"duration\":4,"
+ "\"model\":\"seedance-2.0\""
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status. Video tasks take longer — poll every 20s.
String status = "pending";
String lastBody = null;
while ("pending".equals(status)) {
Thread.sleep(20_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
lastBody = poll.body();
status = extract(lastBody, "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("video generation failed: " + status);
}
String videoUrl = extract(lastBody, "videoUrl");
System.out.println("videoUrl = " + videoUrl);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
}
import os
import time
import requests
BASE = "https://api.basicrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['BASICROUTER_API_KEY']}"}
# 1. Submit the task (videoType=1: text-to-video).
resp = requests.post(
f"{BASE}/video-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status. Video tasks take longer — poll every 20s.
while True:
time.sleep(20)
poll = requests.get(f"{BASE}/video-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"video generation failed: {data.get('message')}")
print(f"videoUrl = {data['videoUrl']}")
if data.get("lastFrameUrl"):
print(f"lastFrameUrl = {data['lastFrameUrl']}")
GET https://api.basicrouter.ai/api/v1/billing/balance
Devuelve el saldo de la cuenta dividido en tres monederos: plan mensual, paquetes de recursos y crédito de pago por uso.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/billing/balance \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"totalCredit": 128.50,
"totalResourceCredit": 30.00,
"wallets": {
"monthlyPlan": {"id": "pkg_xxx", "credit": 50.00, "name": "Monthly plan"},
"resourcePacks": [
{"id": "rp_xxx", "credit": 30.00, "name": "Video resource pack"}
],
"payAsYouGo": 48.50
}
}
Campos de respuesta:
| Campo | Tipo | Descripción |
|---|---|---|
totalCredit | BigDecimal | Saldo total. |
totalResourceCredit | BigDecimal | Suma de los saldos de paquetes de recursos. |
wallets.monthlyPlan | WalletDetail | Plan mensual (null si no hay). |
wallets.resourcePacks | WalletDetail[] | Lista de paquetes de recursos. |
wallets.payAsYouGo | BigDecimal | Saldo de pago por uso. |
Campos de WalletDetailVO::
| Campo | Tipo | Descripción |
|---|---|---|
id | String | Id del monedero. |
credit | BigDecimal | Créditos del saldo. |
name | String | Nombre del monedero. |
GET https://api.basicrouter.ai/api/v1/usage
Detalles de facturación de llamadas a modelos paginadas, con instantánea por precio
(priceSnapshotId), ordenados por tiempo de creación del orden de forma
descendente. Solo se devuelven los registros de cobro normales (reason = model usage).
Parámetros de consulta:
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
page | Integer | No | 1 | Número de página, basado en 1. |
size | Integer | No | 20 | Tamaño de página (paginado por priceSnapshotId). |
startTime | LocalDateTime | No | — | Hora de inicio, formato yyyy-MM-ddTHH:mm:ss, filtra por
orderCreatedAt de la instantánea. |
endTime | LocalDateTime | No | — | Hora de fin, formato yyyy-MM-ddTHH:mm:ss. |
curl --request GET \
--url "https://api.basicrouter.ai/api/v1/usage?page=1&size=20&startTime=2026-07-01T00:00:00&endTime=2026-07-31T23:59:59" \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Contenedor de respuesta:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Campo | Tipo | Descripción |
|---|---|---|
records | UsageDetailVO[] | Registros de la página actual. |
total | Long | Conteo total. |
current | Long | Página actual. |
size | Long | Tamaño de página. |
pages | Long | Total de páginas. |
Campos de UsageDetailVO:
| Campo | Tipo | Descripción |
|---|---|---|
priceSnapshotId | String | Id de la instantánea de precio. |
taskId | String | Id de la tarea. |
credit | BigDecimal | Monto cobrado. |
model | String | Nombre del modelo. |
modelType | String | text / image / video. |
inputTokens | Long | Tokens de entrada; null para imagen/video. |
outputTokens | Long | Tokens de salida. |
totalTokens | Long | Total de tokens. |
cacheReadTokens | Long | Tokens leídos de caché. |
cacheWriteTokens | Long | Tokens escritos en caché. |
imageCount | Integer | Cantidad de imágenes; establecido para modelos de imagen. |
imageResolution | String | Resolución de imagen, p. ej. 720P. |
imageRatio | String | Relación de aspecto de imagen, p. ej. 1:1. |
videoResolution | String | Resolución de video, p. ej. 1080p. |
videoRatio | String | Relación de aspecto de video, p. ej. 16:9. |
videoDurationSec | Long | Duración del video en segundos. |
orderCreatedAt | LocalDateTime | Tiempo de creación del orden (orderCreatedAt de la
instantánea). |
creditDetails | CreditDetailItem[] | Detalles de orden bajo esta instantánea (de credit_order_t). |
Campos de CreditDetailItem:
| Campo | Tipo | Descripción |
|---|---|---|
credit | BigDecimal | Monto cobrado por esta orden. |
deductionSource | String | Origen de deducción (Balance / Monthly Package /
Resource Package). |
packageName | String | Nombre del paquete; null si no hay paquete. |
Convención de valores nulos: solo se completan los campos relevantes para cada
modelType; el resto son null. text completa los
campos de tokens; image completa
imageCount/imageResolution/imageRatio; video completa
videoResolution/videoRatio/videoDurationSec.
Ejemplo de respuesta:
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"priceSnapshotId": "snap_9f3c1a2b",
"taskId": "task_5e8a1c33",
"credit": 0.0342,
"model": "glm-5.2",
"modelType": "text",
"inputTokens": 1280,
"outputTokens": 642,
"totalTokens": 1922,
"cacheReadTokens": 0,
"cacheWriteTokens": 0,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": null,
"videoRatio": null,
"videoDurationSec": null,
"orderCreatedAt": "2026-07-18T14:23:11",
"creditDetails": [
{
"credit": 0.0342,
"deductionSource": "balance",
"packageName": ""
}
]
},
{
"priceSnapshotId": "snap_a12f77c0",
"taskId": "task_c71e44a2",
"credit": 1.8000,
"model": "seedance-2.0",
"modelType": "video",
"inputTokens": null,
"outputTokens": null,
"totalTokens": null,
"cacheReadTokens": null,
"cacheWriteTokens": null,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": "1080p",
"videoRatio": "16:9",
"videoDurationSec": 8,
"orderCreatedAt": "2026-07-17T22:41:09",
"creditDetails": [
{
"credit": 1.5000,
"deductionSource": "Monthly Package",
"packageName": "基础月度套餐"
},
{
"credit": 0.3000,
"deductionSource": "Resource Package",
"packageName": "byteplus视频资源包"
}
]
}
],
"total": 128,
"current": 1,
"size": 20,
"pages": 7
}
}
GET https://api.basicrouter.ai/api/v1/billing/transactions
Lista paginada de las transacciones de recarga pagadas (status=2) del
usuario actual, ordenadas por created_at de forma descendente.
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
page | Integer | No | 1 | Número de página. |
size | Integer | No | 20 | Tamaño de página. |
startTime | String | No | — | Hora de inicio, yyyy-MM-dd HH:mm:ss, inclusivo. |
endTime | String | No | — | Hora de fin, yyyy-MM-dd HH:mm:ss, inclusivo. |
curl --request GET \
--url "https://api.basicrouter.ai/api/v1/billing/transactions?page=1&size=20&startTime=2026-07-01%2000:00:00&endTime=2026-07-31%2023:59:59" \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Contenedor de respuesta:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Campo | Tipo | Descripción |
|---|---|---|
records | TransactionVO[] | Transacciones de la página actual. |
total | Long | Conteo total. |
current | Long | Página actual. |
size | Long | Tamaño de página. |
pages | Long | Total de páginas. |
Campos de TransactionVO:
| Campo | Tipo | Descripción |
|---|---|---|
orderNo | String | Número de orden. |
thirdPartyOrderNo | String | Número de orden de terceros. |
amount | BigDecimal | Monto de la orden. |
actualAmount | BigDecimal | Monto efectivamente pagado. |
discount | BigDecimal | Monto de descuento. |
paymentMethod | String | Método de pago (wechat / alipay / ustd /
stripe / wallyt etc.). |
Campos de TransactionVO:
| Campo | Tipo | Descripción |
|---|---|---|
serviceFeeAmount | BigDecimal | Monto de la tarifa de servicio. |
paymentChannel | String | Plataforma de pago. |
source | String | Origen de la orden (recharge /
package_purchase etc.). |
packageName | String | Nombre del paquete (establecido para compras de paquetes;
null para recargas simples). |
createdAt | LocalDateTime | Tiempo de creación. |
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"orderNo": "R20260718abc123",
"thirdPartyOrderNo": "wx_pay_xxx",
"amount": 50.00,
"actualAmount": 48.50,
"discount": 1.50,
"paymentMethod": "wechat",
"serviceFeeAmount": 0.00,
"paymentChannel": "wechat",
"source": "recharge",
"packageName": null,
"createdAt": "2026-07-18T14:23:11"
}
],
"total": 28,
"current": 1,
"size": 20,
"pages": 2
}
}
Operativo
Errores
BasicRouter devuelve códigos de error estables para que las aplicaciones puedan manejar reintentos, respaldos, problemas de facturación y depuración de forma consistente.
Los endpoints compatibles con proveedores intentan preservar la forma de error de la familia de API original cuando es posible. Los endpoints nativos de BasicRouter usan el objeto de error de BasicRouter.
Mapeo de estados HTTP y códigos de error
| Estado HTTP | Tipo de error | Códigos de ejemplo | Reintentar |
|---|---|---|---|
| 400 | invalid_request_error | invalid_request, unsupported_parameter,
invalid_messages, invalid_image_url | No |
| 401 | authentication_error | missing_api_key, invalid_api_key | No |
| 402 | billing_error | insufficient_credits, payment_required,
quota_exceeded | No |
| 403 | permission_error | model_access_denied, endpoint_access_denied,
key_scope_denied | No |
| 404 | not_found_error | model_not_found, response_not_found,
task_not_found | No |
| 408 | timeout_error | gateway_timeout, provider_timeout | Sí |
| 409 | conflict_error | idempotency_conflict, task_already_cancelled | Depende |
| 422 | validation_error | schema_validation_failed, unsupported_modality | No |
| 429 | rate_limit_error | account_rpm_exceeded, account_tpm_exceeded,
provider_rate_limited | Sí |
| 500 | internal_error | internal_error | Sí |
| 502 | provider_error | provider_bad_gateway, provider_invalid_response | Sí |
| 503 | service_unavailable | model_unavailable, provider_unavailable,
insufficient_capacity | Sí |
| 504 | timeout_error | provider_timeout, gateway_timeout | Sí |
Códigos de error comunes
| Código | Significado | Acción recomendada |
|---|---|---|
missing_api_key | No se proporcionó una clave API. | Agregue el encabezado Authorization. |
invalid_api_key | La clave API es inválida o ha sido revocada. | Cree o rote la clave API. |
model_not_found | El ID del modelo no existe o no está habilitado para la cuenta. | Consulte la página de Modelos o llame a GET /v1/models. |
model_access_denied | La clave API o la cuenta no tiene acceso al modelo. | Habilite el modelo o contacte al administrador. |
unsupported_parameter | La solicitud incluye un parámetro no soportado por el endpoint o modelo seleccionado. | Elimine el parámetro o elija un modelo compatible. |
unsupported_modality | La modalidad de entrada o salida no es soportada por el modelo seleccionado. | Elija un modelo que soporte la modalidad. |
account_rpm_exceeded | Se excedió el límite de solicitudes por minuto de la cuenta. | Reintente con backoff o solicite límites más altos. |
account_tpm_exceeded | Se excedió el límite de tokens por minuto de la cuenta. | Reintente con backoff, reduzca tokens o solicite límites más altos. |
provider_rate_limited | El proveedor aguas arriba limitó la solicitud. | Reintente o habilite el respaldo. |
insufficient_credits | La cuenta no tiene créditos suficientes. | Recargue el monedero, compre un paquete o mejore el plan. |
provider_timeout | El proveedor aguas arriba no respondió a tiempo. | Reintente o habilite el respaldo. |
model_unavailable | El modelo no está disponible temporalmente. | Reintente o use un alias de enrutamiento. |
content_policy_error | La solicitud o salida fue bloqueada por una política de seguridad. | Modifique la entrada o elija un flujo de trabajo adecuado. |
Soporte
Obtenga ayuda con BasicRouter
Encuentre respuestas a preguntas comunes sobre API, facturación, enrutamiento e integración. Para problemas de producción, envíe el ID de solicitud, la etiqueta de clave API, el endpoint, el modelo y la marca de tiempo para que el equipo pueda rastrear la solicitud rápidamente.
FAQ
Haga clic en una pregunta para expandir la respuesta.
Contacto
Elija el mejor buzón para la solicitud.
Para incidentes, límites de tasa, problemas de facturación, problemas de enrutamiento en producción, migración de SDK, compatibilidad de proveedores, preguntas de diseño de endpoints, planes empresariales, uso comprometido o requisitos de enrutamiento de proveedores personalizados.











