Documentação do BasicRouter
Início rápido
O BasicRouter oferece às equipes de produção uma API estável para acesso a modelos, roteamento, fallback, rastreamento de uso e cobrança baseada em créditos. O fornecimento de tokens LLM é proveniente de contas originais de provedores confiáveis em nuvem corporativa, com proteção de privacidade, alta estabilidade e rastreabilidade de solicitações integradas ao gateway.
https://api.basicrouter.ai/apihttps://api.basicrouter.ai/api/v1https://api.basicrouter.ai/api/v1Authorization: Bearer <key>Criar uma chave API
Crie uma chave API do BasicRouter no console. Mantenha a chave no seu servidor e nunca a exponha no código do navegador ou do cliente móvel.
Estratégia de chave recomendada:
| Tipo de chave | Uso recomendado |
|---|---|
| Chave de desenvolvimento | Desenvolvimento local, homologação, testes e protótipos. |
| Chave de produção | Apenas cargas de trabalho de produção no backend. |
| Chave de integração | Chave dedicada para ferramentas como Cursor, Claude Code, Codex, Hermes ou OpenClaw. |
| Chave de cliente / tenant | Isolamento opcional de chave para clientes corporativos, tráfego de tenant ou unidades de negócio. |
Rotacione as chaves quando o acesso da equipe mudar. Revogue as chaves que não são mais usadas.
Aponte seu SDK para o BasicRouter
A maioria dos clientes compatíveis com OpenAI só precisa de uma nova URL base e chave API.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.BASICROUTER_API_KEY,
baseURL: "https://api.basicrouter.ai/api/v1"
});
Enviar uma conclusão 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." }
]
}'
Verificar uso e saldo
curl --request GET \
--url https://api.basicrouter.ai/api/v1/billing/balance \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Descoberta de modelos
Use a página de Modelos ou a API de Modelos para inspecionar os modelos de texto disponíveis. Os metadados do modelo incluem fornecedor, provedor de serviço, modalidade, comprimento de contexto, famílias de API suportadas, capacidades suportadas, disponibilidade, limites no nível da conta e preço em créditos.
Endpoint: GET /v1/models
Objetivo: Listar modelos disponíveis para a conta atual.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Matriz de capacidades
| Capacidade | Descrição | Comumente usado por |
|---|---|---|
streaming | Suporta streaming de eventos enviados pelo servidor (SSE). | Apps de chat, agentes de programação, UX em tempo real. |
tool_calling | Suporta chamada de ferramentas ou funções. | Agentes, automação de fluxos de trabalho, assistentes de programação. |
structured_outputs | Suporta saídas com restrição de esquema ou JSON. | Extração de dados, automação de fluxos de trabalho, apps corporativos. |
json_mode | Pode retornar saída formatada em JSON. | Respostas estruturadas leves. |
vision | Aceita entrada de imagem. | Chat multimodal, análise de UI, capturas de tela de documentos. |
prompt_caching | Suporta entrada em cache ou reutilização de contexto. | Agentes de contexto longo, prompts de sistema repetidos. |
reasoning | Suporta controles explícitos de raciocínio quando disponíveis. | Planejamento complexo, programação, fluxos de análise. |
logprobs | Suporta saída de probabilidade de tokens. | Avaliação, classificação, fluxos avançados de NLP. |
Matriz de compatibilidade de famílias de API
| Família de API | Texto | Entrada de visão | Chamada de ferramentas | Saída estruturada | Streaming | Observações |
|---|---|---|---|---|---|---|
| OpenAI Chat Completions | Sim | Depende do modelo | Depende do modelo | Depende do modelo | Sim | Melhor padrão para agentes e SDKs compatíveis com OpenAI. |
| OpenAI Responses | Sim | Depende do modelo | Depende do modelo | Depende do modelo | Sim | Recomendado para fluxos de trabalho de agentes mais recentes no estilo OpenAI. |
| Anthropic Messages | Sim | Depende do modelo | Depende do modelo | Depende do modelo | Sim | Melhor para clientes compatíveis com Claude e Claude Code. |
| Geração de imagem BasicRouter | Não | Depende do modelo | Não | Não | Não | Usa polling assíncrono de tarefas ou webhook. |
| Geração de vídeo BasicRouter | Não | Depende do modelo | Não | Não | Não | Usa polling assíncrono de tarefas ou webhook. |
Autenticação
Toda solicitação de API usa um token bearer. Armazene as chaves em variáveis de ambiente do lado do servidor, rotacione-as quando o acesso da equipe mudar e registre os IDs de solicitação para depuração.
| Cabeçalho | Valor | Observações |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Obrigatório para toda solicitação. |
Content-Type | application/json | Obrigatório para corpos de solicitação JSON. |
Recomendações de segurança de chaves
- Mantenha as chaves API no servidor. Não exponha as chaves no código do navegador ou do cliente móvel.
- Use separate keys for development, staging, production, and third-party integrations.
- Defina o escopo das chaves por ambiente, serviço, cliente ou tenant quando disponível.
- Rotate keys after employee departures, vendor access changes, or suspected leakage.
- Armazene as chaves em gerenciadores de segredos ou variáveis de ambiente, não no código-fonte.
Agentes de programação
O BasicRouter funciona com agentes de programação e ferramentas de desenvolvimento
de IA que suportam endpoints de API compatíveis com OpenAI ou Anthropic. Use aliases de
roteamento como mwf/coding-auto para que o BasicRouter possa rotear para
o melhor modelo de programação disponível sem exigir que os desenvolvedores alterem a
configuração da ferramenta.
Configuração genérica compatível com OpenAI
Use esta configuração para Cursor, Codex, Hermes, OpenClaw, Continue, Aider, Cline, agentes baseados em LangChain, agentes baseados em LlamaIndex e runtimes de agentes personalizados compatíveis com OpenAI.
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Configuração genérica compatível com Anthropic
Use esta configuração para clientes compatíveis com Claude e ferramentas que esperam o 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 |
|---|---|---|
| Programação geral | mwf/coding-auto | Chamada de ferramentas, streaming, forte capacidade de programação. |
| Chat de programação rápido | mwf/coding-fast | Baixa latência e streaming. |
| Análise de repositório grande | mwf/coding-long | Contexto longo e saída estável. |
| Assistente de programação sensível a custos | mwf/low-cost | Preço menor e qualidade de programação aceitável. |
| Captura de tela de UI / programação com visão | mwf/vision-chat | Entrada de visão e saída de texto. |
Guia rápido do Cursor
Use o endpoint compatível com OpenAI.
Base URL: https://api.basicrouter.ai/api/v1
API Key: BASICROUTER_API_KEY
Model: mwf/coding-auto
Passos recomendados:
- Abra as configurações do Cursor.
- Adicione ou ative a configuração de chave API compatível com OpenAI.
- Defina a substituição da URL base do OpenAI para
https://api.basicrouter.ai/api/v1. - Adicione um modelo personalizado como
mwf/coding-auto,mwf/coding-fastoumwf/coding-long. - Use um modelo que suporte streaming e chamada de ferramentas para o melhor comportamento do agente.
Solução de problemas:
| Problema | Correção sugerida |
|---|---|
| Modelo não exibido | Adicione o nome do modelo manualmente como um modelo personalizado. |
| Falha na chamada de ferramentas | Use um modelo com tool_calling: true na página de Modelos. |
| Streaming interrompido | Repita com backoff ou use um alias de roteamento com fallback. |
| Erro 401 | Verifique a chave API e a URL base. |
| Erro 404 de modelo | Confirme se o modelo está ativado para a conta. |
Guia rápido do Claude Code
Use o endpoint do gateway compatível com Anthropic.
export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
O BasicRouter suporta este caminho compatível com Anthropic para compatibilidade com Claude Code e SDK Anthropic:
POST /api/v1/messages
Requisitos recomendados:
| Requisito | Motivo |
|---|---|
| Formato de solicitação compatível com Anthropic Messages | O Claude Code espera mensagens no estilo Anthropic. |
| Suporte a streaming | O Claude Code depende da UX de streaming. |
| Suporte a chamada de ferramentas | Obrigatório para fluxos de trabalho de programação agentic. |
| Contexto longo | Útil para tarefas no nível de repositório. |
| Fallback estável | Útil para sessões de programação demoradas. |
Guia rápido do Codex
Use o BasicRouter como um provedor de modelo personalizado compatível com OpenAI.
Exemplo de configuração do provedor:
[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"
Variável de ambiente:
export BASICROUTER_API_KEY="br_xxx"
Modelos recomendados:
| Modelo | Caso de uso |
|---|---|
mwf/coding-auto | Modelo de agente de programação padrão. |
mwf/coding-long | Contexto de repositório grande. |
mwf/coding-fast | Iteração rápida e pequenas alterações. |
Solução de problemas:
| Problema | Correção sugerida |
|---|---|
| Erro de autenticação | Confirme que env_key aponta para BASICROUTER_API_KEY. |
| Modelo não encontrado | Adicione o alias no Console do BasicRouter ou use um ID de modelo direto. |
| Erro da API Responses | Use wire_api = "responses" apenas para modelos e
endpoints que suportam Responses. |
| Modelo apenas para Chat Completions | Mude para uma API wire compatível com chat se o cliente suportar. |
Guia rápido do Hermes
Use o endpoint compatível com OpenAI, a menos que sua implantação do Hermes esteja configurada para outro 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 trabalho do Hermes | Modelo |
|---|---|
| Geração de código geral | mwf/coding-auto |
| Execução de tarefas de baixa latência | mwf/coding-fast |
| Verificação de repositório de contexto longo | mwf/coding-long |
| Tarefas em segundo plano sensíveis a custos | mwf/low-cost |
Guia rápido do OpenClaw
Use o endpoint compatível com OpenAI para a configuração de runtime de agente no 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"
Se o OpenClaw suportar múltiplos provedores, configure o BasicRouter como um provedor compatível com OpenAI e use aliases de roteamento do BasicRouter para seleção de modelo.
{
"provider": "openai-compatible",
"base_url": "https://api.basicrouter.ai/api/v1",
"api_key_env": "BASICROUTER_API_KEY",
"model": "mwf/coding-auto"
}
Lista de verificação de compatibilidade de agentes
| Capacidade | Obrigatório para |
|---|---|
| Streaming | Boa UX de terminal/editor. |
| Chamada de ferramentas | Programação agentic, edições de arquivo, execução de comandos. |
| Contexto longo | Repositórios grandes e alterações em múltiplos arquivos. |
| Structured outputs | Planejamento, decomposição de tarefas, fluxos automatizados. |
| Vision input | Análise de captura de tela de UI e fluxos de design para código. |
| Fallback | Estabilidade de produção e tarefas demoradas. |
Uso do console
O Console do BasicRouter é o plano de controle operacional para acesso à API, disponibilidade de modelos, políticas de roteamento, visibilidade de uso e administração de cobrança. Ele oferece aos administradores da conta uma visão centralizada de chaves, modelos, solicitações, créditos e controles no nível da conta para tráfego de modelos em produção.
Gerenciamento de chaves API
Crie, rotacione, revogue e rotule chaves API no console. Use chaves separadas para desenvolvimento, homologação, produção e serviços individuais para que o uso possa ser auditado e isolado por ambiente ou aplicação.
| Prática | Descrição |
|---|---|
| Ambientes separados | Use chaves API diferentes para tráfego de desenvolvimento, homologação e produção. |
| Use rótulos descritivos | Rotule as chaves por aplicação, serviço, ambiente ou integração. |
| Rotacione regularmente | Rotacione as chaves quando o acesso mudar ou as credenciais podem ter sido expostas. |
| Evite exposição no lado do cliente | Mantenha as chaves API apenas em sistemas do lado do servidor. Não exponha as chaves no código do navegador ou do cliente móvel. |
| Monitore o uso da chave | Revise o volume de solicitações, consumo de créditos e padrões de erro por chave. |
Lista de modelos
Use a página de Modelos para revisar os modelos disponíveis para a conta. Cada entrada de modelo pode incluir fornecedor, provedor de serviço, modalidade, famílias de API suportadas, comprimento de contexto, sinalizadores de capacidade, status de disponibilidade e informações de preço.
| Filtro | Objetivo |
|---|---|
| Vendor | Filtre por fornecedor do modelo como OpenAI, Anthropic, Google, Qwen, DeepSeek ou outros provedores. |
| Provedor | Filtre por provedor de serviço ou provedor de nuvem. |
| Modality | Filtre por suporte a texto, imagem, vídeo, embedding, áudio ou multimodal. |
| Capability | Filtre por suporte a streaming, chamada de ferramentas, saídas estruturadas, visão, cache de prompt ou raciocínio. |
| Availability | Identifique modelos que estão disponíveis para a conta no momento. |
Para aplicações em produção, verifique as capacidades do modelo antes de ativar o tráfego. Alguns parâmetros e recursos dependem do modelo e podem não ser suportados em todas as famílias de API.
Uso e logs
A visualização de Uso e Logs fornece visibilidade operacional do tráfego da API. As equipes podem inspecionar o volume de solicitações, modelos selecionados, destinos de roteamento resolvidos, consumo de créditos, latência, códigos de erro e IDs de solicitação.
- Solucione falhas em solicitações.
- Identifique cargas de trabalho de alto custo.
- Compare o uso de modelos entre aplicações e ambientes.
- Valide o comportamento de roteamento e fallback.
- Investigue problemas de latência ou disponibilidade do provedor.
- Forneça IDs de solicitação ao contatar o suporte.
Cada resposta da API inclui ou expõe um ID de solicitação do BasicRouter. Armazene este ID nos logs da sua aplicação para tornar a depuração de produção e a escalonamento de suporte mais eficientes.
Fallback
O Fallback é o mecanismo de resiliência do BasicRouter. Quando o modelo principal ou a política de roteamento falha, o sistema alterna automaticamente para um modelo de backup para continuar processando a solicitação. Isso mantém sua aplicação responsiva e minimiza o risco de interrupção do serviço.
O Fallback atua como uma rede de segurança, mantendo sua aplicação funcionando sem problemas, mesmo quando ocorre uma falha de modelo, limite de cota ou flutuação de rede.
Por que o fallback é importante
Em produção, os serviços de modelo podem enfrentar vários problemas imprevisíveis:
- Falha no serviço do modelo: a API upstream fica temporariamente indisponível ou atinge o tempo limite.
- Flutuação de desempenho: alta carga do modelo leva a respostas lentas ou com falha.
- Falha de roteamento: todos os modelos candidatos selecionados pelo roteamento inteligente ficam indisponíveis.
O Fallback mantém sua aplicação disponível fornecendo um caminho de backup confiável.
Principais vantagens
| Vantagem | Descrição |
|---|---|
| High availability | O failover automático mantém o serviço em execução e reduz o impacto das interrupções. |
| Transparent switching | O sistema alterna os modelos automaticamente — não são necessárias alterações no código da aplicação. |
| Flexible configuration | Suporta configuração tanto por solicitação quanto no nível da conta para diferentes casos de uso. |
| Cost optimization | Escolha um modelo mais econômico como fallback para controlar custos de emergência. |
| Centralized management | Configure uma vez no nível da conta e será aplicado automaticamente a toda solicitação. |
Configuração de modelo de fallback global
O BasicRouter suporta a definição de um modelo de fallback global no backend do console. Todas as solicitações usam automaticamente este modelo como backup quando falham.
Como configurar:
- Acesse a página de configurações de estratégia do BasicRouter.
- Encontre a configuração de Modelo de Fallback Padrão.
- Selecione seu modelo de fallback global na lista suspensa.
- Salve a configuração para aplicá-la imediatamente.
Vantagens da configuração global:
- Sem alterações de código: configure uma vez e aplica-se globalmente, sem necessidade de repetir a configuração em cada solicitação.
- Gerenciamento centralizado: gerencie a política de fallback em um único local para ajuste e monitoramento mais fáceis.
- Manutenção simplificada: reduz a complexidade do código e a chance de erros de configuração.
- Substituição flexível: a configuração de fallback no nível da solicitação tem prioridade e pode substituir a configuração global para cenários específicos.
Configuração de fallback no nível da solicitação
Para cenários de negócio específicos, você pode especificar um modelo de fallback em uma solicitação individual para substituir a configuração global.
Especifique o modelo de fallback com o parâmetro router.fallBackModels:
{
"model": "claude-sonnet-4",
"messages": [
{
"role": "user",
"content": "Explain what quantum computing is"
}
],
"router": {
"fallBackModels": ["glm-5.2"]
}
}
Regras de prioridade
Quando várias configurações de fallback estão presentes, a prioridade vai da mais alta para a mais baixa:
router.fallBackModelsno nível da solicitação: o modelo de fallback especificado em uma solicitação individual.- Global Default Fallback Model: the global fallback model configured in the console.
- No fallback: if neither is configured, the request returns an error on failure.
- Se todos os modelos de fallback falharem, o sistema retorna o motivo da falha do último modelo tentado.
- Quando ocorre um fallback, a resposta indica o modelo realmente usado, facilitando o monitoramento e a análise.
Administração da conta
Dependendo do tipo de conta, o console pode incluir ativação de modelos no nível da conta, controles de revendedor ou distribuidor, configuração de cobrança e configurações de acesso. Os administradores podem usar esses controles para alinhar o acesso a modelos, a visibilidade de uso e a responsabilidade de cobrança com aplicações, contas de cliente ou unidades de negócio.
Lista de verificação de operações de produção
| Item | Recomendação |
|---|---|
| Chaves API | Use chaves de produção dedicadas com rótulos claros. |
| Models | Confirme a disponibilidade do modelo, preço, comprimento de contexto e capacidades necessárias. |
| Routing | Configure aliases de roteamento ou políticas de fallback para cargas de trabalho críticas. |
| Logs | Garanta que os IDs de solicitação sejam capturados nos logs da aplicação. |
| Billing | Confirme o saldo da carteira, o status do plano e as regras de dedução de créditos. |
| Rate limits | Revise RPM, TPM, concorrência e limites de tarefas de mídia no nível da conta. |
| Alerts | Monitore o crescimento de uso, saldo de créditos, erros e disponibilidade do provedor. |
Cobrança e créditos
O BasicRouter usa um modelo de cobrança baseado em créditos para cargas de trabalho de texto, imagem, vídeo e outros modelos suportados. Os créditos fornecem uma unidade unificada para uso de múltiplos modelos e múltiplos provedores, permitindo que as equipes gerenciem o consumo de forma consistente entre modalidades e famílias de API.
Os preços detalhados dos modelos estão disponíveis na página de Modelos ou através das APIs de metadados de modelo. O preço pode variar por modelo, provedor, modalidade, resolução, tipo de token, compramento de saída, duração da tarefa, tipo de conta e acordo comercial.
Recarga e carteira
As contas podem adicionar créditos de carteira pré-pagos para uso flexível. Os créditos da carteira são usados após os créditos do plano mensal e dos pacotes de recursos serem consumidos, a menos que uma regra billing rule applies to the account.
Os créditos da carteira não expiram, salvo especificação em contrário nos termos comerciais aplicáveis. Uma taxa de serviço é cobrada ao recarregar a carteira pré-paga.
Planos mensais e pacotes de recursos
Cada usuário ou conta pode selecionar um plano mensal ativo. Os planos mensais fornecem uma quantidade definida de capacidade de uso, termos comerciais e configuração de acesso no nível da conta para o período de cobrança.
Os usuários também podem comprar vários pacotes de recursos para capacidade de uso adicional. Os pacotes de recursos podem separar o uso comprometido do saldo da carteira pré-paga e são úteis para uso de alto volume de texto, imagem, vídeo ou cargas de trabalho dedicadas.
Ordem de dedução
A menos que regras de cobrança personalizadas estejam configuradas, os créditos são deduzidos na seguinte ordem:
| Prioridade | Origem do crédito | Descrição |
|---|---|---|
| 1 | Monthly plan | A capacidade de uso mensal incluída é consumida primeiro. |
| 2 | Resource packs | Pacotes adicionais comprados são consumidos após os créditos do plano mensal. |
| 3 | Pay-as-you-go wallet | O saldo da carteira é consumido após os créditos do plano e dos pacotes de recursos. |
Para contas com termos comerciais personalizados, a ordem de dedução, regras de expiração, uso incluído e preços podem ser diferentes. As regras específicas da conta são mostradas no console ou fornecidas através do acordo comercial.
Preços personalizados
Os preços podem ser personalizados para cada usuário ou conta. Clientes corporativos, contas de revendedor, contas de distribuidor e clientes de alto volume podem ser elegíveis para preços personalizados. Entre em contato com as vendas para uma cotação.
Os preços personalizados podem ser configurados por conta, modelo, provedor, modalidade, região, volume de uso ou acordo comercial. Quando os preços personalizados são ativados, o console e as APIs de cobrança refletem os preços e regras de dedução específicos da conta quando disponíveis.
Unidades de preço
Different model modalities use different measurement units. BasicRouter converts these units into credits according to the model’s pricing rules.
| Modalidade | Base comum de preço |
|---|---|
| Text | Tokens de entrada, tokens de saída, tokens de leitura em cache, tokens de escrita em cache, tokens de raciocínio ou categorias de token específicas do modelo. |
| Image | Modelo, resolução, número de imagens geradas, uso de imagem de entrada, modo de edição ou configuração de qualidade. |
| Video | Modelo, resolução de saída, segundos gerados, proporção da tela, uso de imagem ou vídeo de entrada e tipo de tarefa. |
| Embeddings | Tokens de entrada ou número de registros de embedding. |
| Audio | Duração de entrada, duração de saída, comprimento de transcrição ou unidades de áudio específicas do modelo. |
As unidades de preço podem variar por modelo. Sempre consulte a página de detalhes do modelo ou os metadados de preço antes de ativar um modelo em produção.
Atribuição de uso
O uso do BasicRouter pode ser revisado por conta, chave API, modelo, modalidade ou intervalo de tempo. Isso permite que as equipes atribuam custos a aplicações, ambientes, clientes ou unidades de negócio internas.
| Dimensão | Descrição |
|---|---|
| Chave API | Agrupe o uso por aplicação, serviço ou ambiente. |
| Modelo | Compare custo e volume por modelo selecionado. |
| Resolved model | Revise o modelo real usado após roteamento ou fallback. |
| Modality | Separe o uso de texto, imagem, vídeo, embedding e áudio. |
| Time range | Revise períodos de relatório diários, mensais ou personalizados. |
| Metadata | Agrupe o uso por metadados de solicitação personalizados, como ID do cliente, ID do tenant, ID do usuário ou ambiente. |
Saldo de créditos
Verifique quantos créditos estão disponíveis em sua conta. O saldo é dividido em três carteiras que são deduzidas em ordem: a allowances do plano mensal, pacotes de recursos comprados e a carteira pré-paga. Um total combinado de recursos (plano mensal + pacotes de recursos, excluindo o pré-pago) também está disponível para rastrear o uso incluído separadamente dos gastos de recarga.
Para recuperar isso programaticamente, consulte
GET /v1/billing/balance na Referência da
API.
Detalhes de uso
Revise uma lista paginada e cronológica de registros de uso individuais para relatórios, monitoramento e alocação interna de custos. Cada registro mostra o modelo, tipo de modelo (texto, imagem ou vídeo), os créditos deduzidos e um detalhamento de qual carteira cada dedução foi retirada. Os resultados podem ser filtrados por um intervalo de tempo específico.
Para recuperar isso programaticamente, consulte
GET /v1/usage na Referência da API.
Histórico de transações
Use o histórico de transações para revisar movimentações de créditos, incluindo recargas, alocações de plano, concessões de pacotes de recursos, deduções de uso, ajustes e correções administrativas.
Para recuperar isso programaticamente, consulte
GET /v1/billing/transactions na
Referência da API.
Solicitações com falha e reembolsos
Erros de validação, erros de autenticação e erros de permissão geralmente não são cobrados porque nenhuma execução de modelo ocorre. Solicitações que alcançam um modelo upstream ou geram saída parcial podem consumir créditos dependendo do modelo, provedor e estado da resposta.
Para tarefas assíncronas de imagem e vídeo, o comportamento de cobrança depende se a tarefa foi aceita, iniciada, concluída, falhou ou foi cancelada. A resposta de detalhes da tarefa inclui informações de uso quando os créditos foram consumidos.
Recargas, planos mensais, pacotes de recursos e créditos consumidos não são reembolsáveis, a menos que especificado de outra forma no acordo comercial aplicável ou exigido por lei.
Referência da API
Convenções comuns
URL base
Todos os endpoints são servidos sob o prefixo /v1.
Autenticação
Chamadas para endpoints /v1/* usam autenticação por
Chave API (não JWT). A Chave API é passada pelo seguinte cabeçalho:
| Cabeçalho | Formato | Descrição |
|---|---|---|
Authorization | Bearer <api_key> | Estilo OpenAI. O endpoint compatível com Anthropic também aceita
x-api-key com anthropic-version: 2023-06-01. |
Chaves ausentes ou inválidas retornam 401.
Pré-verificação de saldo
Todos os endpoints de chamada de modelo executam uma pré-verificação de saldo antes da execução:
- Insufficient balance returns
Insufficient credit, mapped to:- Protocolo OpenAI: HTTP
400,code = insufficient_quota - Protocolo Anthropic: HTTP
402,type = billing_error
- Protocolo OpenAI: HTTP
- Alguns endpoints também estimam um custo mínimo por modelo para uma segunda pré-verificação.
POST https://api.basicrouter.ai/api/v1/chat/completions
Endpoint compatível com OpenAI Chat Completions. Suporta streaming e não streaming, chamadas de ferramentas, modo JSON e entrada multimodal.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
model | String | Sim | Nome do modelo. |
messages | Message[] | Sim | Mensagens da conversa. |
stream | Boolean | Não | Modo de stream, padrão false. |
temperature | Double | Não | Temperatura de amostragem. |
max_tokens | Integer | Não | Máximo de tokens de saída. |
top_p | Double | Não | Amostragem por núcleo. |
presence_penalty | Double | No | — |
frequency_penalty | Double | No | — |
tools | Tool[] | Não | Definições de ferramentas. |
tool_choice | String|Object | No | auto / none / required / função
específica. |
response_format | Object | No | {type, json_schema:{name,schema,strict}};
text/json_object/json_schema. |
parallel_tool_calls | Boolean | Não | — |
metadata | Map | Não | Metadados de passagem. |
Campos de Message:
| Campo | Tipo | Descrição |
|---|---|---|
role | String | system / user / assistant /
tool. |
content | String|Array | Texto simples ou array de blocos de conteúdo multimodal
([{type:"text",text},{type:"image_url",image_url:{url}}]). |
tool_call_id | String | Vincula ao tool_calls quando role=tool. |
tool_calls | ToolCall[] | Presente quando role=assistant faz chamadas de ferramentas. |
| Campo | Tipo | Descrição |
|---|---|---|
type | String | Fixo function. |
function | Object | Definição da função. |
function.name | String | Nome da função. |
function.description | String | Descrição da função. |
function.parameters | Object | Esquema JSON para 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 resposta (não streaming):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID de conclusão. |
object | String | Fixo chat.completion. |
created | Long | Carimbo de data/hora de criação (segundos). |
model | String | Nome do modelo. |
choices | Choice[] | {index, message:{role, content, tool_calls?}, finish_reason}. |
usage | Object | {prompt_tokens, completion_tokens, total_tokens}. |
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da chamada de ferramenta. |
type | String | Fixo function. |
function | Object | Detalhes da chamada de função. |
function.name | String | Nome da função. |
function.arguments | Object | Argumentos da função. |
Exemplo de resposta em 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 compatível com OpenAI Responses. Usa input em vez de
messages, instructions em vez de uma mensagem de sistema, e um
bloco text em vez de response_format.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
model | String | Sim | Nome do modelo. |
input | String|Array | Yes | String simples (mensagem do usuário) ou array de objetos de mensagem. |
instructions | String | Não | Prompt de sistema. |
stream | Boolean | Não | Padrão false. |
max_output_tokens | Integer | Não | Máximo de tokens de saída. |
temperature | Double | Não | Padrão 1. |
top_p | Double | No | — |
tools | Tool[] | No | Nível 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 | Não | ID da resposta anterior para múltiplos turnos. |
parallel_tool_calls | Boolean | Não | — |
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 resposta (não streaming):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da resposta. |
object | String | Fixo response. |
model | String | Nome do modelo. |
status | String | ex. completed. |
created_at | Long | Carimbo de data/hora de criação (segundos). |
output | Array | Output items. Message items:
{id, type:"message", role, content:[{type:"output_text",
text}], status}. Tool-call items:
{type:"function_call", id, name, call_id, arguments, status}. |
usage | Object | {input_tokens, output_tokens, total_tokens}. Para modelos Claude,
input_tokens inclui cache_read e
output_tokens inclui cache_write. |
O streaming segue os eventos da API Responses:
| Evento | Descrição |
|---|---|
response.created | Início do fluxo de resposta. |
response.output_text.delta | Atualização incremental de saída de texto. |
response.completed | Fim do fluxo de resposta. |
POST https://api.basicrouter.ai/api/v1/messages
Endpoint compatível com Anthropic Messages. Aceita cabeçalhos x-api-key e
anthropic-version: 2023-06-01. Os blocos de conteúdo suportam
text, image, tool_use, tool_result,
thinking e redacted_thinking.
| Campo | Tipo | Obrigatório | Campo JSON | Description |
|---|---|---|---|---|
model | String | Yes | model | Model name. |
messages | Message[] | Yes | messages | Conversation messages. |
system | String|Array | No | system | Prompt de sistema, string ou [{type,text}]. |
maxTokens | Integer | Yes | max_tokens | Maximum output tokens. |
stream | Boolean | No | stream | Streaming. |
temperature | Double | No | temperature | — |
topP | Double | No | top_p | — |
topK | Integer | No | top_k | — |
tools | Tool[] | No | tools | Definições de ferramentas (input_schema). |
toolChoice | Object | No | tool_choice | — |
metadata | Map | No | metadata | — |
thinking | Object | No | thinking | Configuração de raciocínio estendido. |
stopSequences | Object | No | stop_sequences | — |
anthropicBeta | Object | No | anthropic_beta | Cabeçalho de recurso beta. |
| Campo | Tipo | Descrição |
|---|---|---|
role | String | Papel da mensagem, ex. user / assistant. |
content | String|ContentBlock[] | Texto simples ou um array de blocos de conteúdo. |
| Campo | Tipo | Descrição |
|---|---|---|
type | String | Um entre text, image, tool_use,
tool_result, thinking,
redacted_thinking. |
text | String | Presente quando o tipo é texto. |
source | Object | Present when type is image. |
Exemplos de bloco de imagem:
{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }
| Campo | Tipo | Descrição |
|---|---|---|
name | String | Nome da função. |
description | String | Descrição da função. |
input_schema | Object | Esquema JSON para entradas. |
cache_control | Object | Controle de cache 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 resposta (não streaming):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da mensagem. |
type | String | Fixo message. |
role | String | Fixo assistant. |
model | String | Nome do modelo. |
content | ContentBlock[] | Blocos de conteúdo da resposta (ex. {type:"text", text},
{type:"tool_use", ...}). |
stop_reason | String | ex. end_turn, tool_use, max_tokens. |
usage | Object | {input_tokens, output_tokens}. |
| Evento | Descrição |
|---|---|
message_start | Início do fluxo de mensagens. |
content_block_start | Início de um novo bloco de conteúdo. |
content_block_delta | Atualização incremental de um bloco de conteúdo. |
content_block_stop | Fim de um bloco de conteúdo. |
message_delta | Atualização incremental da mensagem. |
message_stop | Fim do fluxo de mensagens. |
GET https://api.basicrouter.ai/api/v1/models
Retorna todos os modelos de API online e ativados.
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 | Descrição |
|---|---|---|
id | String | ID do modelo. |
object | String | Fixo model. |
display_name | String | Nome de exibição. |
created | Long | Carimbo de data/hora de criação (segundos). |
owned_by | String | Proprietário / fornecedor. |
input_modalities | String[] | e.g. ["text","image"]. |
output_modalities | String[] | e.g. ["text"]. |
context_length | Integer | Comprimento máximo de contexto. |
GET https://api.basicrouter.ai/api/v1/models/{model}
Retorna um único modelo com o mesmo formato de uma entrada de lista. Retorna HTTP 404 quando o modelo não existe.
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models/gpt-5.5 \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
Resposta de sucesso: um objeto de modelo único com os mesmos campos de uma entrada de
lista /v1/models.
Quando o modelo não existe, retorna 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
Consulte as resoluções, proporções e contagens máximas suportadas por um modelo de
imagem antes de chamar /v1/image-generations. Não requer autenticação.
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID do modelo. |
object | String | Fixed image_model. |
displayName | String | Nome de exibição. |
description | String | Descrição do modelo. |
icon | String | URL do ícone. |
created | Long | Carimbo de data/hora de criação (segundos). |
maxCount | Integer | Máximo de imagens por solicitação. |
fileMax | Integer | Máximo de imagens de referência. |
resolutions | String[] | Supported resolutions, e.g.
["720p","1080p"]. |
ratios | String[] | Supported aspect ratios, e.g.
["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
Consulte os valores de videoType suportados, intervalo de duração,
resoluções e proporções para um modelo de vídeo antes de chamar
/v1/video-generations. Não requer autenticação.
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID do modelo. |
object | String | Fixed video_model. |
displayName | String | Nome de exibição. |
description | String | Descrição do modelo. |
icon | String | URL do ícone. |
created | Long | Carimbo de data/hora de criação (segundos). |
allowedVideoTypes | VideoTypeOption[] | Lista de videoType suportados. |
videoDurationMin | Integer | Mínimo de segundos por clipe. |
videoDurationMax | Integer | Máximo de segundos por clipe. |
videoDurationSuggest | Integer[] | Passos de duração recomendados, ex. [5,8,10]. |
resolutions | String[] | Resoluções suportadas. |
ratios | String[] | Proporções de tela suportadas. |
resolutionOptions | ResolutionOption[] | Combinações estruturadas de resolução+proporção+tamanho. |
fileMax | Integer | Máximo de ativos de referência. |
Campos de VideoTypeOption:
| Campo | Tipo | Descrição |
|---|---|---|
code | Integer | O valor de videoType a ser passado para
/v1/video-generations. |
name | String | Nome do tipo localizado (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
Envie assincronamente uma tarefa de geração de imagem. Retorna um taskId
imediatamente; recupere o resultado fazendo polling de
GET /v1/image-generations/{taskId} ou via webhook
callbackUrl.
O model, os valores de resolution /
ratio suportados, o limite máximo de count e o limite de
upload de imagens de referência (fileMax) devem ser obtidos primeiro em
GET /v1/image-models. Apenas os valores divulgados na especificação do modelo são aceitos.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
text | String | Sim | Prompt. |
model | String | Sim | Nome do modelo. |
imageUrls | String[] | No | URLs de imagens de referência (imagem-para-imagem). |
count | Integer | No | Número de imagens (≥0). |
resolution | String | No | Resolução (consulte /v1/image-models). |
ratio | String | Não | Proporção da tela. |
callbackUrl | String | Não | URL de webhook no nível da tarefa. |
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"}
}
Respostas de erro:
// 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}
Faça polling de uma tarefa de geração de imagem. status é
pending / success / failed. images é
um array em string JSON de URLs de imagem; text contém qualquer descrição
de texto anexada pelo modelo (ex. saída multimodal do Gemini), null caso
contrário.
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 data da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
taskId | String | ID da tarefa. |
status | String | pending / success / failed. |
errorMessage | String | Motivo da falha, null em caso de sucesso. |
images | String | JSON-stringified array of image URLs, e.g.
"[\"https://.../1.png\"]". |
text | String | Descrição de texto anexada pelo modelo (ex. saída multimodal do Gemini);
null caso contrário. |
Tarefa não encontrada:
{ "code": 500, "message": "task not found" }
Se callbackUrl foi fornecido no envio, o servidor envia o resultado final
success / failed via webhook com o mesmo formato de
data.
Exemplo completo (envio + polling)
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
Envie assincronamente uma tarefa de geração de vídeo. Retorna um taskId
imediatamente; recupere o resultado fazendo polling de
GET /v1/video-generations/{taskId} ou via webhook
callbackUrl.
O model, os valores de videoType permitidos, o intervalo de
duração (videoDurationMin/Max), resolution /
ratio suportados e o limite de upload de ativos de referência
(fileMax) devem ser obtidos primeiro em
GET /v1/video-models. Apenas códigos de videoType listados em
allowedVideoTypes do modelo são aceitos.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
text | String | Sim | Prompt. |
model | String | Sim | Nome do modelo. |
videoType | Integer | Yes | 1 texto-para-vídeo / 2 imagem-para-vídeo (primeiro quadro) / 3 imagem-para-vídeo (primeiro+último quadro) / 4 imagem-para-vídeo (referência) / 5 todas as referências. |
imageUrls | String[] | No | URLs de ativos de imagem. |
videoUrls | VideoUrl[]|String[] | No | URLs de ativos de vídeo. |
audioUrls | String[] | No | URLs de ativos de áudio. |
resolution | String | Não | Resolução. |
ratio | String | Não | Proporção da tela. |
duration | Long | Não | Segundos (>0). |
callbackUrl | String | Não | URL de webhook no nível da tarefa. |
Exemplos para cada videoType:
1. Texto para vídeo (videoType=1)
Gere um vídeo apenas a partir de um prompt de texto; não são necessários ativos de referência.
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. Imagem para vídeo - primeiro quadro (videoType=2)
Forneça um único quadro inicial em imageUrls; o modelo gera um vídeo a
partir desse quadro.
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. Imagem para vídeo - primeiro e último quadro (videoType=3)
Forneça o primeiro e o último quadro em imageUrls (ordem:
[primeiro, último]); o modelo gera um vídeo de transição entre os dois
quadros.
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. Imagem para vídeo - referência (videoType=4)
Forneça uma ou mais imagens de referência em imageUrls; o modelo usa o
estilo/conteúdo delas como referência (não como um primeiro/último quadro forçado) para
gerar o vídeo.
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. Todas as referências (videoType=5)
Referências mistas de imagem / vídeo / áudio. Faça referência aos ativos por posição no
prompt: a 1ª entrada em imageUrls é @图片 1, a 1ª em
videoUrls é @视频 1, a 1ª em audioUrls é
@音频 1. videoUrls também aceita strings 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
}'
Resposta de envio (todos os cinco tipos):
{
"code": 200,
"message": "success",
"data": {"taskId": "vid_xxx"}
}
GET https://api.basicrouter.ai/api/v1/video-generations/{taskId}
Faça polling de uma tarefa de geração de vídeo. status é
pending / success / failed;
videoUrl é a URL do vídeo gerado e lastFrameUrl é a URL do
último quadro (cenários de imagem-para-vídeo).
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 data da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
status | String | pending / success / failed. |
videoUrl | String | URL do vídeo gerado. |
lastFrameUrl | String | URL do último quadro (cenários de imagem-para-vídeo); null caso
contrário. |
message | String | Motivo da falha, null em caso de sucesso. |
Se callbackUrl foi fornecido no envio, o servidor envia o resultado final
via webhook com o mesmo formato de data.
Exemplo completo (envio + polling)
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
Retorna o saldo da conta dividido em três carteiras: plano mensal, pacotes de recursos e crédito pré-pago.
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 resposta:
| Campo | Tipo | Descrição |
|---|---|---|
totalCredit | BigDecimal | Saldo total. |
totalResourceCredit | BigDecimal | Soma dos saldos dos pacotes de recursos. |
wallets.monthlyPlan | WalletDetail | Plano mensal (null se nenhum). |
wallets.resourcePacks | WalletDetail[] | Lista de pacotes de recursos. |
wallets.payAsYouGo | BigDecimal | Saldo pré-pago. |
Campos de WalletDetailVO:
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da carteira. |
credit | BigDecimal | Créditos do saldo. |
name | String | Nome da carteira. |
GET https://api.basicrouter.ai/api/v1/usage
Detalhes de cobrança paginados de chamadas de modelo, com snapshot por preço
(priceSnapshotId), ordenados por tempo de criação do pedido em ordem
decrescente. Apenas registros de cobrança normal (reason = model usage) são
retornados.
Parâmetros de consulta:
| Parâmetro | Tipo | Obrigatório | Padrão | Description |
|---|---|---|---|---|
page | Integer | No | 1 | Número da página, baseado em 1. |
size | Integer | No | 20 | Tamanho da página (paginado por priceSnapshotId). |
startTime | LocalDateTime | No | — | Hora de início, formato yyyy-MM-ddTHH:mm:ss, filtra por snapshot
orderCreatedAt. |
endTime | LocalDateTime | No | — | Hora de término, 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"
Wrapper de resposta:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Campo | Tipo | Descrição |
|---|---|---|
records | UsageDetailVO[] | Registros da página atual. |
total | Long | Contagem total. |
current | Long | Página atual. |
size | Long | Tamanho da página. |
pages | Long | Total de páginas. |
Campos de UsageDetailVO:
| Campo | Tipo | Descrição |
|---|---|---|
priceSnapshotId | String | ID do snapshot de preço. |
taskId | String | ID da tarefa. |
credit | BigDecimal | Valor cobrado. |
model | String | Nome do modelo. |
modelType | String | text / image / video. |
inputTokens | Long | Tokens de entrada; null para imagem/vídeo. |
outputTokens | Long | Tokens de saída. |
totalTokens | Long | Total de tokens. |
cacheReadTokens | Long | Tokens de leitura em cache. |
cacheWriteTokens | Long | Tokens de escrita em cache. |
imageCount | Integer | Contagem de imagens; definido para modelos de imagem. |
imageResolution | String | Resolução da imagem, ex. 720P. |
imageRatio | String | Proporção da imagem, ex. 1:1. |
videoResolution | String | Resolução do vídeo, ex. 1080p. |
videoRatio | String | Proporção do vídeo, ex. 16:9. |
videoDurationSec | Long | Duração do vídeo em segundos. |
orderCreatedAt | LocalDateTime | Tempo de criação do pedido (snapshot orderCreatedAt). |
creditDetails | CreditDetailItem[] | Detalhes do pedido neste snapshot (de credit_order_t). |
Campos de CreditDetailItem:
| Campo | Tipo | Descrição |
|---|---|---|
credit | BigDecimal | Valor cobrado por este pedido. |
deductionSource | String | Origem da dedução (Balance / Monthly Package /
Resource Package). |
packageName | String | Nome do pacote; null se nenhum pacote. |
Convenção de valor nulo: apenas os campos relevantes para cada
modelType são preenchidos; o restante é null.
text preenche os campos de token; image preenche
imageCount/imageResolution/imageRatio; video preenche
videoResolution/videoRatio/videoDurationSec.
Exemplo de resposta:
{
"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 das transações de recarga pagas (status=2) do usuário
atual, ordenadas por created_at em ordem decrescente.
| Parâmetro | Tipo | Obrigatório | Padrão | Description |
|---|---|---|---|---|
page | Integer | No | 1 | Número da página. |
size | Integer | No | 20 | Tamanho da página. |
startTime | String | No | — | Hora de início, yyyy-MM-dd HH:mm:ss, inclusivo. |
endTime | String | No | — | Hora de término, 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"
Wrapper de resposta:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Campo | Tipo | Descrição |
|---|---|---|
records | TransactionVO[] | Transações da página atual. |
total | Long | Contagem total. |
current | Long | Página atual. |
size | Long | Tamanho da página. |
pages | Long | Total de páginas. |
Campos de TransactionVO:
| Campo | Tipo | Descrição |
|---|---|---|
orderNo | String | Número do pedido. |
thirdPartyOrderNo | String | Número do pedido de terceiros. |
amount | BigDecimal | Valor do pedido. |
actualAmount | BigDecimal | Valor efetivamente pago. |
discount | BigDecimal | Valor do desconto. |
paymentMethod | String | Método de pagamento (wechat / alipay /
ustd / stripe / wallyt etc.). |
Campos de TransactionVO:
| Campo | Tipo | Descrição |
|---|---|---|
serviceFeeAmount | BigDecimal | Valor da taxa de serviço. |
paymentChannel | String | Plataforma de pagamento. |
source | String | Origem do pedido (recharge /
package_purchase etc.). |
packageName | String | Nome do pacote (definido para compras de pacotes; null para
recargas simples). |
createdAt | LocalDateTime | Tempo de criação. |
{
"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
}
}
Operacional
Erros
O BasicRouter retorna códigos de erro estáveis para que as aplicações possam lidar com repetições, fallbacks, problemas de cobrança e depuração de forma consistente.
Endpoints compatíveis com provedores tentam preservar o formato de erro da família de API original quando possível. Endpoints nativos do BasicRouter usam o objeto de erro do BasicRouter.
Mapeamento de status HTTP e códigos de erro
| Status HTTP | Tipo de erro | Códigos de exemplo | Repetir |
|---|---|---|---|
| 400 | invalid_request_error | invalid_request, unsupported_parameter,
invalid_messages, invalid_image_url | Não |
| 401 | authentication_error | missing_api_key, invalid_api_key | Não |
| 402 | billing_error | insufficient_credits, payment_required,
quota_exceeded | Não |
| 403 | permission_error | model_access_denied, endpoint_access_denied,
key_scope_denied | Não |
| 404 | not_found_error | model_not_found, response_not_found,
task_not_found | Não |
| 408 | timeout_error | gateway_timeout, provider_timeout | Sim |
| 409 | conflict_error | idempotency_conflict, task_already_cancelled | Depende |
| 422 | validation_error | schema_validation_failed, unsupported_modality | Não |
| 429 | rate_limit_error | account_rpm_exceeded, account_tpm_exceeded,
provider_rate_limited | Sim |
| 500 | internal_error | internal_error | Sim |
| 502 | provider_error | provider_bad_gateway, provider_invalid_response | Sim |
| 503 | service_unavailable | model_unavailable, provider_unavailable,
insufficient_capacity | Sim |
| 504 | timeout_error | provider_timeout, gateway_timeout | Sim |
Códigos de erro comuns
| Código | Significado | Ação recomendada |
|---|---|---|
missing_api_key | Nenhuma chave API foi fornecida. | Adicione o cabeçalho Authorization. |
invalid_api_key | A chave API é inválida ou revogada. | Crie ou rotacione a chave API. |
model_not_found | O ID do modelo não existe ou não está ativado para a conta. | Consulte a página de Modelos ou chame GET /v1/models. |
model_access_denied | A chave API ou a conta não tem acesso ao modelo. | Ative o modelo ou contate o administrador. |
unsupported_parameter | A solicitação inclui um parâmetro não suportado pelo endpoint ou modelo selecionado. | Remova o parâmetro ou escolha um modelo compatível. |
unsupported_modality | A modalidade de entrada ou saída não é suportada pelo modelo selecionado. | Escolha um modelo que suporte a modalidade. |
account_rpm_exceeded | Limite de solicitações por minuto da conta excedido. | Repita com backoff ou solicite limites maiores. |
account_tpm_exceeded | Limite de tokens por minuto da conta excedido. | Repita com backoff, reduza tokens ou solicite limites maiores. |
provider_rate_limited | O provedor upstream limitou a taxa da solicitação. | Repita ou ative o fallback. |
insufficient_credits | A conta tem créditos insuficientes. | Recarregue a carteira, compre um pacote ou faça upgrade do plano. |
provider_timeout | O provedor upstream não respondeu a tempo. | Repita ou ative o fallback. |
model_unavailable | O modelo está temporariamente indisponível. | Repita ou use um alias de roteamento. |
content_policy_error | A solicitação ou saída foi bloqueada por uma política de segurança. | Modifique a entrada ou escolha um fluxo de trabalho adequado. |
Suporte
Obtenha ajuda com o BasicRouter
Encontre respostas para perguntas comuns sobre API, cobrança, roteamento e integração. Para problemas de produção, envie o ID da solicitação, o rótulo da chave API, o endpoint, o modelo e o carimbo de data/hora para que a equipe possa rastrear a solicitação rapidamente.
FAQ
Clique em uma pergunta para expandir a resposta.
Contato
Escolha a melhor caixa de entrada para a solicitação.
Para incidentes, limites de taxa, questões de cobrança, problemas de roteamento em produção, migração de SDK, compatibilidade de provedor, questões de design de endpoint, planos corporativos, uso comprometido ou requisitos de roteamento de provedor personalizado.











