Base URL
https://api.verba.ink
How the API works (short answer)
- Create an API key in Dashboard -> Settings -> Security -> API Keys.
- Call
POST /v1/responsewithcharacter+messages. - Save the returned
session_idand reuse it for follow-up requests. - Use
stream: truefor SSE streaming on Plus/Pro/Ultra plans. - Use
POST /v1/imagewhen you need image generation.
Fast answers
- Base URL:
https://api.verba.ink - Text endpoint:
POST /v1/response - Image endpoint:
POST /v1/image - Auth:
Authorization: Bearer vka_...orx-api-key: vka_... - Session memory: reuse
session_idon later calls to continue context - Streaming:
stream: trueon/v1/response(Plus/Pro/Ultra) - Message count limit: up to
60items inmessages - Message size limits: each message text up to
4000chars, total up to20000chars - Session ID format: optional, max
128chars, allowed charsA-Z a-z 0-9 : _ - - Image URL limit: up to
4combined URLs - Tool limits: up to
8tool definitions, up to2executed tool calls per request
Request limits (fast reference)
| Field | Limit |
|---|---|
messages length | 60 max |
| Per-message text | 4000 chars max |
Total text across messages | 20000 chars max |
session_id | optional, 128 chars max |
image_urls (combined) | 4 max |
tools definitions | 8 max |
| Executed tool calls | 2 max per request |
/v1/image prompt | 1500 chars max |
/v1/image size | only 1024x1024 |
Quick start
Pick a character
Use your character vanity slug or vanity URL (for example
mycharacter_abc or https://verba.ink/v/mycharacter_abc).Authentication
Send your API key in either header:Authorization: Bearer vka_...x-api-key: vka_...
401.
API key quick facts
- API key prefix is
vka_. - Maximum active keys per account:
3. - Key revocation is immediate.
Character identifier
Both endpoints usecharacter (not verb_id).
Accepted formats:
- Vanity slug:
mycharacter_abc - Vanity path:
/v/mycharacter_abc - Full vanity URL:
https://verba.ink/v/mycharacter_abc
Endpoints
POST /v1/responsefor text chat completionsPOST /v1/imagefor image generation
POST /v1/response
Text completion endpoint. You can optionally attach image URLs for vision-enabled prompting.
Supports both standard JSON and streaming. Set
stream: true to receive Server-Sent Events (SSE) chunks.Streaming on
/v1/response is available for Plus, Pro, and Ultra plans.characterstring (vanity URL or vanity slug)messagesarray (role+content)
session_idstringtemperaturenumber (0..2)top_pnumber (0..1)max_tokensnumberstreamboolean (truefor SSE stream, defaultfalse)image_urlsarray of image URLs (http/https, max 4)toolsarray (OpenAI-style function tools, max 8)tool_choice("auto"or"none")debugobject ({ "tools": true }to include tool traces)
Session memory on /v1/response
How it works:
- Send your first request with or without
session_id. - If omitted, the API generates one and returns it in the response.
- Reuse that same
session_idin later requests to keep context for that caller + character.
session_id, you start a new conversation state.
messages[].content supports:
- String text content
- Array parts with:
{ "type": "text", "text": "..." }{ "type": "image_url", "image_url": { "url": "https://..." } }
messages[].content or top-level image_urls (both are merged, max 4 total).
You cannot pass custom system messages on /v1/response; character personality + system instructions are applied automatically.
Tool configuration is request-scoped only (not stored on your character/dashboard).
Request examples
Session memory example
First call:session_id:
Vision input example
Request-scoped tool calling
/v1/response supports server-executed HTTP function tools passed in the request.
- Tools are not persisted.
- Allowed methods:
GET,POST. - Tool URLs support only
http/httpson ports80or443. - Local/private network targets are blocked.
- Tool responses must be
application/json(or+json) ortext/plain. - Max executed tool calls per request:
2. - Tool requests execute through Verba-managed outbound egress.
- Built-in character
webSearchremains separate and unchanged.
tool_choice supports:
"auto"(default model decides)"none"(disable tool calls for this request)
auto works:
- Verba first lets the model decide natively (provider
tool_callsif supported). - If the provider does not emit native
tool_calls, Verba runs an internal model planner step to decide whether one tool should be used. - This preserves model-driven behavior while improving compatibility across providers.
debug.tools=true:
- Non-stream response includes
debug.tool_runs[]. - Stream response emits extra SSE frames with
object: "chat.completion.tool_trace".
Tool example (GET web search)
Tool example (POST JSON)
Example response
debug.tools=true:
Streaming (stream: true)
With stream: true, /v1/response returns text/event-stream and emits data: events.
- Each event is an OpenAI-style
chat.completion.chunkpayload. - If
debug.tools=trueand tools run, extra events useobject: "chat.completion.tool_trace". - The final event is
data: [DONE]. - You should concatenate
choices[0].delta.contentchunks to build the assistant message. - Free plans return
403 stream_plan_upgrade_requiredwhenstream: trueis used.
Streaming request examples
POST /v1/image
Generates one image URL.
Required:
characterstring (vanity URL or vanity slug)promptstring
session_idstringimage_urlsstring array (reference images)size(1024x1024only)response_format(urlonly)
Request examples
Example response
Sessions and memory
session_idis optional.- If omitted, Verba generates one and returns it.
- Reusing the same
session_idpreserves API conversation context for that caller + verb pair. - API memory is stored in conversation history only (not DM or message logs).
Access, billing, and limits
- API access is available to all users.
- Verb privacy still applies:
- Private characters: owner only
- Public characters: any API caller
- Billing and tier/model enforcement are applied to the character owner account.
/v1/*uses account rate limits via the same per-user limiter model.
Message format (/v1/response)
messagesmust be an array.- Include at least one
usermessage. - Allowed roles:
user,assistant(assistantmaps internally to model role). systemrole is blocked on/v1/responseto prevent overriding character instructions.messages[].contentsupports text andimage_urlparts.- Top-level
image_urlsis also supported. - Combined image URL limit is 4.
toolsis optional and request-scoped (max 8 per request).tool_choiceis optional (autoornone).
Error model
Errors return JSON with a top-levelmessage and an error object.
error.type: stable machine-readable error type (for program logic)error.code: HTTP status code
401 invalid_api_keyfor missing/invalid/revoked API key403 verb_access_deniedfor private character access by non-owner403 stream_plan_upgrade_requiredwhen free plans requeststream: true403 insufficient_creditswhen the character owner has no credits for the selected model400 invalid_message_rolewhensystemrole is provided inmessages400 invalid_streamwhenstreamis not a boolean400 invalid_toolsfor malformed tool schema/config400 invalid_tool_choicefor invalidtool_choice400 blocked_tool_urlwhen tool URL targets local/private hosts400 tool_call_limit_exceededwhen model attempts more than 2 tool calls400 invalid_image_urlswhen image URL payload format is invalid400 blocked_image_urlwhen image URL targets local/private network hosts400 too_many_image_urlswhen more than 4 image URLs are provided502 tool_proxy_unavailablewhen managed outbound tool egress is unavailable502 tool_execution_failedwhen upstream tool execution fails400 invalid_sizewhen/v1/imagesize is not1024x1024

