Qwen3-VL 235B API
Available VisionQwen3-VL 235B accepts images and text in the same chat request, in the OpenAI image_url format, as a URL or a base64 data URI. In our tests it read the text in an image exactly, returned it as JSON on request, described an image fetched from a URL, and filled a tool call from an invoice image. It is served at FP8 precision by our second upstream, in the United States.
Quickstart
Set INFERENCE_API_KEY to your key from the API Keys page, then run:
curl https://api.inferenceapis.com/v1/chat/completions \
-H "Authorization: Bearer $INFERENCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-VL-235B-A22B-Instruct",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello! What can you do?"}
]
}'
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.inferenceapis.com/v1",
api_key=os.environ["INFERENCE_API_KEY"],
)
response = client.chat.completions.create(
model="Qwen/Qwen3-VL-235B-A22B-Instruct",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello! What can you do?"},
],
)
print(response.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.inferenceapis.com/v1",
apiKey: process.env.INFERENCE_API_KEY,
});
const response = await client.chat.completions.create({
model: "Qwen/Qwen3-VL-235B-A22B-Instruct",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Hello! What can you do?" },
],
});
console.log(response.choices[0].message.content);
When to use it
- Reading screenshots, invoices, receipts and scanned pages into text or JSON
- Agents that need to look at an image and then call a tool
- Text-only work; the text models here are cheaper
What it costs in practice
| Workload | Cost |
|---|---|
| Chat assistant — 10,000 turns of 800 tokens in, 300 out | $5.53 |
| Long prompts or RAG — 10,000 requests of 8,000 in, 500 out | $26.55 |
| Generation-heavy — 10,000 requests of 500 in, 2,000 out | $24.30 |
Computed from the live rates below. This model does not reason before answering, so output tokens are the visible answer only. There is no subscription or minimum; new accounts start with free credit.
Endpoint
Content-Type: application/json
/openai/v1/… is accepted too, so Groq-style base URLs work with only the host changed.
Model IDs and aliases
Send any of these as model; they all resolve to this model and bill at its rate.
| ID | Note |
|---|---|
Qwen/Qwen3-VL-235B-A22B-Instruct | Canonical |
qwen3-vl | Alias |
qwen3-vl-235b | Alias |
Request body
| Parameter | Type | Description |
|---|---|---|
model required |
string | Model ID: Qwen/Qwen3-VL-235B-A22B-Instruct — also accepted: qwen3-vl, qwen3-vl-235b |
messages required |
array | Conversation so far. Each item has a role (system, user or assistant) and content. |
max_tokens |
integer | Maximum number of tokens to generate. |
temperature |
number | Sampling temperature. Higher values give more varied output. |
top_p |
number | Nucleus sampling cutoff. |
stream |
boolean | Stream the response as server-sent events. The final chunk includes usage. |
tools |
array | Tool definitions for function calling (OpenAI format). |
response_format |
object | {"type": "json_object"} for JSON mode. |
stop |
string | array | Sequences where the model stops generating. |
seed |
integer | Seed for more reproducible sampling. |
Response
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"model": "Qwen/Qwen3-VL-235B-A22B-Instruct",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hi! I can answer questions, write and edit text, help with code and more."
},
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 28, "completion_tokens": 17, "total_tokens": 45 }
}
Sending images
Put image parts next to the text in a message's content array. A URL and a base64 data URI both work; PNG and JPEG were tested.
import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.inferenceapis.com/v1", api_key=os.environ["INFERENCE_API_KEY"])
b64 = base64.b64encode(open("invoice.png", "rb").read()).decode()
resp = client.chat.completions.create(
model="Qwen/Qwen3-VL-235B-A22B-Instruct",
messages=[{"role": "user", "content": [
{"type": "text", "text": "Return JSON with keys invoice_number and total."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}, # or a plain https:// URL
]}],
response_format={"type": "json_object"},
max_tokens=300,
)
print(resp.choices[0].message.content) # {"invoice_number": "48213", "total": "$1,274.50"}That output is from our own test image. Images are billed as input tokens, so downscale large ones; text in the image stays readable well below full resolution.
Tested on this endpoint
Tool calling (tools, tool_calls) | Works |
JSON mode (response_format: json_object) | Works |
Schema-constrained output (response_format: json_schema) | Works |
Streaming with usage in the final chunk | Works |
| System prompt followed | Works |
Each row is a live request we sent on September 17, 2026, not a claim copied from a model card. Streamed and parallel tool calls and tool_choice were tested too: full matrix for every model. Request examples are in the API documentation.
Pricing
| Input | $0.26 / 1M tokens |
| Output | $1.15 / 1M tokens |
| Billing | Pay as you go from prepaid credits. No subscription, no daily request or token cap. See all pricing. |
Notes
- It generates slowly here: about 11 tokens per second in our measurement, so a long description takes a while. It suits extraction, where the answer is short, better than long-form writing.
- Images are billed as input tokens; a 640×240 image came to about 170 tokens and a 1200×630 image to about 770 in our tests. Downscale large images before sending them.
- The smaller Qwen3-VL 30B is not offered: at our upstream it did not answer requests when we tested it.
Compare Qwen3-VL 235B with…
Errors
Errors use the OpenAI envelope: {"error": {"message", "type", "code"}}. 401 missing or invalid key · 402 insufficient_balance · 404 model_not_found · 503 model_unavailable · 502 backend error, safe to retry. Full table with what to retry: API documentation. Errors from other providers: provider error reference.
