MW BasicRouter
Console

BasicRouter Docs

Quickstart

BasicRouter gives production teams one stable API for model access, routing, fallback, usage tracking, and credit-based billing. LLM token supply is sourced from trusted enterprise cloud original-provider accounts, with privacy protection, high stability, and request traceability built into the gateway.

Base URLhttps://api.basicrouter.ai/api
OpenAI-compatiblehttps://api.basicrouter.ai/api/v1
Anthropic-messageshttps://api.basicrouter.ai/api/v1
AuthAuthorization: Bearer <key>

Create an API key

Create a BasicRouter API key in the console. Keep the key on your server and never expose it in browser or mobile client code.

Recommended key strategy:

Key typeRecommended usage
Development keyLocal development, staging, testing, and prototypes.
Production keyBackend production workloads only.
Integration keyDedicated key for tools such as Cursor, Claude Code, Codex, Hermes, or OpenClaw.
Customer / tenant keyOptional key isolation for enterprise customers, tenant traffic, or business units.

Rotate keys when team access changes. Revoke keys that are no longer used.

Point your SDK at BasicRouter

Most OpenAI-compatible clients only need a new base URL and API key.

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.BASICROUTER_API_KEY,
  baseURL: "https://api.basicrouter.ai/api/v1"
});

Send a chat completion

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." }
    ]
  }'

Check usage and balance

curl --request GET \
  --url https://api.basicrouter.ai/api/v1/billing/balance \
  --header "Authorization: Bearer $BASICROUTER_API_KEY"

Model Discovery

Use the Models page or the Models API to inspect available text models. Model metadata includes vendor, serving provider, modality, context length, supported API families, supported capabilities, availability, account-level limits, and credit pricing.

Endpoint: GET /v1/models Purpose: List models available to the current account.

curl --request GET \
  --url https://api.basicrouter.ai/api/v1/models \
  --header "Authorization: Bearer $BASICROUTER_API_KEY"

Capability matrix

CapabilityDescriptionCommonly used by
streamingSupports server-sent event streaming.Chat apps, coding agents, real-time UX.
tool_callingSupports tool or function calling.Agents, workflow automation, coding assistants.
structured_outputsSupports schema-constrained or JSON outputs.Data extraction, workflow automation, enterprise apps.
json_modeCan return JSON-formatted output.Lightweight structured responses.
visionAccepts image input.Multimodal chat, UI analysis, document screenshots.
prompt_cachingSupports cached input or context reuse.Long-context agents, repeated system prompts.
reasoningSupports explicit reasoning controls where available.Complex planning, coding, analysis workflows.
logprobsSupports token probability output.Evaluation, ranking, advanced NLP workflows.

API family compatibility matrix

API familyTextVision inputTool callingStructured outputStreamingNotes
OpenAI Chat CompletionsYesModel-dependentModel-dependentModel-dependentYesBest default for OpenAI-compatible agents and SDKs.
OpenAI ResponsesYesModel-dependentModel-dependentModel-dependentYesRecommended for newer OpenAI-style agent workflows.
Anthropic MessagesYesModel-dependentModel-dependentModel-dependentYesBest for Claude-compatible clients and Claude Code.
Gemini OpenAI compatibilityYesModel-dependentModel-dependentModel-dependentYesUse Gemini models through OpenAI-style clients.
Gemini native compatibilityYesModel-dependentModel-dependentModel-dependentYesBest for existing Gemini-native applications.
BasicRouter image generationNoModel-dependentNoNoNoUses async task polling or webhook.
BasicRouter video generationNoModel-dependentNoNoNoUses async task polling or webhook.

Authentication

Every API request uses a bearer token. Store keys in server-side environment variables, rotate them when team access changes, and log request IDs for debugging.

HeaderValueNotes
AuthorizationBearer YOUR_API_KEYRequired for every request.
Content-Typeapplication/jsonRequired for JSON request bodies.

Key security recommendations

  1. Keep API keys on the server. Do not expose keys in browser or mobile client code.
  2. Use separate keys for development, staging, production, and third-party integrations.
  3. Scope keys by environment, service, customer, or tenant when available.
  4. Rotate keys after employee departures, vendor access changes, or suspected leakage.
  5. Store keys in secret managers or environment variables, not source code.

Coding Agents

BasicRouter works with coding agents and AI development tools that support OpenAI-compatible or Anthropic-compatible API endpoints. Use routing aliases such as mwf/coding-auto so BasicRouter can route to the best available coding model without requiring developers to change tool configuration.

Generic OpenAI-compatible setup

Use this setup for Cursor, Codex, Hermes, OpenClaw, Continue, Aider, Cline, LangChain-based agents, LlamaIndex-based agents, and custom OpenAI-compatible agent runtimes.

export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"

Generic Anthropic-compatible setup

Use this setup for Claude-compatible clients and tools that expect Anthropic Messages format.

export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
Use caseRecommended aliasRequirements
General codingmwf/coding-autoTool calling, streaming, strong coding ability.
Fast coding chatmwf/coding-fastLow latency and streaming.
Large repo analysismwf/coding-longLong context and stable output.
Cost-sensitive coding assistantmwf/low-costLower price and acceptable coding quality.
UI screenshot / vision codingmwf/vision-chatVision input and text output.

Cursor quick guide

Use the OpenAI-compatible endpoint.

Base URL: https://api.basicrouter.ai/api/v1
API Key:  BASICROUTER_API_KEY
Model:    mwf/coding-auto

Recommended steps:

  1. Open Cursor settings.
  2. Add or enable OpenAI-compatible API key configuration.
  3. Set the OpenAI base URL override to https://api.basicrouter.ai/api/v1.
  4. Add a custom model such as mwf/coding-auto, mwf/coding-fast, or mwf/coding-long.
  5. Use a model that supports streaming and tool calling for best agent behavior.

Troubleshooting:

IssueSuggested fix
Model not shownAdd the model name manually as a custom model.
Tool calling failsUse a model with tool_calling: true in the Models page.
Streaming interruptedRetry with backoff or use a routing alias with fallback.
401 errorCheck the API key and base URL.
404 model errorConfirm the model is enabled for the account.

Claude Code quick guide

Use the Anthropic-compatible gateway endpoint.

export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"

BasicRouter supports this Anthropic-compatible path for Claude Code and Anthropic SDK compatibility:

POST /api/v1/messages

Recommended requirements:

RequirementReason
Anthropic Messages-compatible request shapeClaude Code expects Anthropic-style messages.
Streaming supportClaude Code relies on streaming UX.
Tool calling supportRequired for agentic coding workflows.
Long contextUseful for repository-level tasks.
Stable fallbackUseful for long-running coding sessions.

Codex quick guide

Use BasicRouter as a custom OpenAI-compatible model provider.

Example provider configuration:

[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"

Environment variable:

export BASICROUTER_API_KEY="br_xxx"

Recommended models:

ModelUse case
mwf/coding-autoDefault coding agent model.
mwf/coding-longLarge repository context.
mwf/coding-fastFast iteration and small changes.

Troubleshooting:

IssueSuggested fix
Auth errorConfirm env_key points to BASICROUTER_API_KEY.
Model not foundAdd the alias in BasicRouter Console or use a direct model ID.
Responses API errorUse wire_api = "responses" only for models and endpoints that support Responses.
Chat Completions-only modelSwitch to a chat-compatible wire API if the client supports it.

Hermes quick guide

Use the OpenAI-compatible endpoint unless your Hermes deployment is configured for another protocol.

export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"

Recommended model policy:

Hermes workloadModel
General code generationmwf/coding-auto
Low-latency task executionmwf/coding-fast
Long-context repo scanmwf/coding-long
Cost-sensitive background tasksmwf/low-cost

OpenClaw quick guide

Use the OpenAI-compatible endpoint for OpenAI-style agent runtime configuration.

export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"

If OpenClaw supports multiple providers, configure BasicRouter as an OpenAI-compatible provider and use BasicRouter routing aliases for model selection.

{
  "provider": "openai-compatible",
  "base_url": "https://api.basicrouter.ai/api/v1",
  "api_key_env": "BASICROUTER_API_KEY",
  "model": "mwf/coding-auto"
}

Agent compatibility checklist

CapabilityRequired for
StreamingGood terminal/editor UX.
Tool callingAgentic coding, file edits, command execution.
Long contextLarge repositories and multi-file changes.
Structured outputsPlanning, task decomposition, automated workflows.
Vision inputUI screenshot analysis and design-to-code workflows.
FallbackProduction stability and long-running tasks.

Using the Console

The BasicRouter Console is the operational control plane for API access, model availability, routing policies, usage visibility, and billing administration. It gives account administrators a centralized view of keys, models, requests, credits, and account-level controls for production model traffic.

Managing API keys

Create, rotate, revoke, and label API keys from the console. Use separate keys for development, staging, production, and individual services so usage can be audited and isolated by environment or application.

PracticeDescription
Separate environmentsUse different API keys for development, staging, and production traffic.
Use descriptive labelsLabel keys by application, service, environment, or integration.
Rotate regularlyRotate keys when access changes or credentials may have been exposed.
Avoid client-side exposureKeep API keys on server-side systems only. Do not expose keys in browser or mobile client code.
Monitor key usageReview request volume, credit consumption, and error patterns by key.

Model list

Use the Models page to review models available to the account. Each model entry may include vendor, serving provider, modality, supported API families, context length, capability flags, availability status, and pricing information.

FilterPurpose
VendorFilter by model vendor such as OpenAI, Anthropic, Google, Qwen, DeepSeek, or other providers.
ProviderFilter by serving provider or cloud provider.
ModalityFilter by text, image, video, embedding, audio, or multimodal support.
CapabilityFilter by streaming, tool calling, structured outputs, vision, prompt caching, or reasoning support.
AvailabilityIdentify models that are currently available to the account.

For production applications, verify model capabilities before enabling traffic. Some parameters and features are model-dependent and may not be supported across all API families.

Usage & logs

The Usage & Logs view provides operational visibility into API traffic. Teams can inspect request volume, selected models, resolved routing targets, credit consumption, latency, error codes, and request IDs.

  • Troubleshoot failed requests.
  • Identify high-cost workloads.
  • Compare model usage across applications and environments.
  • Validate routing and fallback behavior.
  • Investigate latency or provider availability issues.
  • Provide request IDs when contacting support.

Each API response includes or exposes a BasicRouter request ID. Store this ID in your application logs to make production debugging and support escalation more efficient.

Fallback

Fallback is BasicRouter's resilience mechanism. When the primary model or routing policy fails, the system automatically switches to a backup model to keep processing the request. This keeps your application responsive and minimizes the risk of service disruption.

High availability guarantee
Fallback acts like a safety net, keeping your application running smoothly even when a model failure, quota limit, or network fluctuation occurs.

Why fallback matters

In production, model services can run into a number of unpredictable issues:

  • Model service failure: the upstream API becomes temporarily unavailable or times out.
  • Performance fluctuation: high model load leads to slow or failed responses.
  • Routing failure: all candidate models selected by smart routing become unavailable.

Fallback keeps your application available by providing a reliable backup path.

Core advantages

AdvantageDescription
High availabilityAutomatic failover keeps the service running and reduces the impact of outages.
Transparent switchingThe system switches models automatically — no application code changes required.
Flexible configurationSupports both per-request and account-level configuration for different use cases.
Cost optimizationChoose a more cost-effective model as the fallback to control emergency costs.
Centralized managementConfigure once at the account level and it applies automatically to every request.

Global fallback model configuration

BasicRouter supports setting a global fallback model from the console backend. All requests automatically use this model as a backup when they fail.

How to configure it:

  1. Go to the BasicRouter strategy settings page.
  2. Find the Default Fallback Model setting.
  3. Select your global fallback model from the dropdown list.
  4. Save the setting to apply it immediately.

Advantages of global configuration:

  • No code changes required: configure once and it applies globally, with no need to repeat the setting on every request.
  • Centralized management: manage the fallback policy in one place for easier adjustment and monitoring.
  • Simplified maintenance: reduces code complexity and the chance of configuration errors.
  • Flexible override: request-level fallback configuration takes priority and can override the global setting for specific scenarios.

Request-level fallback configuration

For specific business scenarios, you can specify a fallback model on an individual request to override the global configuration.

Specify the fallback model with the router.fallBackModels parameter:

{
  "model": "claude-sonnet-4",
  "messages": [
    {
      "role": "user",
      "content": "Explain what quantum computing is"
    }
  ],
  "router": {
    "fallBackModels": ["glm-5.2"]
  }
}

Priority rules

When multiple fallback configurations are present, priority runs from highest to lowest:

  1. Request-level router.fallBackModels: the fallback model specified on an individual request.
  2. Global Default Fallback Model: the global fallback model configured in the console.
  3. No fallback: if neither is configured, the request returns an error on failure.
⚠ Important notes
  • If all fallback models fail, the system returns the failure reason from the last model attempted.
  • When a fallback occurs, the response indicates the model actually used, making it easy to monitor and analyze.

Account administration

Depending on account type, the console may include account-level model enablement, reseller or distributor controls, billing configuration, and access settings. Administrators can use these controls to align model access, usage visibility, and billing responsibility with applications, customer accounts, or business units.

Production operations checklist

ItemRecommendation
API keysUse dedicated production keys with clear labels.
ModelsConfirm model availability, pricing, context length, and required capabilities.
RoutingConfigure routing aliases or fallback policies for critical workloads.
LogsEnsure request IDs are captured in application logs.
BillingConfirm wallet balance, plan status, and credit deduction rules.
Rate limitsReview account-level RPM, TPM, concurrency, and media task limits.
AlertsMonitor usage growth, credit balance, errors, and provider availability.

Billing & Credits

BasicRouter uses a credit-based billing model across text, image, video, and other supported model workloads. Credits provide a unified unit for multi-model and multi-provider usage so teams can manage consumption consistently across modalities and API families.

Detailed model pricing is available on the Models page or through model metadata APIs. Pricing may vary by model, provider, modality, resolution, token type, output length, task duration, account type, and commercial agreement.

Top up & wallet

Accounts may add pay-as-you-go wallet credits for flexible usage. Wallet credits are used after monthly plan credits and resource packs have been consumed, unless a custom billing rule applies to the account.

Wallet credits do not expire unless otherwise specified in applicable commercial terms. Service fee is charged when recharging the pay-as-you-go wallet.

Monthly plans and resource packs

Each user or account can select one active monthly plan. Monthly plans provide a defined amount of usage capacity, commercial terms, and account-level access configuration for the billing period.

Users can also buy multiple resource packs for additional usage capacity. Resource packs can separate committed usage from pay-as-you-go wallet balance and are useful for high-volume text, image, video, or dedicated workload usage.

Deduction order

Unless custom billing rules are configured, credits are deducted in the following order:

PriorityCredit sourceDescription
1Monthly planIncluded monthly usage capacity is consumed first.
2Resource packsAdditional purchased packs are consumed after monthly plan credits.
3Pay-as-you-go walletWallet balance is consumed after plan and resource pack credits.

For accounts with custom commercial terms, deduction order, expiration rules, included usage, and pricing may differ. Account-specific rules are shown in the console or provided through the commercial agreement.

Custom pricing

Pricing can be customized for each user or account. Enterprise customers, reseller accounts, distributor accounts, and high-volume customers may be eligible for custom pricing. Contact sales for a quote.

Custom pricing can be configured by account, model, provider, modality, region, usage volume, or commercial agreement. When custom pricing is enabled, the console and billing APIs reflect account-specific pricing and deduction rules where available.

Pricing units

Different model modalities use different measurement units. BasicRouter converts these units into credits according to the model’s pricing rules.

ModalityCommon pricing basis
TextInput tokens, output tokens, cached read tokens, cached write tokens, reasoning tokens, or model-specific token categories.
ImageModel, resolution, number of generated images, input image usage, editing mode, or quality setting.
VideoModel, output resolution, generated seconds, aspect ratio, input image or video usage, and task type.
EmbeddingsInput tokens or number of embedding records.
AudioInput duration, output duration, transcription length, or model-specific audio units.

Pricing units may vary by model. Always refer to the model detail page or pricing metadata before enabling a model in production.

Usage attribution

BasicRouter usage can be reviewed by account, API key, model, modality, or time range. This allows teams to attribute cost to applications, environments, customers, or internal business units.

DimensionDescription
API keyGroup usage by application, service, or environment.
ModelCompare cost and volume by selected model.
Resolved modelReview the actual model used after routing or fallback.
ModalitySeparate text, image, video, embedding, and audio usage.
Time rangeReview daily, monthly, or custom reporting periods.
MetadataGroup usage by custom request metadata such as customer ID, tenant ID, user ID, or environment.

Credit balance

Check how many credits are available across your account. The balance is split into three wallets that are deducted in order: the monthly plan allowance, purchased resource packs, and the pay-as-you-go wallet. A combined resource total (monthly plan + resource packs, excluding pay-as-you-go) is also available for tracking included usage separately from top-up spending.

To retrieve this programmatically, see GET /v1/billing/balance in the API Reference.

Usage details

Review a paginated, chronological list of individual usage records for reporting, monitoring, and internal cost allocation. Each record shows the model, model type (text, image, or video), the credits deducted, and a breakdown of which wallet each deduction was drawn from. Results can be filtered to a specific time range.

To retrieve this programmatically, see GET /v1/usage in the API Reference.

Transaction history

Use transaction history to review credit movements, including top-ups, plan allocations, resource pack grants, usage deductions, adjustments, and administrative corrections.

To retrieve this programmatically, see GET /v1/billing/transactions in the API Reference.

Failed requests and refunds

Validation errors, authentication errors, and permission errors are generally not billed because no model execution occurs. Requests that reach an upstream model or generate partial output may consume credits depending on the model, provider, and response state.

For async image and video tasks, billing behavior depends on whether the task was accepted, started, completed, failed, or cancelled. The task detail response includes usage information when credits have been consumed.

Top-ups, monthly plans, resource packs, and consumed credits are non-refundable unless otherwise specified in the applicable commercial agreement or required by law.

API Reference

Common conventions

Base URL

All endpoints are served under the /v1 prefix.

Authentication

Calls to /v1/* endpoints use API Key authentication (not JWT). The API Key is passed via the following header:

HeaderFormatDescription
AuthorizationBearer <api_key>OpenAI-style. The Anthropic-compatible endpoint also accepts x-api-key with anthropic-version: 2023-06-01.

Missing or invalid keys return 401.

Balance pre-check

All model-calling endpoints run a balance pre-check before execution:

  • Insufficient balance returns Insufficient credit, mapped to:
    • OpenAI protocol: HTTP 400, code = insufficient_quota
    • Anthropic protocol: HTTP 402, type = billing_error
  • Some endpoints also estimate a minimum cost per model for a second pre-check.

POST https://api.basicrouter.ai/api/v1/chat/completions

OpenAI Chat Completions-compatible endpoint. Supports streaming and non-streaming, tool calls, JSON mode, and multimodal input.

FieldTypeRequiredDescription
modelStringYesModel name.
messagesMessage[]YesConversation messages.
streamBooleanNoStream mode, default false.
temperatureDoubleNoSampling temperature.
max_tokensIntegerNoMaximum output tokens.
top_pDoubleNoNucleus sampling.
presence_penaltyDoubleNo
frequency_penaltyDoubleNo
toolsTool[]NoTool definitions.
tool_choiceString|ObjectNoauto / none / required / specific function.
response_formatObjectNo{type, json_schema:{name,schema,strict}}; text/json_object/json_schema.
parallel_tool_callsBooleanNo
metadataMapNoPass-through metadata.

Message fields:

FieldTypeDescription
roleStringsystem / user / assistant / tool.
contentString|ArrayPlain text or multimodal content block array ([{type:"text",text},{type:"image_url",image_url:{url}}]).
tool_call_idStringLinks to the tool_calls when role=tool.
tool_callsToolCall[]Present when role=assistant makes tool calls.
FieldTypeDescription
typeStringFixed function.
functionObjectFunction definition.
function.nameStringFunction name.
function.descriptionStringFunction description.
function.parametersObjectJSON Schema for inputs.
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}
}

Response fields (non-streaming):

FieldTypeDescription
idStringCompletion id.
objectStringFixed chat.completion.
createdLongCreated timestamp (seconds).
modelStringModel name.
choicesChoice[]{index, message:{role, content, tool_calls?}, finish_reason}.
usageObject{prompt_tokens, completion_tokens, total_tokens}.
FieldTypeDescription
idStringTool call id.
typeStringFixed function.
functionObjectFunction call details.
function.nameStringFunction name.
function.argumentsObjectFunction arguments.

Streaming response example:

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

OpenAI Responses-compatible endpoint. Uses input instead of messages, instructions instead of a system message, and a text block instead of response_format.

FieldTypeRequiredDescription
modelStringYesModel name.
inputString|ArrayYesPlain string (user message) or message object array.
instructionsStringNoSystem prompt.
streamBooleanNoDefault false.
max_output_tokensIntegerNoMaximum output tokens.
temperatureDoubleNoDefault 1.
top_pDoubleNo
toolsTool[]NoTop-level {type, name, description, parameters}.
tool_choiceString|ObjectNoauto/none/required/{type,name}.
textObjectNo{format:{type, name, schema, strict}}; text/json_object/json_schema.
metadataMapNo
previous_response_idStringNoPrevious response id for multi-turn.
parallel_tool_callsBooleanNo
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}
}

Response fields (non-streaming):

FieldTypeDescription
idStringResponse id.
objectStringFixed response.
modelStringModel name.
statusStringe.g. completed.
created_atLongCreated timestamp (seconds).
outputArrayOutput 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}.
usageObject{input_tokens, output_tokens, total_tokens}. For Claude models, input_tokens includes cache_read and output_tokens includes cache_write.

Streaming follows the Responses API events:

EventDescription
response.createdStart of the response stream.
response.output_text.deltaIncremental text output update.
response.completedEnd of the response stream.

POST https://api.basicrouter.ai/api/v1/messages

Anthropic Messages-compatible endpoint. Accepts x-api-key and anthropic-version: 2023-06-01 headers. Content blocks support text, image, tool_use, tool_result, thinking, and redacted_thinking.

FieldTypeRequiredJSON fieldDescription
modelStringYesmodelModel name.
messagesMessage[]YesmessagesConversation messages.
systemString|ArrayNosystemSystem prompt, string or [{type,text}].
maxTokensIntegerYesmax_tokensMaximum output tokens.
streamBooleanNostreamStreaming.
temperatureDoubleNotemperature
topPDoubleNotop_p
topKIntegerNotop_k
toolsTool[]NotoolsTool definitions (input_schema).
toolChoiceObjectNotool_choice
metadataMapNometadata
thinkingObjectNothinkingExtended thinking config.
stopSequencesObjectNostop_sequences
anthropicBetaObjectNoanthropic_betaBeta feature header.
FieldTypeDescription
roleStringMessage role, e.g. user / assistant.
contentString|ContentBlock[]Plain text or an array of content blocks.
FieldTypeDescription
typeStringOne of text, image, tool_use, tool_result, thinking, redacted_thinking.
textStringPresent when type is text.
sourceObjectPresent when type is image.

Image block examples:

{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }
FieldTypeDescription
nameStringFunction name.
descriptionStringFunction description.
input_schemaObjectJSON Schema for inputs.
cache_controlObjectOptional cache control.
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}
}

Response fields (non-streaming):

FieldTypeDescription
idStringMessage id.
typeStringFixed message.
roleStringFixed assistant.
modelStringModel name.
contentContentBlock[]Response content blocks (e.g. {type:"text", text}, {type:"tool_use", ...}).
stop_reasonStringe.g. end_turn, tool_use, max_tokens.
usageObject{input_tokens, output_tokens}.
EventDescription
message_startStart of the message stream.
content_block_startStart of a new content block.
content_block_deltaIncremental update for a content block.
content_block_stopEnd of a content block.
message_deltaIncremental update for the message.
message_stopEnd of the message stream.

GET https://api.basicrouter.ai/api/v1/models

Returns all online, enabled API models.

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
    }
  ]
}

Each model entry (data[]) fields:

FieldTypeDescription
idStringModel id.
objectStringFixed model.
display_nameStringDisplay name.
createdLongCreated timestamp (seconds).
owned_byStringOwner / vendor.
input_modalitiesString[]e.g. ["text","image"].
output_modalitiesString[]e.g. ["text"].
context_lengthIntegerMaximum context length.

GET https://api.basicrouter.ai/api/v1/models/{model}

Returns a single model with the same shape as a list entry. Returns HTTP 404 when the model does not exist.

curl --request GET \
  --url https://api.basicrouter.ai/api/v1/models/gpt-5.5 \
  --header "Authorization: Bearer $BASICROUTER_API_KEY"

Success response: a single model object with the same fields as a /v1/models list entry.

When the model does not exist, returns 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

Query the resolutions, ratios, and maximum counts supported by an image model before calling /v1/image-generations. No authentication required.

FieldTypeDescription
idStringModel id.
objectStringFixed image_model.
displayNameStringDisplay name.
descriptionStringModel description.
iconStringIcon URL.
createdLongCreated timestamp (seconds).
maxCountIntegerMax images per request.
fileMaxIntegerMax reference images.
resolutionsString[]Supported resolutions, e.g. ["720p","1080p"].
ratiosString[]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

Query the supported videoType values, duration range, resolutions, and ratios for a video model before calling /v1/video-generations. No authentication required.

FieldTypeDescription
idStringModel id.
objectStringFixed video_model.
displayNameStringDisplay name.
descriptionStringModel description.
iconStringIcon URL.
createdLongCreated timestamp (seconds).
allowedVideoTypesVideoTypeOption[]Supported videoType list.
videoDurationMinIntegerMinimum seconds per clip.
videoDurationMaxIntegerMaximum seconds per clip.
videoDurationSuggestInteger[]Recommended duration steps, e.g. [5,8,10].
resolutionsString[]Supported resolutions.
ratiosString[]Supported aspect ratios.
resolutionOptionsResolutionOption[]Structured resolution+ratio+size combos.
fileMaxIntegerMax reference assets.

VideoTypeOption fields:

FieldTypeDescription
codeIntegerThe videoType value to pass to /v1/video-generations.
nameStringLocalized type name (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

Asynchronously submit an image generation task. Returns a taskId immediately; retrieve the result by polling GET /v1/image-generations/{taskId} or via a callbackUrl webhook.

The model, supported resolution / ratio values, count upper limit, and reference-image upload limit (fileMax) must be obtained from GET /v1/image-models first. Only values advertised by that model's spec are accepted.

FieldTypeRequiredDescription
textStringYesPrompt.
modelStringYesModel name.
imageUrlsString[]NoReference image URLs (image-to-image).
countIntegerNoNumber of images (≥0).
resolutionStringNoResolution (see /v1/image-models).
ratioStringNoAspect ratio.
callbackUrlStringNoTask-level webhook URL.
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"}
}

Error responses:

// 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}

Poll an image generation task. status is pending / success / failed. images is a JSON-stringified array of image URLs; text carries any model-attached text description (e.g. Gemini multimodal output), null otherwise.

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
  }
}

Response data fields:

FieldTypeDescription
taskIdStringTask id.
statusStringpending / success / failed.
errorMessageStringFailure reason, null on success.
imagesStringJSON-stringified array of image URLs, e.g. "[\"https://.../1.png\"]".
textStringModel-attached text description (e.g. Gemini multimodal output); null otherwise.

Task not found:

{ "code": 500, "message": "task not found" }

If callbackUrl was supplied on submit, the server pushes the final success / failed result via webhook with the same data shape.

Complete example (submit + poll)
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

Asynchronously submit a video generation task. Returns a taskId immediately; retrieve the result by polling GET /v1/video-generations/{taskId} or via a callbackUrl webhook.

The model, allowed videoType values, duration range (videoDurationMin/Max), supported resolution / ratio, and reference-asset upload limit (fileMax) must be obtained from GET /v1/video-models first. Only videoType codes listed in that model's allowedVideoTypes are accepted.

FieldTypeRequiredDescription
textStringYesPrompt.
modelStringYesModel name.
videoTypeIntegerYes1 text-to-video / 2 image-to-video (first frame) / 3 image-to-video (first+last frame) / 4 image-to-video (reference) / 5 all reference.
imageUrlsString[]NoImage asset URLs.
videoUrlsVideoUrl[]|String[]NoVideo asset URLs.
audioUrlsString[]NoAudio asset URLs.
resolutionStringNoResolution.
ratioStringNoAspect ratio.
durationLongNoSeconds (>0).
callbackUrlStringNoTask-level webhook URL.

Examples for each videoType:

1. Text to video (videoType=1)

Generate a video from a text prompt only; no reference assets needed.

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. Image to video - first frame (videoType=2)

Provide a single starting frame in imageUrls; the model generates a video starting from that 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. Image to video - first and last frame (videoType=3)

Provide both the first and last frame in imageUrls (order: [first, last]); the model generates a transition video between the two 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. Image to video - reference (videoType=4)

Provide one or more reference images in imageUrls; the model uses their style/content as reference (not as a forced first/last frame) to generate the 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. All reference (videoType=5)

Mixed image / video / audio references. Reference assets by position in the prompt: the 1st entry in imageUrls is @图片 1, the 1st in videoUrls is @视频 1, the 1st in audioUrls is @音频 1. videoUrls also accepts plain URL strings.

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
  }'

Submit response (all five types):

{
  "code": 200,
  "message": "success",
  "data": {"taskId": "vid_xxx"}
}

GET https://api.basicrouter.ai/api/v1/video-generations/{taskId}

Poll a video generation task. status is pending / success / failed; videoUrl is the generated video URL and lastFrameUrl is the last-frame URL (image-to-video scenarios).

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
  }
}

Response data fields:

FieldTypeDescription
statusStringpending / success / failed.
videoUrlStringGenerated video URL.
lastFrameUrlStringLast-frame URL (image-to-video scenarios); null otherwise.
messageStringFailure reason, null on success.

If callbackUrl was supplied on submit, the server pushes the final result via webhook with the same data shape.

Complete example (submit + poll)
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

Returns the account balance split into three wallets: monthly plan, resource packs, and pay-as-you-go credit.

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
  }
}

Response fields:

FieldTypeDescription
totalCreditBigDecimalTotal balance.
totalResourceCreditBigDecimalSum of resource-pack balances.
wallets.monthlyPlanWalletDetailMonthly plan (null if none).
wallets.resourcePacksWalletDetail[]Resource pack list.
wallets.payAsYouGoBigDecimalPay-as-you-go balance.

WalletDetailVO fields::

FieldTypeDescription
idStringWallet id.
creditBigDecimalBalance credits.
nameStringWallet name.

GET https://api.basicrouter.ai/api/v1/usage

Paginated model-call billing details, snapshoted by price (priceSnapshotId), ordered by order creation time descending. Only normal charge records (reason = model usage) are returned.

Query parameters:

ParameterTypeRequiredDefaultDescription
pageIntegerNo1Page number, 1-based.
sizeIntegerNo20Page size (paginated by priceSnapshotId).
startTimeLocalDateTimeNoStart time, format yyyy-MM-ddTHH:mm:ss, filters by snapshot orderCreatedAt.
endTimeLocalDateTimeNoEnd time, format 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"

Response wrapper:

{
  "code": 0,
  "message": "success",
  "data": { ... }
}
FieldTypeDescription
recordsUsageDetailVO[]Current page records.
totalLongTotal count.
currentLongCurrent page.
sizeLongPage size.
pagesLongTotal pages.

UsageDetailVO fields:

FieldTypeDescription
priceSnapshotIdStringPrice snapshot id.
taskIdStringTask id.
creditBigDecimalCharged amount.
modelStringModel name.
modelTypeStringtext / image / video.
inputTokensLongInput tokens; null for image/video.
outputTokensLongOutput tokens.
totalTokensLongTotal tokens.
cacheReadTokensLongCache-read tokens.
cacheWriteTokensLongCache-write tokens.
imageCountIntegerImage count; set for image models.
imageResolutionStringImage resolution, e.g. 720P.
imageRatioStringImage aspect ratio, e.g. 1:1.
videoResolutionStringVideo resolution, e.g. 1080p.
videoRatioStringVideo aspect ratio, e.g. 16:9.
videoDurationSecLongVideo duration in seconds.
orderCreatedAtLocalDateTimeOrder creation time (snapshot orderCreatedAt).
creditDetailsCreditDetailItem[]Order details under this snapshot (from credit_order_t).

CreditDetailItem fields:

FieldTypeDescription
creditBigDecimalAmount charged by this order.
deductionSourceStringDeduction source (Balance / Monthly Package / Resource Package).
packageNameStringPackage name; null if no package.

Null-value convention: only the fields relevant to each modelType are populated; the rest are null. text populates the token fields; image populates imageCount/imageResolution/imageRatio; video populates videoResolution/videoRatio/videoDurationSec.

Response example:

{
  "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

Paginated list of the current user's paid (status=2) recharge transactions, ordered by created_at descending.

ParameterTypeRequiredDefaultDescription
pageIntegerNo1Page number.
sizeIntegerNo20Page size.
startTimeStringNoStart time, yyyy-MM-dd HH:mm:ss, inclusive.
endTimeStringNoEnd time, yyyy-MM-dd HH:mm:ss, inclusive.
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"

Response wrapper:

{
  "code": 0,
  "message": "success",
  "data": { ... }
}
FieldTypeDescription
recordsTransactionVO[]Current page transactions.
totalLongTotal count.
currentLongCurrent page.
sizeLongPage size.
pagesLongTotal pages.

TransactionVO fields:

FieldTypeDescription
orderNoStringOrder number.
thirdPartyOrderNoStringThird-party order number.
amountBigDecimalOrder amount.
actualAmountBigDecimalActually paid amount.
discountBigDecimalDiscount amount.
paymentMethodStringPayment method (wechat / alipay / ustd / stripe / wallyt etc.).

TransactionVO fields:

FieldTypeDescription
serviceFeeAmountBigDecimalService fee amount.
paymentChannelStringPayment platform.
sourceStringOrder source (recharge / package_purchase etc.).
packageNameStringPackage name (set for package purchases; null for plain recharges).
createdAtLocalDateTimeCreation time.
{
  "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
  }
}

Operational

Errors

BasicRouter returns stable error codes so applications can handle retries, fallbacks, billing issues, and debugging consistently.

Provider-compatible endpoints try to preserve the original API family's error shape where possible. BasicRouter-native endpoints use the BasicRouter error object.

HTTP status and error code mapping

HTTP statusError typeExample codesRetry
400invalid_request_errorinvalid_request, unsupported_parameter, invalid_messages, invalid_image_urlNo
401authentication_errormissing_api_key, invalid_api_keyNo
402billing_errorinsufficient_credits, payment_required, quota_exceededNo
403permission_errormodel_access_denied, endpoint_access_denied, key_scope_deniedNo
404not_found_errormodel_not_found, response_not_found, task_not_foundNo
408timeout_errorgateway_timeout, provider_timeoutYes
409conflict_erroridempotency_conflict, task_already_cancelledDepends
422validation_errorschema_validation_failed, unsupported_modalityNo
429rate_limit_erroraccount_rpm_exceeded, account_tpm_exceeded, provider_rate_limitedYes
500internal_errorinternal_errorYes
502provider_errorprovider_bad_gateway, provider_invalid_responseYes
503service_unavailablemodel_unavailable, provider_unavailable, insufficient_capacityYes
504timeout_errorprovider_timeout, gateway_timeoutYes

Common error codes

CodeMeaningRecommended action
missing_api_keyNo API key was provided.Add the Authorization header.
invalid_api_keyAPI key is invalid or revoked.Create or rotate the API key.
model_not_foundModel ID does not exist or is not enabled for the account.Check the Models page or call GET /v1/models.
model_access_deniedAPI key or account does not have access to the model.Enable the model or contact admin.
unsupported_parameterRequest includes a parameter unsupported by the selected endpoint or model.Remove the parameter or choose a compatible model.
unsupported_modalityInput or output modality is not supported by the selected model.Choose a model that supports the modality.
account_rpm_exceededAccount requests per minute limit exceeded.Retry with backoff or request higher limits.
account_tpm_exceededAccount tokens per minute limit exceeded.Retry with backoff, reduce tokens, or request higher limits.
provider_rate_limitedUpstream provider rate limited the request.Retry or enable fallback.
insufficient_creditsAccount has insufficient credits.Top up wallet, buy a pack, or upgrade plan.
provider_timeoutUpstream provider did not respond in time.Retry or enable fallback.
model_unavailableModel is temporarily unavailable.Retry or use a routing alias.
content_policy_errorRequest or output was blocked by a safety policy.Modify input or choose a suitable workflow.
Model types

claude-fable-5

AWS · Anthropic · 1M 上下文

Image 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入10 积分
输出50 积分
缓存读取1 积分
缓存写入12.50 积分

claude-opus-4.6

AWS · Anthropic · 1M 上下文

Image 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入5 积分
输出25 积分
缓存读取0.50 积分
缓存写入10 积分

claude-opus-4.7

AWS · Anthropic · 1M 上下文

Image 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入5 积分
输出25 积分
缓存读取0.50 积分
缓存写入10 积分

claude-opus-4.8

AWS · Anthropic · 1M 上下文

Image 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入5 积分
输出25 积分
缓存读取0.50 积分
缓存写入10 积分

claude-opus-5

AWS · Anthropic · 1M 上下文

Text 输入Image 输入Openai chatOpenai responsesAnthropic
可用
输入5 积分
输出25 积分
缓存读取0.50 积分
缓存写入10 积分

claude-sonnet-4.6

AWS · Anthropic · 1M 上下文

Image 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入3 积分
输出15 积分
缓存读取0.30 积分
缓存写入6 积分

claude-sonnet-5

AWS · Anthropic · 1M 上下文

Image 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入2 积分
输出10 积分
缓存读取0.20 积分
缓存写入4 积分

deepseek-v3.2

TencentCloud · Alibaba Cloud · Deepseek · 128K 上下文

Openai chatOpenai responsesAnthropic
可用
输入0.57 积分
输出1.71 积分
缓存读取0.11 积分
缓存写入0.11 积分

deepseek-v4-flash

TencentCloud · Deepseek · 1M 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.14 积分
输出0.28 积分
缓存读取0.03 积分
缓存写入0.03 积分

deepseek-v4-pro

TencentCloud · Deepseek · 1M 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入1.74 积分
输出3.48 积分
缓存读取0.14 积分
缓存写入0.14 积分

dola-seed-2-0-mini

BytePlus · Bytedance · 262K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responses
可用
输入0.20 积分
输出0.80 积分
缓存读取0.04 积分
缓存写入0.01 积分

dola-seed-2-0-mini-white

BytePlus · Bytedance · 262K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responses
可用
输入0.20 积分
输出0.80 积分
缓存读取0.04 积分
缓存写入0.01 积分

dola-seed-2-1-turbo

BytePlus · Bytedance · 262K 上下文

Image 输入Text 输入Video 输入Openai chatOpenai responses
可用
输入0.50 积分
输出2.50 积分
缓存读取0.10 积分
缓存写入0.01 积分

dola-seed-2.0-code

BytePlus · Bytedance · 262K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responses
可用
输入0.50 积分
输出3 积分
缓存读取0.10 积分
缓存写入0.01 积分

dola-seed-2.0-lite

BytePlus · Bytedance · 262K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responses
可用
输入0.50 积分
输出4 积分
缓存读取0.10 积分
缓存写入0.01 积分

dola-seed-2.0-pro

BytePlus · Bytedance · 262K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responses
可用
输入1 积分
输出6 积分
缓存读取0.20 积分
缓存写入0.01 积分

doubao-seed3d-1.0

即将推出

gemini-3-flash-preview

Google · Gemini · 1.0M 上下文

Image 输入Video 输入Text 输入Openai chat
可用
输入0.50 积分
输出3 积分
缓存读取0.05 积分
缓存写入0.05 积分

gemini-3.1-pro-preview

Google · Gemini · 1.0M 上下文

Image 输入Text 输入Video 输入Openai chat
可用
输入4 积分
输出18 积分
缓存读取0.40 积分
缓存写入0.40 积分

gemini-omni-flash-preview

Google · Gemini

文生视频按秒
即将推出
单价 / 秒0.10 积分 / 秒

glm-5

TencentCloud · Zai · 200K 上下文

Openai chatAnthropic
可用
输入1 积分
输出3.20 积分
缓存读取0.20 积分
缓存写入0.20 积分

glm-5-turbo

TencentCloud · Zai · 200K 上下文

Text 输入Openai chatAnthropic
可用
输入1.20 积分
输出4 积分
缓存读取0.24 积分
缓存写入0.24 积分

glm-5.1

TencentCloud · Zai · 200K 上下文

Text 输入Openai chatAnthropic
可用
输入1.40 积分
输出4.40 积分
缓存读取0.26 积分
缓存写入0.26 积分

glm-5.2

TencentCloud · Zai · 1M 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入1.40 积分
输出4.40 积分
缓存读取0.26 积分
缓存写入0.26 积分

glm-5v-turbo

TencentCloud · Zai · 200K 上下文

Image 输入Openai chatAnthropic
可用
输入1.20 积分
输出4 积分
缓存读取0.24 积分
缓存写入0.24 积分

gpt-5-nano

MicrosoftAzure · Openai · 400K 上下文

Image 输入Text 输入Openai chatOpenai responses
可用
输入0.05 积分
输出0.40 积分
缓存读取- 积分
缓存写入- 积分

gpt-5.4

MicrosoftAzure · Openai · 1.1M 上下文

Image 输入Text 输入Openai chatOpenai responses
可用
输入5 积分
输出22.50 积分
缓存读取0.50 积分
缓存写入0.50 积分

gpt-5.5

MicrosoftAzure · Openai · 1.1M 上下文

Image 输入Text 输入Openai chatOpenai responses
可用
输入5 积分
输出30 积分
缓存读取0.50 积分
缓存写入0.50 积分

gpt-5.6-luna

MicrosoftAzure · Openai · 1.1M 上下文

Text 输入Image 输入Openai chatOpenai responses
可用
输入2 积分
输出9 积分
缓存读取0.20 积分
缓存写入2.50 积分

gpt-5.6-sol

MicrosoftAzure · Openai · 1.1M 上下文

Text 输入Image 输入Openai chatOpenai responses
可用
输入10 积分
输出45 积分
缓存读取1 积分
缓存写入12.50 积分

gpt-5.6-terra

MicrosoftAzure · Openai · 1.1M 上下文

Text 输入Image 输入Openai chatOpenai responses
可用
输入5 积分
输出22.50 积分
缓存读取0.50 积分
缓存写入6.25 积分

gpt-image-2

MicrosoftAzure · Openai

图像生成1K/2K/4K按张
可用
单价 / 张0.41 积分

HappyHorse-1.0-i2v

Alibaba Cloud · HappyHorse

文生视频按秒
可用
单价 / 秒0.14 积分 / 秒

HappyHorse-1.0-i2v-white

Alibaba Cloud · HappyHorse

文生视频按秒
可用
单价 / 秒0.14 积分 / 秒

HappyHorse-1.0-r2v

Alibaba Cloud · HappyHorse

文生视频按秒
可用
单价 / 秒0.14 积分 / 秒

HappyHorse-1.0-r2v-white

Alibaba Cloud · HappyHorse

文生视频按秒
可用
单价 / 秒0.14 积分 / 秒

HappyHorse-1.0-t2v

Alibaba Cloud · HappyHorse

文生视频按秒
可用
单价 / 秒0.24 积分 / 秒

HappyHorse-1.0-t2v-white

Alibaba Cloud · HappyHorse

文生视频按秒
可用
单价 / 秒0.14 积分 / 秒

imagen 4 fast

Google · Gemini

图像生成2K按张
可用
单价 / 张0.02 积分

imagen 4 standard

Google · Gemini

图像生成2K按张
可用
单价 / 张0.04 积分

imagen 4 ultra

Google · Gemini

图像生成2K按张
可用
单价 / 张0.06 积分

kimi-k2.5

TencentCloud · Moonshot AI · 256K 上下文

Image 输入Video 输入Openai chatAnthropic
可用
输入0.60 积分
输出3 积分
缓存读取0.10 积分
缓存写入0.10 积分

kimi-k2.6

TencentCloud · Moonshot AI · 256K 上下文

Image 输入Text 输入Openai chatAnthropic
可用
输入0.86 积分
输出3.57 积分
缓存读取0.14 积分
缓存写入0.14 积分

kimi-k2.7-code

TencentCloud · Moonshot AI · 256K 上下文

Image 输入Video 输入Openai chatAnthropic
可用
输入0.95 积分
输出4 积分
缓存读取0.19 积分
缓存写入0.19 积分

kimi-k2.7-code-highspeed

TencentCloud · Moonshot AI · 256K 上下文

Image 输入Video 输入Openai chatOpenai responsesAnthropic
可用
输入1.90 积分
输出8 积分
缓存读取0.38 积分
缓存写入0.38 积分

kimi-k3

TencentCloud · Moonshot AI · 1M 上下文

Image 输入Text 输入Video 输入Openai chatOpenai responsesAnthropic
可用
输入3 积分
输出15 积分
缓存读取0.30 积分
缓存写入0.30 积分

kling-image-o1

Kling · Kling

图像生成2K/3K按张
可用
单价 / 张0.03 积分

kling-v3-omni-image

Kling · Kling

图像生成1K/2K/4K按张
可用
单价 / 张0.03 积分

kling-v3-omni-video

Kling · Kling

文生视频按秒
可用
单价 / 秒0.13 积分 / 秒

minimax-m2.5

TencentCloud · MiniMax · 200K 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.30 积分
输出1.20 积分
缓存读取0.03 积分
缓存写入0.03 积分

minimax-m2.7

TencentCloud · MiniMax · 200K 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.30 积分
输出1.20 积分
缓存读取0.06 积分
缓存写入0.06 积分

minimax-m3

TencentCloud · MiniMax · 1M 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.60 积分
输出2.40 积分
缓存读取0.12 积分
缓存写入0.12 积分

nano banana 2

Google · Gemini

图像生成1K/2K/4K按张
可用
单价 / 张0.07 积分

nano banana pro

Google · Gemini

图像生成1K/2K按张
可用
单价 / 张0.14 积分

qwen-image-2.0-pro

Alibaba Cloud · Qwen

图像生成2K按张
可用
单价 / 张0.07 积分

qwen-image-2.0-s-white

Alibaba Cloud · Qwen

图像生成2K按张
可用
单价 / 张0.07 积分

qwen-image-3.0-pro

Alibaba Cloud · Qwen

图像生成1K/2K按张
即将推出
单价 / 张0.07 积分

qwen-image-max

Alibaba Cloud · Qwen

图像生成2K按张
可用
单价 / 张0.07 积分

qwen-image-max-white

Alibaba Cloud · Qwen

图像生成2K按张
可用
单价 / 张0.07 积分

qwen-image-plus

Alibaba Cloud · Qwen

图像生成2K按张
可用
单价 / 张0.03 积分

qwen3-max

Alibaba Cloud · Qwen · 256K 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入1.20 积分
输出6 积分
缓存读取- 积分
缓存写入- 积分

qwen3-max-white

Alibaba Cloud · Qwen · 256K 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入2.40 积分
输出12 积分
缓存读取- 积分
缓存写入- 积分

qwen3-vl-flash

Alibaba Cloud · Qwen · 256K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.07 积分
输出0.60 积分
缓存读取0.01 积分
缓存写入0.10 积分

qwen3-vl-plus

Alibaba Cloud · Qwen · 256K 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.60 积分
输出4.80 积分
缓存读取- 积分
缓存写入- 积分

qwen3.5-plus

Alibaba Cloud · Qwen · 1M 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.50 积分
输出3 积分
缓存读取0.05 积分
缓存写入0.63 积分

qwen3.5-plus-white

Alibaba Cloud · Qwen · 1M 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.40 积分
输出0.24 积分
缓存读取0.04 积分
缓存写入0.50 积分

qwen3.6-plus

Alibaba Cloud · Qwen · 1M 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.50 积分
输出3 积分
缓存读取0.05 积分
缓存写入0.63 积分

qwen3.7-max

Alibaba Cloud · Qwen · 1M 上下文

Text 输入Openai chatOpenai responsesAnthropic
可用
输入2.50 积分
输出7.50 积分
缓存读取0.50 积分
缓存写入0.50 积分

qwen3.7-plus

Alibaba Cloud · Qwen · 1M 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responsesAnthropic
可用
输入0.40 积分
输出1.60 积分
缓存读取0.08 积分
缓存写入0.50 积分

qwen3.8-max

Alibaba Cloud · Qwen · 1M 上下文

Image 输入Video 输入Text 输入Openai chatOpenai responses
可用
输入2 积分
输出6 积分
缓存读取0.25 积分
缓存写入0.25 积分

seedance-1-5-pro

BytePlus · Bytedance

文生视频按秒
可用
单价 / 秒0.05 积分 / 秒

seedance-1-5-pro-white

BytePlus · Bytedance

文生视频按秒
可用
单价 / 秒0.05 积分 / 秒

seedance-2.0

BytePlus · Bytedance

文生视频按秒
可用
单价 / 秒0.15 积分 / 秒

seedance-2.0-fast

BytePlus · Bytedance

文生视频按秒
可用
单价 / 秒0.06 积分 / 秒

seedance-2.0-fast-white

BytePlus · Bytedance

文生视频按秒
可用
单价 / 秒0.06 积分 / 秒

seedance-2.0-white

BytePlus · Bytedance

文生视频按秒
可用
单价 / 秒0.07 积分 / 秒

seedance-2.5

BytePlus · Bytedance

文生视频按秒
即将推出
单价 / 秒0.11 积分 / 秒

seedream-4.5

BytePlus · Bytedance

图像生成2K/4K按张
可用
单价 / 张0.04 积分

seedream-4.5-white

BytePlus · Bytedance

图像生成2K/4K按张
可用
单价 / 张0.04 积分

seedream-5.0

BytePlus · Bytedance

图像生成2K/3K按张
可用
单价 / 张0.04 积分

seedream-5.0-white

BytePlus · Bytedance

图像生成2K/3K按张
可用
单价 / 张0.04 积分

veo 3.1

Google · Gemini

文生视频按秒
可用
单价 / 秒0.40 积分 / 秒

veo 3.1 lite

Google · Gemini

文生视频按秒
可用
单价 / 秒0.05 积分 / 秒

wan2.5-i2v-preview

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.10 积分 / 秒

wan2.6-i2v-flash

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.05 积分 / 秒

wan2.6-r2v-flash

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.05 积分 / 秒

wan2.6-t2v

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.10 积分 / 秒

wan2.6-t2v-white

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.10 积分 / 秒

wan2.7-i2v

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.10 积分 / 秒

wan2.7-i2v-s-white

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.26 积分 / 秒

wan2.7-i2v-white

Alibaba Cloud · Wan

文生视频按秒
可用
单价 / 秒0.10 积分 / 秒

wan2.7-image

Alibaba Cloud · Wan

图像生成2K按张
可用
单价 / 张0.03 积分

wan2.7-image-pro

Alibaba Cloud · Wan

图像生成2K按张
可用
单价 / 张0.07 积分