OpenAI format for the web search API.
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
model | string | ✅ Yes | claude-sonnet-4-20250514 | - | The model to use for the request |
messages | array | ✅ Yes | - | - | Array of message objects for the conversation. Each message must have a role (user/assistant) and content (string or array of content blocks) |
tools | array | ✅ Yes | - | - | Array of tool objects. For web search, must include the web_search tool configuration with type web_search_20250305 |
max_tokens | integer | ❌ No | - | 1-32000 | Maximum number of tokens to generate in the response |
temperature | number | ❌ No | 1.0 | 0.0-2.0 | Controls randomness in output. Use lower values (closer to 0.0) for analytical tasks, higher values (closer to 2.0) for creative tasks |
top_p | number | ❌ No | - | 0.0-1.0 | Nucleus sampling threshold. Controls diversity by considering only tokens with cumulative probability up to top_p. Recommended for advanced use only. Do not use with temperature |
top_k | integer | ❌ No | - | >0 | Only sample from the top K options for each token. Removes low probability responses. Recommended for advanced use only |
stream | boolean | ❌ No | false | - | Whether to stream the response incrementally using server-sent events |
stop | array | ❌ No | - | Max 8191 sequences | Custom text sequences that will cause the model to stop generating. Each sequence must contain non-whitespace characters |
presence_penalty | number | ❌ No | 0 | -2.0 to 2.0 | Positive values penalize new tokens based on whether they appear in the text so far |
frequency_penalty | number | ❌ No | 0 | -2.0 to 2.0 | Positive values penalize new tokens based on their existing frequency in the text so far |
messages array should have the following structure:
| Field | Type | Required | Range | Description |
|---|---|---|---|---|
role | string | ✅ Yes | - | The role of the message. Can be: user or assistant |
content | array/string | ✅ Yes | - | The content of the message. Can be a simple string for text-only messages, or an array of content blocks for multimodal content |
| Field | Type | Required | Range | Description |
|---|---|---|---|---|
type | string | ✅ Yes | - | Must be text |
text | string | ✅ Yes | - | The text content |
tools array should contain a web search tool object:
| Field | Type | Required | Range | Description |
|---|---|---|---|---|
type | string | ✅ Yes | - | The type of tool. Must be web_search_20250305 for web search |
name | string | ✅ Yes | - | The name of the tool. Use web_search |
max_uses | integer | ❌ No | 1-10 | Maximum number of times the web search tool can be used in a single request |
allowed_domains | array | ❌ No | - | Only include search results from these domains. Cannot be used with blocked_domains |
blocked_domains | array | ❌ No | - | Never include search results from these domains. Cannot be used with allowed_domains |
user_location | object | ❌ No | - | Localize search results based on user’s location |
max_uses parameter limits the number of searches performed. If Claude attempts more searches than allowed, the web search result will be an error with the max_uses_exceeded error code.
example.com instead of https://example.com)example.com covers docs.example.com)docs.example.com returns only results from that subdomain, not from example.com or api.example.com)example.com/blog)allowed_domains or blocked_domains, but not both in the same requestuser_location object allows you to localize search results based on a user’s location:
| Field | Type | Required | Range | Description |
|---|---|---|---|---|
type | string | ✅ Yes | - | The type of location. Must be approximate |
city | string | ✅ Yes | - | The city name (e.g., San Francisco) |
region | string | ✅ Yes | - | The region or state (e.g., California) |
country | string | ✅ Yes | - | The country code (e.g., US) |
timezone | string | ✅ Yes | - | The IANA timezone ID (e.g., America/Los_Angeles) |