# Claude Opus 5 API

> Claude Opus 5 — frontier reasoning and generation through one API.

- **Provider**: Anthropic
- **Model id**: `claude-opus-5`
- **Modality**: text
- **Price**: 190–980 credits

## Overview

Claude Opus 5 is called in ONE step: POST your request and the answer comes back in the same response, in `text`. There is no task to poll.

## Authentication

All requests require a Bearer Token in the request header:

```
Authorization: Bearer YOUR_API_KEY
```

## Create Task

`POST https://you.bot/api/v1/generate`

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| modelId | string | Yes | Model id: `claude-opus-5` |
| input | object | Yes | Input parameters object (see below) |
| callbackUrl | string | No | https URL we POST the finished task to. Signed with `X-Webhook-Signature` once you create a webhook signing key in Dashboard → Settings |

### input object parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| prompt | string | Yes | Text value (example: A subscription product had 900 signups last month; 15 of them paid, at an average of $20 each, and serving everyone cost $40 in variable cost. Work out the… — full value in the request example) |
| thinking | boolean | No | Include the model's thinking process in the response (true/false) (example: true) |
| reasoning_effort | string | No | How much the model reasons before it answers (Anthropic's effort levels). Higher levels think longer and use more output tokens; at Max, set a larger max_tokens. (options: Low \| Medium \| High \| XHigh \| Max) (example: High) |
| max_tokens | number | No | Optional Claude output token limit. Leave empty to use the default: 16000, because this model reasons before it answers unless thinking is turned off (then 4096). (range 1-128000) |
| stream | boolean | No | Send true to receive the reply as an event stream (Content-Type: text/event-stream). Omit it and you get a single JSON response — streaming is opt-in on this endpoint. (true/false) (example: true) |
| images | string[] | No | Up to 4 images per message — JPEG, PNG, GIF or WebP, 5 MB each. Send each one as a data: URL or an https URL. Images are billed as input tokens. (image URL) |
| web_search | boolean | No | Web search feeds the results back as input tokens, so a searched turn typically costs many times a normal turn (measured: 6–87×). Billed per token as usual — nothing extra per search. (true/false) (example: false) |
| system | string | No | System instruction for the model. Defaults to "You are Claude Opus 5, developed by Anthropic." when omitted. |
| messages | array | No | A conversation instead of a single `prompt`: an array of { "role", "content" } objects, where role is user, assistant, system or tool (a function result, with `tool_call_id`); an assistant message may carry `tool_calls` instead of text — see `tools`. Send the whole conversation — we do not limit how many messages it has, and we do not drop old ones; the model's context window is the limit. Send `prompt` or `messages`, not both. Do not flatten a conversation into one prompt with "User:" / "Assistant:" labels — the model reads that as a single message, and a model using web search then searches for the whole block instead of your question. |
| tools | array | No | Functions the model may call, up to 64. Each is { "type": "function", "function": { "name", "description", "parameters" } } with `parameters` a JSON Schema object (the flat Responses form and Anthropic's { "name", "description", "input_schema" } are accepted too); `strict: true` is not accepted on this model. When the model calls one, the response carries `toolCalls`: run the function, then send the conversation back in `messages` with the assistant's `tool_calls` and one { "role": "tool", "tool_call_id", "content" } message per result — and the same `tools` again. Function calling cannot be combined with web search in the same request. |
| tool_choice | string \| object | No | `auto` (the model decides; the default when `tools` is set). Other values are not available on this model and are refused before any charge. |

### Request example

```json
{
  "modelId": "claude-opus-5",
  "input": {
    "prompt": "A subscription product had 900 signups last month; 15 of them paid, at an average of $20 each, and serving everyone cost $40 in variable cost. Work out the conversion rate, revenue per signup and gross margin. Then tell me which single number to move first and why, showing the arithmetic. Under 200 words, with every figure in a table.",
    "thinking": true,
    "reasoning_effort": "High",
    "max_tokens": 4096,
    "stream": false,
    "images": [
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAAFklEQVR4nGP8z4AATAxIHFQeMg8OAgB1yQIDpk8YwwAAAABJRU5ErkJggg=="
    ],
    "web_search": false
  }
}
```

### Response example

```json
{
  "model": "claude-opus-5",
  "text": "…",
  "creditsCharged": 0.38,
  "usage": {
    "inputTokens": 1400,
    "outputTokens": 120,
    "cachedInputTokens": 0,
    "cacheWriteTokens": 0
  }
}
```

## Query Task

`GET https://you.bot/api/v1/task/{taskId}?model=claude-opus-5`

When `state` is `success`, the output is in `resultUrls`: `{ "text": "…" }`. (Text models return inline in the create response.)

## Error Codes

| Code | Description |
|------|-------------|
| 200 | Request successful |
| 400 | Invalid request parameters |
| 401 | Authentication failed — check API Key |
| 402 | Insufficient account balance |
| 403 | IP not allowed for this key, or the key is restricted to other models |
| 404 | Task not found, or it has expired |
| 409 | Duplicate request — an identical submit arrived moments ago. Nothing was charged; retry is safe |
| 413 | Payload too large — see the character and file-size limits for this model |
| 429 | Rate limit exceeded — retry after the Retry-After header |
| 500 | Internal server error |
| 504 | Upstream timed out — nothing was delivered; retry is safe |
| 400 · too_many_images | More than 4 image(s) attached to one message |
| 400 · image_too_large | An attached image is over the 5 MB per-image limit |
| 400 · image_format_unsupported | Unsupported image format — accepted: image/jpeg, image/png, image/gif, image/webp (read from the file's own bytes, not the declared type) |
| 400 · image_unreadable | An attached image, or its pixel size, could not be read |
| 400 · capability_not_supported | A capability was requested (e.g. `web_search: true`) that this model does not offer — refused, nothing charged, rather than answered without it |
| 422 · image_not_received | The model answered that it did not receive the attached image — the reply is not usable, so nothing is charged. Retry |
| 400 · unknown_image_field | Images were sent under a different key (input_urls, image_urls, imageUrl …). This model takes them as `images` |
| 400 · image_placement_unsupported | An image is attached to a message that is not sent to the model as an image (a system message, an assistant message or a tool result). Attach images to a user message — they are refused rather than dropped |
| 400 · tools_invalid | `tools` is malformed (not an array, a non-function tool, a bad or repeated name, parameters that are not an object schema), or a conversation with function calls was sent without `tools` — refused, nothing charged |
| 400 · tool_choice_invalid | `tool_choice` is malformed, names a function that is not in `tools`, or forces a call while `tools` is empty — refused, nothing charged |
| 400 · message_tool_call_invalid | An assistant `tool_calls` entry or a `tool` message is malformed, or a call and its result do not pair up (every call needs its own tool message right after it) — refused, nothing charged |
| 400 · message_tool_block_unsupported | A `tool_use` or `tool_result` content block was sent; send calls as `tool_calls` and results as `tool` messages instead |
