Venice Responses API (Alpha)
POST /api/v1/responses is Venice's OpenAI-compatible Responses endpoint. It returns a structured, typed output array instead of a single message.content string — ideal for agents that need to separate reasoning, messages, tool calls, and built-in tool events.
Alpha. Access is gated behind the responsesApiEnabled flag on Bearer API keys (staff-only during beta). x402 wallet auth bypasses this flag — you can pay per request without the flag. Schemas may change.
Use when
- You need the OpenAI Responses-style response shape (
output[] with typed type: "reasoning" | "message" | "function_call" | "web_search_call" blocks) for a client library that expects it.
- You want clean separation of reasoning vs message vs tool-call output.
- You want streaming via SSE with typed events.
Otherwise use venice-chat — it has more features, more models, and full Venice parameters.
Limitations vs /chat/completions
| Limitation |
Detail |
| Stateless |
No conversation persistence across requests. Send the full history each call. |
| E2EE models default to rejection |
E2EE-capable models return 400 unless you pass venice_parameters.enable_e2ee: false (TEE-only mode). For end-to-end encrypted inference with E2EE headers, use /chat/completions. |
Subset of venice_parameters |
character_slug, enable_e2ee, enable_web_search, enable_web_scraping, enable_web_citations, include_venice_system_prompt, include_search_results_in_stream are supported. strip_thinking_response, disable_thinking, enable_x_search are not wired through in Alpha. |
| Access gated by feature flag |
Bearer keys without responsesApiEnabled get 401. x402 requests are allowed (pay-per-call). |
Authentication
Same as the rest of the API — either Authorization: Bearer <key> or X-Sign-In-With-X: <SIWE>. See venice-auth.
Minimal request
curl https://api.venice.ai/api/v1/responses \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "zai-org-glm-5-1",
"input": "Explain why the sky is blue in one paragraph."
}'
input accepts:
- a plain string, or
- an array of typed input items (similar to
chat/completions message parts) for multi-turn or multimodal history.
Response shape
{
"id": "resp_abc123",
"object": "response",
"created_at": 1735689600,
"model": "zai-org-glm-5-1",
"status": "completed",
"output": [
{
"type": "reasoning",
"id": "rs_1",
"summary": ["I considered Rayleigh scattering..."],
"encrypted_content": "..."
},
{
"type": "message",
"id": "msg_1",
"status": "completed",
"role": "assistant",
"content": [{
"type": "output_text",
"text": "The sky is blue because...",
"annotations": [{
"type": "url_citation",
"url": "https://example.com/rayleigh",
"title": "Rayleigh scattering",
"start_index": 42,
"end_index": 99
}]
}]
},
{
"type": "function_call",
"id": "fc_1",
"call_id": "call_abc",
"name": "get_weather",
"arguments": "{\"city\":\"Paris\"}",
"status": "completed"
},
{
"type": "web_search_call",
"id": "ws_1",
"status": "completed"
}
],
"usage": {
"input_tokens": 20,
"input_tokens_details": {"cached_tokens": 0},
"output_tokens": 80,
"output_tokens_details": {"reasoning_tokens": 40},
"total_tokens": 100
}
}
Top-level status ∈ completed | failed | in_progress | cancelled. On failed, error.code and error.message are populated.
Output block types
type |
Purpose |
reasoning |
Thought process from reasoning models. summary[] holds human-readable text; encrypted_content holds opaque signatures — round-trip verbatim for multi-turn tool calls. |
message |
Main text output. content[].type === "output_text", plus annotations[] for url_citation entries from web search. |
function_call |
Tool call: name, stringified-JSON arguments, call_id. |
web_search_call |
Sentinel showing the built-in web_search tool fired; use alongside url_citation annotations on messages. |
Match tool outputs back by call_id when continuing the turn.
Common request fields
| Field |
Notes |
model |
Required. Model ID, trait, or compatibility mapping. Feature suffixes allowed (see venice-chat). |
input |
Required. String or input-items array. To set system/developer context, include a leading message with role: "system"/"developer" in the input array. |
tools |
Array of {type:"function",function:{...}} or built-in {type:"web_search"} — availability depends on the model. |
tool_choice |
"auto" / "required" / "none" / {type:"function",function:{"name":"..."}}. |
reasoning.effort |
Reasoning effort hint for thinking models ("low" | "medium" | "high"). |
temperature, top_p, max_output_tokens, n, stop, seed, prompt_cache_key |
Standard generation controls — translated to /chat/completions equivalents server-side. |
stream |
Boolean. SSE response with typed events (response.created, response.output_item.added, response.output_text.delta, response.completed, …). |
venice_parameters |
Subset listed above. Example: {"character_slug":"alan-watts","enable_web_search":"on"}. |
Fields commonly found in OpenAI's Responses API that are not in Venice's Alpha schema (and silently ignored or rejected by Zod): instructions, metadata, parallel_tool_calls, response_format, store, previous_response_id, background. For response_format / JSON-schema structured output, use /chat/completions.
Streaming
With stream: true, the response is an SSE stream of typed events. Typical flow:
event: response.created
event: response.output_item.added # type=reasoning
event: response.reasoning.delta
event: response.output_item.added # type=message
event: response.content_part.added
event: response.output_text.delta
event: response.output_text.delta
event: response.output_item.done
event: response.completed
Consume events in order and reconstruct output[] client-side; the shape on response.completed matches the non-streamed response exactly.
Authentication & error responses
400 — bad request; also returned when an E2EE-capable model is used without venice_parameters.enable_e2ee: false.
401 — auth failed, or Bearer key lacks responsesApiEnabled, or the model is Pro-only and you're on an INFERENCE key / x402 wallet.
402 — insufficient balance. Bearer → { error: "INSUFFICIENT_BALANCE" }. x402 → PAYMENT_REQUIRED with topUpInstructions and siwxChallenge (see venice-x402).
429 — rate-limited.
500 — inference failed.
X-Balance-Remaining is on 200 responses when using x402 auth; PAYMENT-REQUIRED header on 402.
Migration notes
- Port
messages → pass as input (string, or typed array with leading {role:"system"|"developer", content:"..."}).
venice_parameters.character_slug → supported; pass inside venice_parameters or as a model feature suffix (:character_slug=alan-watts).
venice_parameters.enable_web_search → pass inside venice_parameters, or append :enable_web_search=on to the model ID, or add {"type":"web_search"} to tools.
venice_parameters.strip_thinking_response / disable_thinking → not supported on /responses in Alpha; stay on /chat/completions for these.
- Full E2EE flow (E2EE request headers + encrypted response) → stay on
/chat/completions. For TEE-only inference on an E2EE-capable model, pass venice_parameters.enable_e2ee: false here.
response_format / JSON-schema structured output → stay on /chat/completions.
1---2name: venice-venice-responses3description: Use Venice's Alpha POST /responses endpoint - an OpenAI-compatible Responses API with typed output blocks (reasoning, message, function_call, web_search_call). Covers request shape, streaming, differences from /chat/completions, supported venice_parameters subset, and E2EE behavior.4license: MIT5---6
7# Venice Responses API (Alpha)
8
9`POST /api/v1/responses` is Venice's OpenAI-compatible Responses endpoint. It returns a **structured, typed output array** instead of a single `message.content` string — ideal for agents that need to separate reasoning, messages, tool calls, and built-in tool events.
10
11> **Alpha.** Access is gated behind the `responsesApiEnabled` flag on Bearer API keys (staff-only during beta). x402 wallet auth bypasses this flag — you can pay per request without the flag. Schemas may change.
12
13## Use when
14
15- You need the OpenAI Responses-style response shape (`output[]` with typed `type: "reasoning" | "message" | "function_call" | "web_search_call"` blocks) for a client library that expects it.
16- You want clean separation of reasoning vs message vs tool-call output.
17- You want streaming via SSE with typed events.
18
19Otherwise use [`venice-chat`](../venice-chat/SKILL.md) — it has more features, more models, and full Venice parameters.
20
21## Limitations vs `/chat/completions`
22
23| Limitation | Detail |
24|---|---|
25| **Stateless** | No conversation persistence across requests. Send the full history each call. |
26| **E2EE models default to rejection** | E2EE-capable models return `400` unless you pass `venice_parameters.enable_e2ee: false` (TEE-only mode). For end-to-end encrypted inference with E2EE headers, use `/chat/completions`. |
27| **Subset of `venice_parameters`** | `character_slug`, `enable_e2ee`, `enable_web_search`, `enable_web_scraping`, `enable_web_citations`, `include_venice_system_prompt`, `include_search_results_in_stream` are supported. `strip_thinking_response`, `disable_thinking`, `enable_x_search` are **not** wired through in Alpha. |
28| **Access gated by feature flag** | Bearer keys without `responsesApiEnabled` get `401`. x402 requests are allowed (pay-per-call). |
29
30## Authentication
31
32Same as the rest of the API — either `Authorization: Bearer <key>` or `X-Sign-In-With-X: <SIWE>`. See [`venice-auth`](../venice-auth/SKILL.md).
33
34## Minimal request
35
36```bash
37curl https://api.venice.ai/api/v1/responses \
38 -H "Authorization: Bearer $VENICE_API_KEY" \
39 -H "Content-Type: application/json" \
40 -d '{
41 "model": "zai-org-glm-5-1",
42 "input": "Explain why the sky is blue in one paragraph."
43 }'
44```
45
46`input` accepts:
47- a plain string, or
48- an array of typed input items (similar to `chat/completions` message parts) for multi-turn or multimodal history.
49
50## Response shape
51
52```json
53{
54 "id": "resp_abc123",
55 "object": "response",
56 "created_at": 1735689600,
57 "model": "zai-org-glm-5-1",
58 "status": "completed",
59 "output": [
60 {
61 "type": "reasoning",
62 "id": "rs_1",
63 "summary": ["I considered Rayleigh scattering..."],
64 "encrypted_content": "..."
65 },
66 {
67 "type": "message",
68 "id": "msg_1",
69 "status": "completed",
70 "role": "assistant",
71 "content": [{
72 "type": "output_text",
73 "text": "The sky is blue because...",
74 "annotations": [{
75 "type": "url_citation",
76 "url": "https://example.com/rayleigh",
77 "title": "Rayleigh scattering",
78 "start_index": 42,
79 "end_index": 99
80 }]
81 }]
82 },
83 {
84 "type": "function_call",
85 "id": "fc_1",
86 "call_id": "call_abc",
87 "name": "get_weather",
88 "arguments": "{\"city\":\"Paris\"}",
89 "status": "completed"
90 },
91 {
92 "type": "web_search_call",
93 "id": "ws_1",
94 "status": "completed"
95 }
96 ],
97 "usage": {
98 "input_tokens": 20,
99 "input_tokens_details": {"cached_tokens": 0},
100 "output_tokens": 80,
101 "output_tokens_details": {"reasoning_tokens": 40},
102 "total_tokens": 100
103 }
104}
105```
106
107Top-level `status` ∈ `completed` | `failed` | `in_progress` | `cancelled`. On `failed`, `error.code` and `error.message` are populated.
108
109## Output block types
110
111| `type` | Purpose |
112|---|---|
113| `reasoning` | Thought process from reasoning models. `summary[]` holds human-readable text; `encrypted_content` holds opaque signatures — round-trip verbatim for multi-turn tool calls. |
114| `message` | Main text output. `content[].type === "output_text"`, plus `annotations[]` for `url_citation` entries from web search. |
115| `function_call` | Tool call: `name`, stringified-JSON `arguments`, `call_id`. |
116| `web_search_call` | Sentinel showing the built-in web_search tool fired; use alongside `url_citation` annotations on messages. |
117
118Match tool outputs back by `call_id` when continuing the turn.
119
120## Common request fields
121
122| Field | Notes |
123|---|---|
124| `model` | Required. Model ID, trait, or compatibility mapping. Feature suffixes allowed (see [`venice-chat`](../venice-chat/SKILL.md#model-feature-suffixes)). |
125| `input` | Required. String or input-items array. To set system/developer context, include a leading message with `role: "system"`/`"developer"` in the input array. |
126| `tools` | Array of `{type:"function",function:{...}}` or built-in `{type:"web_search"}` — availability depends on the model. |
127| `tool_choice` | `"auto"` / `"required"` / `"none"` / `{type:"function",function:{"name":"..."}}`. |
128| `reasoning.effort` | Reasoning effort hint for thinking models (`"low"` \| `"medium"` \| `"high"`). |
129| `temperature`, `top_p`, `max_output_tokens`, `n`, `stop`, `seed`, `prompt_cache_key` | Standard generation controls — translated to `/chat/completions` equivalents server-side. |
130| `stream` | Boolean. SSE response with typed events (`response.created`, `response.output_item.added`, `response.output_text.delta`, `response.completed`, …). |
131| `venice_parameters` | Subset listed above. Example: `{"character_slug":"alan-watts","enable_web_search":"on"}`. |
132
133Fields commonly found in OpenAI's Responses API that are **not** in Venice's Alpha schema (and silently ignored or rejected by Zod): `instructions`, `metadata`, `parallel_tool_calls`, `response_format`, `store`, `previous_response_id`, `background`. For `response_format` / JSON-schema structured output, use `/chat/completions`.
134
135## Streaming
136
137With `stream: true`, the response is an SSE stream of typed events. Typical flow:
138
139```
140event: response.created
141event: response.output_item.added # type=reasoning
142event: response.reasoning.delta
143event: response.output_item.added # type=message
144event: response.content_part.added
145event: response.output_text.delta
146event: response.output_text.delta
147event: response.output_item.done
148event: response.completed
149```
150
151Consume events in order and reconstruct `output[]` client-side; the shape on `response.completed` matches the non-streamed response exactly.
152
153## Authentication & error responses
154
155- `400` — bad request; also returned when an E2EE-capable model is used without `venice_parameters.enable_e2ee: false`.
156- `401` — auth failed, or Bearer key lacks `responsesApiEnabled`, or the model is Pro-only and you're on an INFERENCE key / x402 wallet.
157- `402` — insufficient balance. Bearer → `{ error: "INSUFFICIENT_BALANCE" }`. x402 → `PAYMENT_REQUIRED` with `topUpInstructions` and `siwxChallenge` (see [`venice-x402`](../venice-x402/SKILL.md)).
158- `429` — rate-limited.
159- `500` — inference failed.
160
161`X-Balance-Remaining` is on 200 responses when using x402 auth; `PAYMENT-REQUIRED` header on 402.
162
163## Migration notes
164
165- Port `messages` → pass as `input` (string, or typed array with leading `{role:"system"|"developer", content:"..."}`).
166- `venice_parameters.character_slug` → **supported**; pass inside `venice_parameters` or as a model feature suffix (`:character_slug=alan-watts`).
167- `venice_parameters.enable_web_search` → pass inside `venice_parameters`, or append `:enable_web_search=on` to the model ID, or add `{"type":"web_search"}` to `tools`.
168- `venice_parameters.strip_thinking_response` / `disable_thinking` → **not supported on `/responses`** in Alpha; stay on `/chat/completions` for these.
169- Full E2EE flow (E2EE request headers + encrypted response) → stay on `/chat/completions`. For TEE-only inference on an E2EE-capable model, pass `venice_parameters.enable_e2ee: false` here.
170- `response_format` / JSON-schema structured output → stay on `/chat/completions`.