One catalog
Use text, image and video models through one account.
Use text, image and video models through one account.
Keep OpenAI and Anthropic request formats where supported.
Compare ArgoLink and official prices before you send a request.
Review token usage, requests and cost from the console.
Model catalog
QUICK START
Open your user center to view only your own balance, access, and usage.
Name the key, set its limits, and use every enabled model.
Set the API Base URL in your client and keep its native protocol.
From sign-up to your first request in about five minutes.
curl -sS https://54-151-42-83.sslip.io/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"input": "Introduce yourself in one sentence",
"stream": false
}'
First confirm an HTTP 2xx status, then check the response fields for the protocol you used: Responses returns output or output_text, while Chat Completions returns choices[0].message.content. Model IDs must come from the live catalog; each model page shows the correct request shape.
Every request goes to the same base URL, authenticated with your API key as a Bearer token.
| Protocol / capability | Endpoint |
|---|---|
| OpenAI Responses protocol | POST /v1/responses |
| OpenAI Chat Completions | POST /v1/chat/completions |
| Anthropic Messages protocol | POST /v1/messages |
| List available models (no auth, recommended) | GET /v1/models |
| List available models (no auth, compatibility path) | GET /models |
| List available models (no auth, Gemini format) | GET /v1beta/models |
| Image generation & edits | POST /v1/images/generations · /v1/images/edits |
| Video generation (async) | POST /v1/videos/generations |
The Models & Pricing page and all three model-discovery endpoints below are public. They do not require a signed-in session, cookie, or API key. All three read the same ArgoLink catalog; only the public path and JSON protocol shape differ.
| Endpoint | Response shape | Use it for |
|---|---|---|
/v1/models | OpenAI-compatible object + data[] | Recommended; works with most OpenAI-compatible clients |
/models | Identical to /v1/models | Clients that request the root-level /models path |
/v1beta/models | Gemini-compatible models[] | Clients that consume the Gemini ListModels shape |
This is the default discovery endpoint. It returns an OpenAI-compatible list in which each data item represents one available model.
curl -sS https://54-151-42-83.sslip.io/v1/models
{
"object": "list",
"data": [
{
"id": "gpt-5.6-sol",
"object": "model",
"created": 0,
"owned_by": "openai"
}
]
}
| Field | Meaning |
|---|---|
data[].id | The model ID to send to inference or media endpoints |
data[].owned_by | The model provider ID |
data[].object | Always model |
data[].created | A compatibility field currently fixed at 0; it is not the model release date |
This is an exact alias of /v1/models. The response body, status, model ordering, ETag, and cache behavior are identical. New integrations should prefer /v1/models; use this path only when a client is fixed to /models.
This endpoint returns a Gemini-compatible model resource list. The name value carries a models/ prefix, while baseModelId contains the raw model ID.
curl -sS https://54-151-42-83.sslip.io/v1beta/models
{
"models": [
{
"name": "models/gpt-5.6-sol",
"baseModelId": "gpt-5.6-sol",
"version": "001",
"displayName": "gpt-5.6-sol",
"description": "..."
}
]
}
# OpenAI-compatible shape
curl -sS https://54-151-42-83.sslip.io/v1/models | jq -r '.data[].id'
# Gemini shape; print raw IDs without the models/ prefix
curl -sS https://54-151-42-83.sslip.io/v1beta/models | jq -r '.models[].baseModelId'
The public list represents the models ArgoLink currently displays and sells. Inference, image, and video requests still require Authorization: Bearer YOUR_API_KEY, and the key's group must be allowed to use the selected model. You can also browse the same catalog on the Models & Pricing page.
Request bodies match each official protocol; complete runnable examples for the media APIs live in the chapters on the left.
Choose a protocol for the client first, then select a model from the live catalog. ArgoLink exposes three text protocols, one image surface, and asynchronous video jobs; model pages document only model-specific differences.
The public model catalog is the source of truth for availability, providers, and recommended endpoints. This command prints every current text model in provider order, without limiting discovery to any region.
curl -sS 'https://54-151-42-83.sslip.io/api/catalog/v1/models?category=chat&sort=provider&page_size=100' \
| jq -r '.items[] | [.provider_id, .id, .endpoint] | @tsv'
GET /v1/models, GET /models, and GET /v1beta/models only list the public catalog in different compatibility shapes. Call one of the authenticated HTTP inference endpoints below to generate a response.
| Client protocol | Endpoint | Gateway behavior |
|---|---|---|
| OpenAI Responses | POST /v1/responses | Responses request format; each model page marks whether this is the recommended entry point, and it may be converted to Chat Completions upstream |
| OpenAI Chat Completions | POST /v1/chat/completions | Accepted directly and forwarded through the selected provider account |
| Anthropic Messages | POST /v1/messages | Anthropic request and response shapes are bridged by ArgoLink |
ArgoLink accepts all three downstream HTTP shapes above and converts requests according to the selected account. Vision, reasoning effort, tool use, and other optional fields remain model-specific; use the current model page and live catalog as the contract.
Provider parameters are not interchangeable. For exact control, prefer /v1/chat/completions and send the top-level reasoning_effort or thinking field shown below. “Effective behavior” includes the provider contract, ArgoLink's current gateway translation, and live request results.
| Model | Send | Current effective behavior |
|---|---|---|
deepseek-v4-pro-0813deepseek-v4-flash-vision-exp | thinking.type: enabled / disabledreasoning_effort: low / medium / high / xhigh / max | low→low, medium/high/xhigh→high, and max→max. Thinking defaults to enabled at high. The experimental Vision model's toggle and low/max values have also been verified against the current upstream. |
glm-5.1 | thinking.type: enabled / disabled | Use only the thinking toggle; the provider contract does not support reasoning_effort for this model. |
glm-5.2 | Enable: thinking.type=enabledDisable: send both thinking.type=disabled and reasoning_effort=noneWhen enabled: low / medium / high / xhigh / max | low/medium/high→high and xhigh/max→max. With the current upstream, sending none alone can still produce reasoning, so send both fields when disabling it. |
glm-5.3glm-5.3-flash | reasoning_effort: low / high / max | Thinking cannot be disabled. The current gateway maps both low and high to upstream high, while max stays max; the two effective levels are currently high and max. |
kimi-k2.6 | thinking.type: enabled / disabled | reasoning_effort is not supported. When thinking is disabled, the current upstream reports the response model as auto; keep thinking enabled if strict response-model identity matters. |
kimi-k2.7-code | Omit thinking; if explicit, the only valid shape is {"type":"enabled","keep":"all"} | Thinking is always enabled and reasoning_effort is unsupported. Do not send thinking.type=disabled: the current upstream compatibility layer may return 200 but changes the response model to auto, which no longer satisfies a fixed-model contract. |
kimi-k3 | reasoning_effort: low / high / max | The default is max, and all three values are preserved upstream. K3 always reasons; omit thinking, because live tests show thinking.type=disabled is ignored. |
Latency-sensitive calls should set reasoning_effort: "low" from the first turn and use stream: true. Do not switch effort in the middle of a conversation: Kimi documents that doing so invalidates prefix-cache hits. An upstream may return HTTP 200 while ignoring an unknown field, so request success alone does not prove a control took effect.
curl -N https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k3",
"messages": [{"role": "user", "content": "Explain what an idempotent API operation is in two sentences"}],
"reasoning_effort": "low",
"stream": true
}'
For models with native effort control, a Responses request uses reasoning.effort; the gateway converts it to Chat Completions reasoning_effort. DeepSeek accepts none/low/high/max in Responses, where none disables thinking. Kimi K2.6 and K2.7 use model-specific thinking controls rather than effort, so use the Chat Completions shapes above.
curl -sS https://54-151-42-83.sslip.io/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro-0813",
"input": "Explain what an idempotent API operation is in two sentences"
}'
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3",
"messages": [
{"role": "user", "content": "Explain what an idempotent API operation is in two sentences"}
]
}'
curl -sS https://54-151-42-83.sslip.io/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k2.7-code",
"max_tokens": 256,
"messages": [
{"role": "user", "content": "Explain what an idempotent API operation is in two sentences"}
]
}'
Use deepseek-v4-flash-vision-exp for image understanding. Replace the example URL with a publicly reachable image URL.
curl -sS https://54-151-42-83.sslip.io/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-flash-vision-exp",
"input": [{
"role": "user",
"content": [
{"type": "input_text", "text": "Describe this image briefly"},
{"type": "input_image", "image_url": "https://your-public-image.example/image.jpg"}
]
}]
}'
Use the live Models & Pricing page for per-model input, output, cached-input, and cache-write prices. It also carries time-sensitive notes such as DeepSeek weekday peak pricing and the GLM Flash promotional period; do not treat request examples as a price quote.
ArgoLink's OpenAI Responses request format and the protocol used by a manual Codex CLI / Desktop setup. It accepts string or structured input, streaming, tools, and model-specific reasoning controls; each model page marks whether this is the recommended entry point.
Authorization: Bearer YOUR_API_KEY| Field | Required | Description |
|---|---|---|
model | Yes | A text model ID from the live catalog. |
input | Yes | A string or an array of role-based messages, text, image, and file content parts. |
instructions | No | System-level instructions for this request. |
stream | No | Set to true for an SSE event stream. |
max_output_tokens | No | Caps generated tokens, subject to the model's own limit. |
tools / tool_choice | No | Tool declarations and selection policy; actual support remains model-specific. |
reasoning | No | For example {"effort":"low"}; use the model page for accepted levels. |
curl -sS https://54-151-42-83.sslip.io/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"input": "Confirm this connection in one sentence"
}'The main non-streaming result is in output[]; text blocks use type=output_text, and token accounting is in usage. Do not hard-code one array index because tool calls and reasoning items can also appear in output[].
Codex requires wire_api = "responses" and a Base URL ending in /v1. See Codex CLI / Desktop for the complete configuration.
The message-array endpoint for OpenAI-compatible clients. Use it with traditional SDKs, Cherry Studio, and direct DeepSeek, GLM, or Kimi thinking controls.
Authorization: Bearer YOUR_API_KEY| Field | Required | Description |
|---|---|---|
model | Yes | A text model ID from the live catalog. |
messages | Yes | Ordered system, user, assistant, or tool messages. |
stream | No | Set to true for SSE delta chunks. |
max_completion_tokens | No | Preferred output cap; legacy max_tokens is also accepted. |
tools / tool_choice | No | Function tools and their selection policy. |
reasoning_effort / thinking | No | Not universal; use the exact shape documented for the selected model. |
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro-0813",
"messages": [{"role":"user","content":"Confirm this connection in one sentence"}],
"stream": false
}'Non-streaming text is normally in choices[0].message.content, the termination reason in choices[0].finish_reason, and accounting in usage. With stream: true, accumulate text and tool calls from each SSE chunk's choices[].delta.
Kimi K2.7 Code, Kimi K3, and DeepSeek use different thinking controls. HTTP 200 does not prove that an unknown field took effect; check the matching model page first.
The native Anthropic Messages-compatible endpoint for Claude Code and Anthropic SDKs. ArgoLink preserves the Messages request and response shapes while bridging to the selected model's actual upstream.
x-api-key: YOUR_API_KEY; Bearer is also accepted. Compatibility header: anthropic-version: 2023-06-01| Field | Required | Description |
|---|---|---|
model | Yes | A text model ID from the live catalog; the ID does not need to start with Claude. |
messages | Yes | user / assistant messages with string or content-block values. |
max_tokens | Yes | The maximum number of tokens generated for this response. |
system | No | A top-level system prompt; do not put a system role inside messages. |
stream | No | Set to true for Anthropic SSE events. |
tools / tool_choice | No | Anthropic-format tool definitions and selection. |
thinking / output_config | No | Model-specific thinking toggles or effort; check the model page first. |
curl -sS https://54-151-42-83.sslip.io/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k2.7-code",
"max_tokens": 256,
"messages": [{"role":"user","content":"Confirm this connection in one sentence"}]
}'Non-streaming content is in content[]; text blocks use type=text and tool calls use type=tool_use. The stop reason is in stop_reason and accounting is in usage. A stream emits message_start, content-block events, message_delta, and message_stop.
Claude Code only needs the root origin and auth token; the client appends /v1/messages. See Claude Code for the full configuration.
One OpenAI Images-compatible surface. Text-to-image uses JSON, and reference edits accept either JSON image references or multipart file uploads; dimensions, aspect ratios, quality, and reference counts remain model-specific.
Authorization: Bearer YOUR_API_KEY; set a client timeout of at least 600 seconds.| Field | Description |
|---|---|
model | Required; use a live model whose catalog category is image. |
prompt | Required; describe the generated result or requested edit. |
n | Optional requested result count. Accepted ranges and actual result counts depend on the model. |
response_format | Optional b64_json or url, as documented by the model guide. |
| Reference edits | Use JSON images[].image_url values for public HTTPS URLs or data URLs, or use multipart with one repeated file field per reference. Use the model guide for the limit. |
| Model-specific fields | size, quality, aspect_ratio, resolution, and output_format must not be copied blindly between models. |
Some platforms split image models into many model-specific subpaths. ArgoLink instead keeps one public path and puts differences in model parameters. Select a model first, then use its runnable guide.
An asynchronous video-job API. Submit a generation, save its request_id, then use the same key to inspect status or download from the protected content endpoint.
model, prompt, and supported duration, aspect-ratio, resolution, or reference-image fields to POST /v1/videos/generations.request_id from the response. It is the only identifier for subsequent status and content calls.pending, download after done, and inspect the full error after failed or expired.Status and content lookups enforce job ownership. Use a key belonging to the same user who created the job; changing users or guessing an ID returns not found.
Exact model ID: deepseek-v4-pro-0813. General text, coding, and controllable reasoning.
Top-level thinking.type accepts enabled or disabled. reasoning_effort accepts low, medium, high, xhigh, or max. Effective mapping is low→low, medium/high/xhigh→high, and max→max; omitted controls default to thinking enabled at high.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro-0813",
"messages": [{"role": "user", "content": "Explain an idempotent API in two sentences"}],
"reasoning_effort": "low"
}'See live input, output, cache, and weekday peak prices on Models & Pricing.
Exact model ID: deepseek-v4-flash-vision-exp. Image understanding and multimodal questions.
The thinking toggle and effort mapping match V4 Pro. Live upstream tests verified the toggle and both low and max effort. This is an experimental model, so callers should tolerate version and latency changes.
curl -sS https://54-151-42-83.sslip.io/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-flash-vision-exp",
"input": [{"role": "user", "content": [
{"type": "input_text", "text": "Describe this image briefly"},
{"type": "input_image", "image_url": "https://example.com/image.jpg"}
]}],
"reasoning": {"effort": "low"}
}'This model also uses weekday peak pricing. See Models & Pricing.
Exact model ID: glm-5.1. This model has a thinking toggle but no effort levels.
Send top-level thinking: {"type":"enabled"} or thinking: {"type":"disabled"}. Do not send reasoning_effort.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"glm-5.1","messages":[{"role":"user","content":"Explain one database transaction"}],"thinking":{"type":"enabled"}}'See the live price on Models & Pricing.
Exact model ID: glm-5.2. Supports a thinking toggle and limited effort mapping.
When enabled, effort accepts low, medium, high, xhigh, and max. Effective mapping is low/medium/high→high and xhigh/max→max. To disable reasoning, send both thinking.type=disabled and reasoning_effort=none; none alone may still reason.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"glm-5.2","messages":[{"role":"user","content":"Reply only with OK"}],"thinking":{"type":"disabled"},"reasoning_effort":"none"}'See the live price on Models & Pricing.
Exact model ID: glm-5.3. Thinking is always enabled.
Accepts low, high, and max. The current gateway maps both low and high to upstream high, while max stays max. The only effective levels today are high and max; thinking cannot be disabled.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"glm-5.3","messages":[{"role":"user","content":"Compare optimistic and pessimistic locking"}],"reasoning_effort":"max"}'See the live price on Models & Pricing.
Exact model ID: glm-5.3-flash. A lower-cost fast model with always-on thinking.
Accepts low, high, and max; the effective levels today are high and max. Thinking cannot be disabled. Pricing may be promotional, so never infer a quote from this request example.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"glm-5.3-flash","messages":[{"role":"user","content":"Write a paginated SQL query"}],"reasoning_effort":"high"}'See promotion status and live price on Models & Pricing.
Exact model ID: kimi-k2.6. Supports a thinking toggle but no effort levels.
Send thinking.type as enabled or disabled; do not send reasoning_effort. The current upstream reports the response model as auto when thinking is disabled, so keep it enabled if exact response-model identity matters.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"kimi-k2.6","messages":[{"role":"user","content":"Explain event sourcing"}],"thinking":{"type":"enabled"}}'See the live price on Models & Pricing.
Exact model ID: kimi-k2.7-code. A coding model with always-on thinking.
reasoning_effort is unsupported and thinking cannot be disabled. Do not send thinking.type=disabled: the compatibility layer may still return HTTP 200 but report model auto, violating a fixed-model contract.
curl -sS https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"kimi-k2.7-code","messages":[{"role":"user","content":"Refactor this Go function and explain edge cases"}],"thinking":{"type":"enabled","keep":"all"}}'See the live price on Models & Pricing.
Exact model ID: kimi-k3. Always reasons and defaults to the heaviest max effort.
Accepts low, high, and max, preserved upstream. Do not send thinking; live tests show disabled is ignored. Changing effort mid-conversation invalidates Kimi prefix-cache hits, so choose one level on the first turn. K3 at max is inherently slow; low plus streaming reduces time to first token, while total latency still depends on upstream queueing and output length.
curl -N https://54-151-42-83.sslip.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"kimi-k3","messages":[{"role":"user","content":"Explain an idempotent API in two sentences"}],"reasoning_effort":"low","stream":true}'See the live price on Models & Pricing.
Manage providers through a GUI — the simplest way to connect Codex and Claude Code.
Use the catalog's exact model ID in the mapping. The /v1/models list contains public model IDs; it does not add a [1m] suffix. In Claude Code, [1m] is a client-side capability declaration, not part of the upstream model name, and Claude Code strips it before sending the request. Enable it only when the model page/catalog records an extended context window. Automatic compaction still happens before the effective limit; other clients may use a different context or compaction policy. CC Switch must use the root origin for Claude Code and the /v1 base for Codex.
Connect without CC Switch by writing the ArgoLink origin, key, and protocol into the client configuration. Codex uses Responses; Claude Code uses native Messages.
~/.codex/config.toml/v1 and the wire protocol is responses.~/.claude/settings.jsonANTHROPIC_BASE_URL uses the root origin without /v1.| Client | Base URL | Protocol / endpoint | Full setup |
|---|---|---|---|
| Codex CLI / Desktop | https://54-151-42-83.sslip.io/v1 | Responses · POST /v1/responses | Open Codex setup |
| Claude Code | https://54-151-42-83.sslip.io | Anthropic Messages · POST /v1/messages | Open Claude Code setup |
Codex includes /v1; Claude Code uses only the root origin. Do not swap these values. Restart the desktop client or open a new terminal session after saving.
Codex CLI and Codex Desktop share the same user-level config when they run under the same system user and CODEX_HOME. After saving, restart Codex Desktop or open a new Codex CLI session.
model = "gpt-5.6-sol"
model_provider = "luckyapi"
[model_providers.luckyapi]
name = "ArgoLink"
base_url = "https://54-151-42-83.sslip.io/v1"
wire_api = "responses"
requires_openai_auth = false
experimental_bearer_token = "YOUR_API_KEY"
Set the native endpoint and auth token in the Claude Code user settings — configure once, use continuously.
{
"env": {
"ANTHROPIC_BASE_URL": "https://54-151-42-83.sslip.io",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY"
}
}
Restart the client after saving the config.
Add ArgoLink as a custom provider to use chat and image models from the live catalog in Cherry Studio. Use Infinite Canvas for video models.
arm64.dmg on Apple Silicon Macs or setup.exe on Windows. Do not install a nightly build or run from source.GitHub authorization is only for Copilot. On the first-run screen, choose the white “Configure other providers” button, not the black “Connect CherryIN” button. ArgoLink only needs your own API key.
| Field | Value |
|---|---|
| Provider name | ArgoLink |
| API key | YOUR_API_KEY |
| Endpoint settings → OpenAI | https://54-151-42-83.sslip.io/v1 |
After saving, the displayed request path should be https://54-151-42-83.sslip.io/v1/chat/completions. This differs from Infinite Canvas, where you enter only the root origin.
Open “More settings / Add endpoint” and use the values below. All four OpenAI-compatible fields share the same Base URL; leave Gemini blank.
| Field | Value |
|---|---|
| OpenAI (default) | https://54-151-42-83.sslip.io/v1 |
| OpenAI Responses | https://54-151-42-83.sslip.io/v1 |
| Image Generation Base URL | https://54-151-42-83.sslip.io/v1 |
| Image Editing Base URL | https://54-151-42-83.sslip.io/v1 |
| Gemini | Leave blank |
Click “Fetch model list.” Cherry Studio reads the public GET https://54-151-42-83.sslip.io/v1/models endpoint without an API key. In the returned list, click the “+” beside each model you want to add to this provider.
| Catalog category | How to identify it | Cherry endpoint type |
|---|---|---|
| Chat | category=chat, or another default text model | OpenAI |
| Image | category=image, or an ID containing image, imagine-image, or banana | Image Generation (OpenAI) |
| Video | category=video, or an ID containing video or omni | No matching Cherry workflow; do not test it as chat |
Models can be added, removed, or renamed, so do not save a fixed list. The human-readable catalog is on Models & Pricing; machine-readable categories are available at GET /api/catalog/v1/models?page_size=100. If an image model is not set to “Image Generation (OpenAI),” the drawing page will report no available models.
1:1, 16:9, or 9:16.A sliced red apple on a dark wooden table, soft morning side light, shallow depth of field, 1:1 composition, no text, no watermark
Cherry Studio custom providers currently focus on chat and OpenAI image generation and do not expose a matching ArgoLink video-job workflow. Do not test video models as image or chat models. Use Infinite Canvas instead; both clients can share the same key.
The authorization header is Authorization: Bearer <API Key>. Video submissions use POST /v1/videos/generations, but require a client with a video-job workflow.
For assisted setup, give this page to a local Codex task and explicitly ask it to install the latest stable GitHub release, add the ArgoLink custom provider, fetch the live catalog, and test only one chat model. Provide your API key only inside a trusted local task that you control; never place the full key in public tasks, group chats, or screenshots.
Add ArgoLink as an OpenAI provider in Infinite Canvas to use text, image, and video models from the canvas.
| Field | Value |
|---|---|
| Name | ArgoLink |
| Protocol | OpenAI |
| Base URL | https://54-151-42-83.sslip.io |
| API key | YOUR_API_KEY |
Infinite Canvas appends /v1 itself. Adding it manually duplicates the path and makes the connection fail.
Save the provider, then refresh its model list. ArgoLink's public model discovery endpoint does not require an API key. If the client still shows a stale list, reload the provider first; manually entering a model ID is only a fallback for a stale client cache.
| Use case | Recommended model ID |
|---|---|
| Text | gpt-5.6-sol |
| Image generation / editing | gpt-image-2 |
| Fast GPT Image 2.5 generation / editing | gpt-image-2.5-flare |
| Precision GPT Image 2.5 generation / editing | gpt-image-2.5-sunburst |
| Fast image generation / editing | nano-banana-2-lite |
| High-quality image generation / editing | nano-banana-2 |
| Professional image generation / editing | nano-banana-pro |
| Fast Grok image generation | grok-imagine-image |
| Current Grok image generation / editing | grok-imagine-image-2.0 |
| Quality Grok image generation / editing | grok-imagine-image-quality |
| Video | gemini-omni-1.1 |
| Video | grok-imagine-video-1.5 |
Supports GPT Image 2, GPT Image 2.5 Flare and GPT Image 2.5 Sunburst for text-to-image, image-to-image and reference-image edits. Image requests are usually slower than text — give your client a longer timeout.
curl -sS --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"prompt": "A red apple on a wooden table, square 1:1 composition",
"quality": "auto",
"n": 1,
"response_format": "b64_json"
}' \
-o image-response.json
Put the actual pixel dimensions in size and spell out the desired aspect ratio in the prompt. Billing uses the returned image's longest edge: up to 1024 is 1K, 1025–2048 is 2K, and above 2048 is 4K. 2K and 4K image generation may take longer; wait for the request to complete. Use these billing-conformant examples:
| Tier | size example | Aspect ratio |
|---|---|---|
| 1K | 1024x1024 | 1:1 |
| 2K | 2048x1152 | 16:9 |
| 4K | 3840x2160 | 16:9 |
{
"model": "gpt-image-2",
"prompt": "A cinematic landscape, 16:9 composition",
"size": "3840x2160",
"quality": "auto",
"n": 1,
"response_format": "url"
}Use JSON when your references are public HTTPS URLs or data URLs. Use multipart when the files are local. Choose one request-body format per request.
curl -sS --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/edits \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "model=gpt-image-2" \
-F "prompt=Combine the references into one cyberpunk scene, keep the subjects and use a square 1:1 composition" \
-F "image[]=@./reference-1.png" \
-F "image[]=@./reference-2.png" \
-F "image[]=@./reference-3.png" \
-F "quality=auto" \
-F "n=1" \
-F "response_format=b64_json" \
-o image-edit-response.json
curl -sS --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/edits \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"images": [
{"image_url": "https://example.com/reference-1.png"},
{"image_url": "https://example.com/reference-2.png"}
],
"prompt": "Keep the subjects and change the background",
"size": "1024x1024",
"quality": "auto",
"n": 1,
"response_format": "b64_json"
}' \
-o image-edit-json-response.json
images array with one image_url object per reference. Use a public HTTPS URL or a data URL. Multipart edits repeat one image[] field per local file; do not join multiple paths into one field.size; do not make 1K, 2K, 4K or ratio the value. 1024x1024, 2560x1440 and 3840x2160 are verified request examples, but 2560x1440 is billed as 4K because its longest edge is above 2048. Check the returned pixels when an exact size matters.mask.image_url in JSON or a mask file in multipart.n accepts 1–7 and requests multiple results; use the response as the final result count. Every returned image appears in data[].b64_json or data[].url and is billed individually, so a larger n also increases time, response size and cost.quality, use the documented values auto, low, medium or high.All three models use the same OpenAI Images-compatible endpoints for text-to-image and single-reference edits. Treat the live Models & Pricing catalog as the source of truth for availability and price.
| Model ID | Positioning | Recommended use |
|---|---|---|
nano-banana-2-lite | Fast and cost-efficient | Previews, batch drafts, and everyday edits |
nano-banana-2 | High quality | Production image generation and reference edits |
nano-banana-pro | Professional | Final assets with higher quality requirements |
curl -sS --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-2",
"prompt": "A cinematic product photo of a green glass bottle on stone",
"aspect_ratio": "4:3",
"n": 1,
"output_format": "jpeg"
}' \
-o nano-banana-response.json
curl -sS --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/edits \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "model=nano-banana-2" \
-F "prompt=Keep the subject and replace the background with a quiet Japanese garden" \
-F "image[]=@./reference.png" \
-F "aspect_ratio=4:3" \
-F "n=1" \
-F "output_format=jpeg" \
-o nano-banana-edit-response.json
jq -r '.data[0].b64_json' nano-banana-response.json \
| base64 --decode > nano-banana.jpg
Use the same ArgoLink key for Grok image generation and reference editing. JSON edits accept up to 3 image references; the current multipart edit surface accepts one local file per request.
curl -sS --fail-with-body --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-image-2.0",
"prompt": "A cinematic spacecraft leaving a Martian canyon",
"aspect_ratio": "16:9",
"resolution": "2k",
"n": 1,
"response_format": "url"
}' \
-o grok-image-response.json
RESPONSE=grok-image-response.json
jq . "$RESPONSE"
URL=$(jq -er '.data[0].url' "$RESPONSE") || exit 1
curl -fL "$URL" -o grok-image.png
curl -sS --fail-with-body --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/edits \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-image-2.0",
"prompt": "Combine the subjects into one cinematic cyberpunk scene",
"images": [
{"type": "image_url", "image_url": {"url": "https://example.com/reference-1.png"}},
{"type": "image_url", "image_url": {"url": "https://example.com/reference-2.png"}},
{"type": "image_url", "image_url": {"url": "https://example.com/reference-3.png"}}
],
"aspect_ratio": "4:3",
"resolution": "2k",
"n": 1,
"response_format": "b64_json"
}' \
-o grok-image-edit-response.json
curl -sS --fail-with-body --max-time 600 \
https://54-151-42-83.sslip.io/v1/images/edits \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "model=grok-imagine-image-2.0" \
-F "prompt=Combine the subject into one cinematic cyberpunk scene" \
-F "image=@./reference-1.png" \
-o grok-image-edit-response.json
grok-imagine-image, grok-imagine-image-2.0, and grok-imagine-image-quality expose both /v1/images/generations and /v1/images/edits.images[].image_url object per reference and currently accept up to 3 references. Multipart edits currently accept one local image file per request.aspect_ratio for the 15 supported ratios plus auto; resolution accepts 1k or 2k. n accepts 1–10, and every returned image is billed individually.quality is documented on grok-imagine-image-2.0 with low, medium, and auto. The grok-imagine-image-quality route selects quality through the model ID.data[].url links — download them promptly. Use JSON with response_format set to b64_json when you need inline image data.Video generation is asynchronous: submit a job, poll its status when needed, then let the protected content endpoint wait and download the MP4 for you.
| Resolution | ArgoLink price | Versus official |
|---|---|---|
| 480p | $0.064 / second | Save 20% |
| 720p | $0.112 / second | Save 20% |
| 1080p | $0.20 / second | Save 20% |
Charges use the resolution and output seconds of a successfully generated video. First-frame and reference images currently have no separate image surcharge; failed or expired jobs incur no video charge. The live catalog remains the final price source.
API_KEY="YOUR_API_KEY"
BASE="https://54-151-42-83.sslip.io"
ID=$(curl -fsS "$BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-video-1.5",
"prompt": "A cinematic spacecraft leaving a Martian canyon",
"duration": 10,
"aspect_ratio": "16:9",
"resolution": "720p"
}' \
| jq -er '.request_id') || exit 1
printf 'Request ID: %s\n' "$ID"
curl -fsS "$BASE/v1/videos/$ID" \
-H "Authorization: Bearer $API_KEY" | jq .
curl -fSL --retry 120 --retry-delay 5 --retry-all-errors \
"$BASE/v1/videos/$ID/content" \
-H "Authorization: Bearer $API_KEY" \
-o grok-video.mp4
pending means still generating; done means the video is ready; failed or expired means the job did not finish — check the upstream error in the full status response. The download command retries every 5 seconds for up to about 10 minutes and never saves an HTTP error body as an MP4.
base64 < ./reference.png | tr -d '\n' | \
jq -Rs '{
model: "grok-imagine-video-1.5",
prompt: "Animate this still image with a slow cinematic camera move",
image: {url: ("data:image/png;base64," + .)},
duration: 10,
resolution: "720p"
}' > grok-video-request.json
curl -sS --fail-with-body \
https://54-151-42-83.sslip.io/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @grok-video-request.json | jq .
image accepts one public HTTPS URL, base64 data URI or file_id, and uses it as the first frame. Once you have the request_id, reuse the status and content endpoints above.
curl -sS --fail-with-body \
https://54-151-42-83.sslip.io/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-video-1.5",
"prompt": "Use the person from <IMAGE_0> and the clothing from <IMAGE_1>",
"reference_images": [
{"url": "https://example.com/person.png"},
{"url": "https://example.com/clothing.png"}
],
"duration": 10,
"aspect_ratio": "16:9",
"resolution": "720p"
}' | jq .
Text-to-video, first frame, first + last frame and multimodal reference (any mix of images, videos and audio as references) on one asynchronous endpoint. Local files are uploaded straight to object storage first; the generation request itself only carries HTTPS URLs, and the prompt names assets as image 1, video 1 and audio 1 (or @Image 1).
| Model | Duration | Resolution | Reference limits | Use it for |
|---|---|---|---|---|
seedance-2.5 | 4–30 s | 480p · 720p · 1080p | ≤30 images, ≤10 videos, ≤10 audios, ≤50 assets in total; audio-only references accepted | Longest clips, largest reference sets, best consistency |
seedance-2.0 | 4–15 s | 720p · 1080p · 4K | ≤9 images, ≤3 videos, ≤3 audios, ≤12 assets in total; at least one image or video | Highest quality in the 2.0 family, the only 4K route |
seedance-2.0-mini | 4–15 s | 720p | Same as seedance-2.0 | Lowest rate, batches and drafts |
seedance-2.0-fast | 4–15 s | 720p | Same as seedance-2.0 | Fastest turnaround, previews |
Output is a 24 fps H.264 MP4 with a model-generated AAC stereo audio track (44.1 kHz) that cannot currently be turned off. Every request produces exactly one video (n must be 1 or omitted). At 720p, 16:9 renders 1280×720 and 1:1 renders 960×960. Generation usually takes a few minutes and longer when the queue is busy, so always poll instead of assuming a deadline. Seedance 2.0, 2.0 Mini and 2.0 Fast do not support real human faces: a first frame or reference image showing a real person's face may fail to generate.
| Model | 480p | 720p | 1080p | 4K | Versus official |
|---|---|---|---|---|---|
seedance-2.5 | $0.078 / second | $0.17 / second | $0.43 / second | — | 25% off |
seedance-2.0 | — | $0.11 / second | $0.28 / second | $0.58 / second | 25% off |
seedance-2.0-mini | — | $0.057 / second | — | — | 25% off |
seedance-2.0-fast | — | $0.091 / second | — | — | 25% off |
Price = per-second rate for the model and resolution × billed seconds: the seconds of the delivered video (its real length rounded to whole seconds) plus the seconds of any reference videos (their lengths added up, with any part of a second left off). "Official" is the BytePlus ModelArk list price for a 16:9 clip without video input, converted to a per-second amount; ArgoLink charges 75% of it, rounded to two significant figures. The input mode (text, first frame, first + last frame, reference images or audio) does not change the rate, and uploads are free. Reference videos are billed at the same per-second rate as the output; reference images and audio are free. Failed or expired jobs are not charged. If duration is omitted the job runs and bills as 5 seconds. Examples: a 10-second 720p seedance-2.0 clip costs $1.10; a 4-second 720p seedance-2.0-mini clip costs $0.228; a 5-second 720p seedance-2.0 clip with a 3-second reference video bills 8 seconds, $0.88. The live catalog on the model pages remains the final price source.
| Field | Type | Rules |
|---|---|---|
model | string, required | seedance-2.5, seedance-2.0, seedance-2.0-mini or seedance-2.0-fast |
prompt | string | UTF-8, at most 40,000 bytes. Required for text-to-video; optional when any image, video or audio is supplied. Describe camera motion, subject action and mood. In multimodal reference mode, name an asset by type and number, the same way official Seedance prompts do: image 1 is the first item in reference_images and image 2 the second; video 1 and audio 1 work the same way, counting each array from 1. image 1, @Image 1, @image1, <image1> the Chinese 图片1 and the same words in other languages (imagen 1, Bild 1, 画像1, 이미지1) are all recognized. For example, with two reference images: “the person in image 1 walks into the scene in image 2”. Naming is optional: references you do not name are still used. With @ or brackets, a number past the end of its array is rejected with 400. |
duration | integer | Whole seconds. 4–15 for the 2.0 family, 4–30 for 2.5. Default 5. |
resolution | string | 720p (default). seedance-2.0 also accepts 1080p and 4k; seedance-2.5 accepts 480p, 720p and 1080p. Other combinations are rejected. |
aspect_ratio | string | 16:9 (default), 9:16, 1:1, 4:3, 3:4 or 21:9, for text-to-video and multimodal reference, which reject adaptive. First-frame and first + last-frame videos take their ratio from the first frame: the closest of the six above, so the frame is cropped as little as possible. Leave the field out there; adaptive or any listed value is accepted and set aside. ratio is an accepted alias; do not send both. |
size | string | Pixels instead of resolution + aspect_ratio, written WIDTHxHEIGHT: the short side picks the resolution (480 → 480p, 720 → 720p, 1080 → 1080p, 2160 → 4k) and the shape picks the aspect ratio it is within 3% of. 1280x720 is 720p 16:9, 720x1280 is 720p 9:16 and 720x720 is 720p 1:1. It picks a tier and a ratio, not exact pixels: the video renders at that tier's size for the ratio (720p 1:1 renders 960×960). A resolution or aspect_ratio sent with it must match, or the request is rejected with 400. A resolution name such as 720p also works. |
start_image | object | {"url": "https://…"}. First frame of the video. Cannot be combined with any reference list. |
end_image | object | Last frame. Requires start_image and must land on the same aspect ratio as the first frame; otherwise the job fails with invalid_input and nothing is charged. |
reference_images | array of objects | [{"url": "https://…"}, …]. Subject, style or scene references (multimodal reference); the first frame is not locked. |
reference_videos | array of objects | Motion, camera or scene references: 2–15.4 s each and 15.4 s together on the 2.0 family, 1.8–30.2 s each and 30.2 s together on 2.5. Their length is added to the billed seconds. |
reference_audios | array of objects | Timing and lip-motion references. The 2.0 family needs at least one image or video alongside them; 2.5 accepts audio on its own. |
n | integer | Only 1. |
seed, watermark, generate_audio | — | Not supported: any seed, watermark: true or generate_audio: true is rejected. The output always carries an audio track; generate_audio: false does not make it silent. |
Every url must be a public https:// address. Base64 data URIs, multipart uploads and file_id values are rejected on this endpoint. For local files use POST /v1/media/uploads below and pass the returned media_url. Formats, lengths and sizes per asset are listed under Reference limits below. The whole JSON body must stay under 1 MiB.
Requests written for fal or OpenRouter can be sent as they are: every name in the right column means the field on its left. Give each input one name. Two names for the same input with different values, or frame_images / input_references together with the fields they stand for, are rejected with 400.
| Field | Also accepted |
|---|---|
start_image | image_url (a URL string), or a frame_images item with "frame_type": "first_frame" |
end_image | end_image_url, or a frame_images item with "frame_type": "last_frame" |
reference_images | image_urls (URL strings), or input_references items of type image_url |
reference_videos | video_urls, or input_references items of type video_url |
reference_audios | audio_urls, or input_references items of type audio_url |
resolution + aspect_ratio | size in pixels, such as 1280x720 |
duration · aspect_ratio | seconds · ratio |
{
"model": "seedance-2.5",
"prompt": "The person in image 1 walks into the scene in video 1",
"size": "1280x720",
"duration": 5,
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/person.png"}},
{"type": "video_url", "video_url": {"url": "https://example.com/scene.mp4"}}
]
}
Inside input_references, images, videos and audio are numbered separately in the order they appear: the first image_url item is image 1 and the first video_url item is video 1.
The mode is derived from which media fields are present — there is no mode parameter:
| Mode | Send | Notes |
|---|---|---|
| First + last frame | start_image + end_image | The first frame sets the ratio; the last frame must land on the same one |
| First frame | start_image | The first frame sets the ratio |
| Multimodal reference | any mix of reference_images, reference_videos and reference_audios | Images only, videos only and image + video + audio are all this one mode; name assets in the prompt as image N, video N and audio N (or @Image N) |
| Text to video | no media | prompt required |
start_image/end_image and the three reference lists are mutually exclusive. Asset counts above the model's limit, @ mentions past the end of an array, and resolutions or durations outside the model's range are rejected with 400 at submission, before generation starts.
The three kinds of reference combine freely within the model's per-kind and total caps.
| Model | Images | Videos | Audio | Total | Audio only |
|---|---|---|---|---|---|
seedance-2.0 · 2.0-mini · 2.0-fast | ≤9 | ≤3 | ≤3 | ≤12 | Not accepted: add at least one image or video |
seedance-2.5 | ≤30 | ≤10 | ≤10 | ≤50 | Accepted |
On the 2.0 family, 9 images + 3 videos or 9 images + 3 audio clips fit, but 9 images + 3 videos + 3 audio clips is 15 assets, over the total, and is rejected with 400.
| Each asset | 2.0 · 2.0 Mini · 2.0 Fast | 2.5 |
|---|---|---|
| Image | JPEG or PNG, ≤20 MiB | JPEG or PNG, ≤20 MiB; 300–6000 px per side; width/height 0.4–2.5 |
| Video | 2–15.4 s each, ≤15.4 s combined; 200–2160 px per side; ≤50 MB | MP4 or MOV; 1.8–30.2 s each, ≤30.2 s combined; 300–6000 px per side, 409,600–8,295,044 pixels; width/height 0.4–2.5; 24–60 fps; ≤100 MiB |
| Audio | 2–15 s each, ≤15 s combined; ≤15 MB | WAV or MP3; 1.8–30.2 s each, ≤30.2 s combined; ≤15 MB |
Asset counts and media types are checked when you submit. Reference video and audio lengths are checked after upload, before generation starts: a clip out of range fails the job with invalid_input and nothing is charged. Assets outside the size or format ranges can make the job fail.
Ask for an upload ticket, PUT the bytes directly to the returned storage URL, then use media_url in the generation request. Sub2API never proxies file bytes, so large videos do not hit the 1 MiB JSON limit.
type | content_type | Max size |
|---|---|---|
image | image/jpeg, image/png (tickets also accept image/webp, but Seedance generation takes JPEG and PNG only) | 20 MiB |
video | video/mp4, video/quicktime, video/webm | 500 MiB per ticket; see Reference limits for Seedance |
audio | audio/mpeg, audio/wav, audio/mp4 (m4a), audio/aac | 20 MiB |
API_KEY="YOUR_API_KEY"
BASE="https://54-151-42-83.sslip.io"
FILE=./first-frame.jpg
TICKET=$(curl -fsS "$BASE/v1/media/uploads" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "{\"model\":\"seedance-2.5\",\"type\":\"image\",\"content_type\":\"image/jpeg\",\"size_bytes\":$(stat -f%z "$FILE")}")
curl -fsS -X PUT "$(jq -r .upload_url <<<"$TICKET")" \
-H "Content-Type: image/jpeg" --data-binary @"$FILE"
MEDIA_URL=$(jq -r .media_url <<<"$TICKET")
The ticket returns upload_url (valid 15 minutes, PUT with exactly the declared Content-Type), media_url (readable for 7 days) and the matching upload_expires_at / expires_at timestamps. size_bytes must equal the real file size. Tickets are free and do not create a job. On Linux use stat -c%s.
ID=$(curl -fsS "$BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "A golden retriever runs along a sunlit beach, slow-motion, camera tracking sideways, cinematic",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p"
}' \
| jq -er '.request_id') || exit 1
printf 'Request ID: %s\n' "$ID"
A successful submission returns HTTP 202 with {"request_id": "…"}. Keep it — it is the only handle for status, download and billing records.
curl -fsS "$BASE/v1/videos/$ID" \
-H "Authorization: Bearer $API_KEY" | jq .
{
"request_id": "e9a36267-5a81-46ee-87a1-baf62bec7e9a",
"status": "pending",
"model": "seedance-2.5",
"created_at": 1789379975,
"progress": 37,
"estimated_seconds_remaining": 128
}
{
"created_at": 1789379975,
"model": "seedance-2.5",
"progress": 100,
"request_id": "e9a36267-5a81-46ee-87a1-baf62bec7e9a",
"status": "done",
"usage": { "billed_seconds": 8, "output_seconds": 8, "reference_video_seconds": 0 },
"video": { "duration": 8, "url": "https://54-151-42-83.sslip.io/v1/videos/e9a36267-5a81-46ee-87a1-baf62bec7e9a/content" }
}
Poll every 10–15 seconds. pending means still generating: progress (0–99) estimates how far the job has come and estimated_seconds_remaining how many seconds are left, both worked out from the forecast of the job's queue and generation time. Until that forecast exists progress is 0 and there is no estimated_seconds_remaining; a job that runs past its forecast stays at 99 until it finishes. created_at is the submission time in Unix seconds. done means the MP4 is ready: progress is 100 and video.url is the full download address, the content endpoint from Step 3, requested with the same key; usage gives the output seconds, the reference video seconds and their sum, billed_seconds; failed or expired means nothing was produced and nothing is charged. On failed the error object gives the reason and whether a plain retry can succeed; see Job failures below. A job that finds no capacity within 10 minutes ends with capacity_unavailable; once generation has started the job waits for its result, and ends with generation_timeout only if it is still unfinished after 24 hours. Billing happens once, when done is first observed, using usage.billed_seconds.
curl -fSL --retry 120 --retry-delay 5 --retry-all-errors \
"$BASE/v1/videos/$ID/content" \
-H "Authorization: Bearer $API_KEY" \
-o seedance.mp4
The content endpoint streams the finished MP4 (video/mp4, Range supported) and returns an error status while the job is still pending, so the retry loop above waits up to about 10 minutes without saving an error body as a video.
curl -fsS "$BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0-mini",
"prompt": "The logo floats in space; a green lightning bolt strikes it, sparks burst, camera pushes in slowly",
"start_image": {"url": "'"$MEDIA_URL"'"},
"duration": 5,
"resolution": "720p"
}' | jq .
The video takes its ratio from the first frame, so no aspect_ratio is needed: a square frame renders at 960×960. This exact request bills 5 × $0.057 = $0.285.
curl -fsS "$BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"prompt": "Day turns into night over the same skyline, clouds roll by, lights come on",
"start_image": {"url": "https://example.com/day.jpg"},
"end_image": {"url": "https://example.com/night.jpg"},
"duration": 6,
"resolution": "4k"
}' | jq .
Both frames must land on one aspect ratio, which the video uses too; a mismatched pair fails with invalid_input on end_image and nothing is charged. This 6-second 4K request bills 6 × $0.58 = $3.48.
curl -fsS "$BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "The woman in @Image 1 speaks warmly to the camera in time with @Audio 1, moving the way @Video 1 does, natural lip movement, soft studio light",
"reference_images": [{"url": "https://example.com/portrait.jpg"}],
"reference_videos": [{"url": "https://example.com/motion.mp4"}],
"reference_audios": [{"url": "https://example.com/voice.mp3"}],
"duration": 4,
"aspect_ratio": "9:16",
"resolution": "720p"
}' | jq .
reference_images or only reference_videos is also a multimodal reference, under the same rules.Errors on submit, status and download come back as an HTTP status with the body {"error": {"type": "…", "code": "…", "param": "…", "message": "…"}}: message is a reason you can show, param names the request field at fault, and code is stable.
| HTTP | error.type | error.code | Cause |
|---|---|---|---|
| 400 | invalid_request_error | field_invalid, json_invalid, … | The request itself is malformed: a field of the wrong type, neither prompt nor media, end_image alone, first-frame fields mixed with reference lists, a non-HTTPS media URL and so on. Nothing is charged. |
| 400 | invalid_request_error | request_unsupported | The model does not accept this combination: resolution, duration, aspect ratio, seed, generate_audio: true, asset counts, audio-only references on the 2.0 family, or an @ mention past the end of an array. message names which, for example seedance-2.0-mini accepts resolution 720p. Nothing is charged. |
| 401 | authentication_error | — | Missing or invalid API key. |
| 402 / 403 | — | — | Insufficient balance, or the key's group has no video permission. |
| 404 | not_found_error | video_request_not_found | Status or content requested for an unknown request_id, or with a key that belongs to a different user. |
| 409 | invalid_request_error | job_video_not_ready | The video is not finished yet; request the same URL again shortly. |
| 424 | invalid_request_error | job_failed | The job being downloaded failed; its status carries the reason in error. |
| 429 | rate_limit_error | — | Concurrency or rate limit reached; retry after the running jobs finish. |
| 503 | overloaded_error | no_capacity | No capacity right now; retry after Retry-After. Nothing is charged. |
| 503 | api_error | — | The service is temporarily unavailable; retry later. Nothing is charged. |
A submitted job can still fail while it generates. Its status then reads "status": "failed" with an error object: code is a stable failure code, message gives the exact reason, retryable is true when the failure consumed no generation and submitting the same request again is safe, and false when the same request cannot succeed or the outcome could not be confirmed; input problems also carry field. Failed jobs are not charged.
{
"request_id": "639e6b9e-26eb-43a6-917a-958adcf4bca2",
"status": "failed",
"model": "seedance-2.0-mini",
"error": {
"code": "invalid_input",
"message": "start_image is 1920x1080, which renders at 16:9, but end_image is 1024x1024, which renders at 1:1. Both frames must render at the same aspect ratio.",
"retryable": false,
"field": "end_image"
}
}
error.code | retryable | Meaning and what to do |
|---|---|---|
invalid_input | false | An input cannot be used, and message says which and why: an asset could not be downloaded (with the HTTP status), is not the declared kind, is not PNG/JPEG, is over the size limit, or the first and last frames render at different ratios (both sizes and ratios are named). Fix field and submit again. |
content_policy_violation | false | The request or the generated result did not pass content review; change the prompt or the references. |
copyright_violation | true | The generated result, such as its audio track, matched copyrighted material and was withheld. Nothing was consumed, and submitting again or rewording the prompt usually succeeds. |
generation_failed | true / false | Generation failed. true when the failure was confirmed or the request never reached generation, so submitting again is safe; false when the outcome could not be confirmed. |
generation_timeout | false | Generation started but had no result after 24 hours, and the job was ended. |
capacity_unavailable | true | No capacity became available within 10 minutes of queueing; submit again later. |
internal_error | true | The service failed before generation started; submit again. |
cancelled | false | The job was cancelled. |
ArgoLink's public model ID is gemini-omni-1.1. It is our stable Google Flow route name; other Omni or preview IDs belong to different provider APIs and their parameters must not be mixed.
API_KEY="YOUR_API_KEY"
BASE="https://54-151-42-83.sslip.io"
ID=$(curl -fsS "$BASE/v1/videos/generations" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1",
"prompt": "A cinematic sunrise over the ocean with a slow camera push",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p"
}' \
| jq -er '.request_id') || exit 1
printf 'Request ID: %s\n' "$ID"
curl -fsS "$BASE/v1/videos/$ID" \
-H "Authorization: Bearer $API_KEY" | jq .
curl -fSL --retry 120 --retry-delay 5 --retry-all-errors \
"$BASE/v1/videos/$ID/content" \
-H "Authorization: Bearer $API_KEY" \
-o gemini-omni.mp4
pending means still generating; done means the MP4 is ready; failed means this generation did not finish — check the upstream error in the full status response. The download command retries every 5 seconds for up to about 10 minutes.
curl -sS --fail-with-body \
https://54-151-42-83.sslip.io/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "model=gemini-omni-1.1" \
-F "prompt=Animate this first frame with a slow cinematic camera move" \
-F "duration=8" \
-F "aspect_ratio=16:9" \
-F "resolution=720p" \
-F "image=@./first-frame.jpg;type=image/jpeg" | jq .
image accepts exactly one local PNG or JPEG and locks it as the first frame. Once you have the request_id, reuse the status and content endpoints above.
curl -sS --fail-with-body \
https://54-151-42-83.sslip.io/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "model=gemini-omni-1.1" \
-F "prompt=Use the person and wardrobe from the reference images" \
-F "duration=8" \
-F "aspect_ratio=9:16" \
-F "resolution=720p" \
-F "reference_images=@./person.png;type=image/png" \
-F "reference_images=@./wardrobe.jpg;type=image/jpeg" | jq .
Workspace
Balance, API activity and recent account status in one place.
API Keys
Issue keys, set quotas and revoke access immediately.
Top-ups & Ledger
Create a secure checkout and review every top-up status.
Usage & Billing
Review requests, tokens, model distribution and settled cost.
Revocation and deletion take effect immediately. Historical usage and billing remain available.
| Name | Status | Quota | Expiration | Last Used | Actions |
|---|