File Analysis
The Messages API supports multimodal input via content blocks in the content array. Use image blocks for images and document blocks for PDFs and other files.
Endpoint and authentication are the same as Create a Message.
Confirm that the selected model supports the media type. A file_id must come from an upload accessible to the same service and account; this page does not define an upload endpoint, and another provider’s file ID is not interchangeable. URLs must be reachable by the server; local paths are not remote file URLs.
The current local gateway does not implement /v1/files uploads. Start with this page's URL or Base64 input examples. Use file_id examples only when your deployment provides uploads and you already have an ID accessible to the same account.
Content Block Types
| Type | Description |
|---|---|
text | Text prompt accompanying the media input |
image | Image input via URL, base64, or file ID |
document | Document input (PDF, plain text, etc.) via URL, base64, or file ID |
Image Analysis
Image from URL
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.jpg"
}
},
{
"type": "text",
"text": "Describe this image"
}
]
}
]
}Image from base64
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
},
{
"type": "text",
"text": "What objects are visible in this image?"
}
]
}
]
}Document Analysis
Analyze a PDF document:
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "url",
"url": "https://example.com/report.pdf"
}
},
{
"type": "text",
"text": "Summarize the key findings in this document."
}
]
}
]
}Request Example
See language setup. Set API_KEY and replace model, file URL, and ID placeholders first. Each version displays the raw response to the same request.
curl --fail-with-body --silent --show-error --max-time 180 \
--request POST \
--url "https://api.tokatlas.ai/v1/messages" \
--header "x-api-key: $API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.jpg"
}
},
{
"type": "text",
"text": "Describe this image"
}
]
}
]
}'import os
import requests
headers = {
'x-api-key': os.environ["API_KEY"],
'anthropic-version': '2023-06-01',
'Content-Type': 'application/json',
}
payload = {'model': 'claude-sonnet-4-6',
'max_tokens': 1024,
'messages': [{'role': 'user',
'content': [{'type': 'image',
'source': {'type': 'url',
'url': 'https://example.com/image.jpg'}},
{'type': 'text', 'text': 'Describe this image'}]}]}
response = requests.request(
'POST', 'https://api.tokatlas.ai/v1/messages', headers=headers,
json=payload,
timeout=180,
)
response.raise_for_status()
print(response.text)if (!process.env.API_KEY) throw new Error("Set API_KEY first.");
const response = await fetch("https://api.tokatlas.ai/v1/messages", {
method: "POST",
headers: {
"x-api-key": process.env.API_KEY,
"anthropic-version": "2023-06-01",
"Content-Type": "application/json",
},
body: JSON.stringify({
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.jpg"
}
},
{
"type": "text",
"text": "Describe this image"
}
]
}
]
}),
signal: AbortSignal.timeout(180_000),
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
console.log(await response.text());import java.net.URI;
import java.net.http.*;
import java.time.Duration;
public class Example {
public static void main(String[] args) throws Exception {
String apiKey = System.getenv("API_KEY");
if (apiKey == null || apiKey.isBlank()) {
throw new IllegalArgumentException("Set API_KEY first.");
}
String payload = String.join("\n",
"{",
" \"model\": \"claude-sonnet-4-6\",",
" \"max_tokens\": 1024,",
" \"messages\": [",
" {",
" \"role\": \"user\",",
" \"content\": [",
" {",
" \"type\": \"image\",",
" \"source\": {",
" \"type\": \"url\",",
" \"url\": \"https://example.com/image.jpg\"",
" }",
" },",
" {",
" \"type\": \"text\",",
" \"text\": \"Describe this image\"",
" }",
" ]",
" }",
" ]",
"}"
);
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(30)).build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.tokatlas.ai/v1/messages"))
.timeout(Duration.ofSeconds(180))
.header("x-api-key", apiKey)
.header("anthropic-version", "2023-06-01")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() < 200 || response.statusCode() >= 300) {
throw new IllegalStateException("HTTP " + response.statusCode() + ": "
+ response.body());
}
System.out.println(response.body());
}
}Response Example
{
"code": 200,
"data": {
"id": "msg_013Zva2CMHLNnXjNJJKqJ2EF",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "This image shows a scenic landscape with a boardwalk path through a green meadow under a blue sky with scattered clouds."
}
],
"model": "claude-sonnet-4-6",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 1520,
"output_tokens": 42
}
}
}Related Topics
- Create a Message — Text conversation and streaming
- Tool Calling — Function calling and tool use
