# Files API
---
The Files API lets you upload and manage files to use with the Claude API without re-uploading content with each request. This is particularly useful when using the [code execution tool](/docs/en/agents-and-tools/tool-use/code-execution-tool) to provide inputs (e.g. datasets and documents) and then download outputs (e.g. charts). You can also use the Files API to prevent having to continually re-upload frequently used documents and images across multiple API calls. You can [explore the API reference directly](/docs/en/api/files-create), in addition to this guide.
The Files API is currently in beta. Please reach out through our [feedback form](https://forms.gle/tisHyierGwgN4DUE9) to share your experience with the Files API.
This feature is in beta and is **not** covered by [Zero Data Retention (ZDR)](/docs/en/build-with-claude/zero-data-retention) arrangements. Beta features are excluded from ZDR.
## Supported models
Referencing a `file_id` in a Messages request is supported in all models that support the given file type. For example, [images](/docs/en/build-with-claude/vision) are supported in all Claude 3+ models, [PDFs](/docs/en/build-with-claude/pdf-support) in all Claude 3.5+ models, and [various other file types](/docs/en/agents-and-tools/tool-use/code-execution-tool#supported-file-types) for the code execution tool in Claude Haiku 4.5 plus all Claude 3.7+ models.
The Files API is currently not supported on Amazon Bedrock or Google Vertex AI.
## How the Files API works
The Files API provides a simple create-once, use-many-times approach for working with files:
- **Upload files** to our secure storage and receive a unique `file_id`
- **Download files** that are created from skills or the code execution tool
- **Reference files** in [Messages](/docs/en/api/messages) requests using the `file_id` instead of re-uploading content
- **Manage your files** with list, retrieve, and delete operations
## How to use the Files API
To use the Files API, you'll need to include the beta feature header: `anthropic-beta: files-api-2025-04-14`.
### Uploading a file
Upload a file to be referenced in future API calls:
```bash Shell
curl -X POST https://api.anthropic.com/v1/files \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14" \
-F "file=@/path/to/document.pdf"
```
```python Python
import anthropic
client = anthropic.Anthropic()
client.beta.files.upload(
file=("document.pdf", open("/path/to/document.pdf", "rb"), "application/pdf"),
)
```
```typescript TypeScript
import Anthropic, { toFile } from "@anthropic-ai/sdk";
import fs from "fs";
const anthropic = new Anthropic();
await anthropic.beta.files.upload({
file: await toFile(fs.createReadStream("/path/to/document.pdf"), undefined, { type: "application/pdf" })
}, {
betas: ["files-api-2025-04-14"]
});
```
```java Java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import java.nio.file.Path;
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
var file = client.beta().files().upload(
Path.of("/path/to/document.pdf")
);
System.out.println(file.id());
```
```go Go
package main
import (
"context"
"fmt"
"os"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
file, _ := os.Open("/path/to/document.pdf")
defer file.Close()
response, _ := client.Beta.Files.Upload(context.Background(),
anthropic.BetaFileUploadParams{
File: file,
})
fmt.Println(response.ID)
}
```
```ruby Ruby
require "anthropic"
client = Anthropic::Client.new
file = client.beta.files.upload(
file: File.open("/path/to/document.pdf", "rb")
)
puts file.id
```
```csharp C#
using Anthropic;
var client = new AnthropicClient();
var file = await client.Beta.Files.UploadAsync(
new FileUploadParams
{
File = File.OpenRead("/path/to/document.pdf")
});
Console.WriteLine(file.Id);
```
```php PHP
beta->files->upload([
'file' => fopen('/path/to/document.pdf', 'r')
]);
echo $file->id;
```
The response from uploading a file will include:
```json
{
"id": "file_011CNha8iCJcU1wXNR6q4V8w",
"type": "file",
"filename": "document.pdf",
"mime_type": "application/pdf",
"size_bytes": 1024000,
"created_at": "2025-01-01T00:00:00Z",
"downloadable": false
}
```
### Using a file in messages
Once uploaded, reference the file using its `file_id`:
```bash Shell
curl -X POST https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Please summarize this document for me."
},
{
"type": "document",
"source": {
"type": "file",
"file_id": "file_011CNha8iCJcU1wXNR6q4V8w"
}
}
]
}
]
}'
```
```python Python
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Please summarize this document for me."},
{
"type": "document",
"source": {
"type": "file",
"file_id": "file_011CNha8iCJcU1wXNR6q4V8w",
},
},
],
}
],
betas=["files-api-2025-04-14"],
)
print(response)
```
```typescript TypeScript
import { Anthropic } from "@anthropic-ai/sdk";
const anthropic = new Anthropic();
const response = await anthropic.beta.messages.create({
model: "claude-opus-4-6",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "text",
text: "Please summarize this document for me."
},
{
type: "document",
source: {
type: "file",
file_id: "file_011CNha8iCJcU1wXNR6q4V8w"
}
}
]
}
],
betas: ["files-api-2025-04-14"]
});
console.log(response);
```
```java Java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.messages.*;
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_4_6)
.maxTokens(1024)
.addMessage(MessageParam.builder()
.role(Role.USER)
.content(ContentBlockParam.ofText("Please summarize this document for me."))
.content(ContentBlockParam.ofDocument(DocumentBlockParam.builder()
.source(DocumentBlockParam.Source.ofFile(
DocumentBlockParam.Source.File.builder()
.fileId("file_011CNha8iCJcU1wXNR6q4V8w")
.build()))
.build()))
.build())
.build();
Message message = client.beta().messages().create(params);
System.out.println(message);
```
```go Go
package main
import (
"context"
"fmt"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
response, _ := client.Beta.Messages.New(context.Background(),
anthropic.BetaMessageNewParams{
Model: anthropic.ModelClaudeOpus4_6,
MaxTokens: 1024,
Betas: []anthropic.AnthropicBeta{anthropic.AnthropicBetaFilesAPI2025_04_14},
Messages: []anthropic.BetaMessageParam{
{
Role: "user",
Content: []anthropic.BetaContentBlockParam{
anthropic.NewBetaTextBlock("Please summarize this document for me."),
{
Type: "document",
Source: &anthropic.BetaDocumentSourceParam{
Type: "file",
FileID: "file_011CNha8iCJcU1wXNR6q4V8w",
},
},
},
},
},
})
fmt.Println(response)
}
```
```ruby Ruby
require "anthropic"
client = Anthropic::Client.new
response = client.beta.messages.create(
model: "claude-opus-4-6",
max_tokens: 1024,
betas: ["files-api-2025-04-14"],
messages: [
{
role: "user",
content: [
{ type: "text", text: "Please summarize this document for me." },
{
type: "document",
source: {
type: "file",
file_id: "file_011CNha8iCJcU1wXNR6q4V8w"
}
}
]
}
]
)
puts response
```
```csharp C#
using Anthropic;
var client = new AnthropicClient();
var response = await client.Beta.Messages.CreateAsync(
new BetaMessageCreateParams
{
Model = "claude-opus-4-6",
MaxTokens = 1024,
Betas = new[] { "files-api-2025-04-14" },
Messages = new[]
{
new BetaMessageParam
{
Role = "user",
Content = new object[]
{
new { type = "text", text = "Please summarize this document for me." },
new
{
type = "document",
source = new
{
type = "file",
file_id = "file_011CNha8iCJcU1wXNR6q4V8w"
}
}
}
}
}
});
Console.WriteLine(response);
```
```php PHP
beta->messages->create([
'model' => 'claude-opus-4-6',
'max_tokens' => 1024,
'betas' => ['files-api-2025-04-14'],
'messages' => [
[
'role' => 'user',
'content' => [
['type' => 'text', 'text' => 'Please summarize this document for me.'],
[
'type' => 'document',
'source' => [
'type' => 'file',
'file_id' => 'file_011CNha8iCJcU1wXNR6q4V8w'
]
]
]
]
]
]);
print_r($response);
```
### File types and content blocks
The Files API supports different file types that correspond to different content block types:
| File Type | MIME Type | Content Block Type | Use Case |
| :--- | :--- | :--- | :--- |
| PDF | `application/pdf` | `document` | Text analysis, document processing |
| Plain text | `text/plain` | `document` | Text analysis, processing |
| Images | `image/jpeg`, `image/png`, `image/gif`, `image/webp` | `image` | Image analysis, visual tasks |
| [Datasets, others](/docs/en/agents-and-tools/tool-use/code-execution-tool#supported-file-types) | Varies | `container_upload` | Analyze data, create visualizations |
### Working with other file formats
For file types that are not supported as `document` blocks (.csv, .txt, .md, .docx, .xlsx), convert the files to plain text, and include the content directly in your message:
```bash Shell
# Example: Reading a text file and sending it as plain text
# Note: For files with special characters, consider base64 encoding
TEXT_CONTENT=$(cat document.txt | jq -Rs .)
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d @- <
For .docx files containing images, convert them to PDF format first, then use [PDF support](/docs/en/build-with-claude/pdf-support) to take advantage of the built-in image parsing. This allows using citations from the PDF document.
#### Document blocks
For PDFs and text files, use the `document` content block:
```json
{
"type": "document",
"source": {
"type": "file",
"file_id": "file_011CNha8iCJcU1wXNR6q4V8w"
},
"title": "Document Title", // Optional
"context": "Context about the document", // Optional
"citations": {"enabled": true} // Optional, enables citations
}
```
#### Image blocks
For images, use the `image` content block:
```json
{
"type": "image",
"source": {
"type": "file",
"file_id": "file_011CPMxVD3fHLUhvTqtsQA5w"
}
}
```
### Managing files
#### List files
Retrieve a list of your uploaded files:
```bash Shell
curl https://api.anthropic.com/v1/files \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14"
```
```python Python
import anthropic
client = anthropic.Anthropic()
files = client.beta.files.list()
```
```typescript TypeScript
import { Anthropic } from "@anthropic-ai/sdk";
const anthropic = new Anthropic();
const files = await anthropic.beta.files.list({
betas: ["files-api-2025-04-14"]
});
```
#### Get file metadata
Retrieve information about a specific file:
```bash Shell
curl https://api.anthropic.com/v1/files/file_011CNha8iCJcU1wXNR6q4V8w \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14"
```
```python Python
import anthropic
client = anthropic.Anthropic()
file = client.beta.files.retrieve_metadata("file_011CNha8iCJcU1wXNR6q4V8w")
```
```typescript TypeScript
import { Anthropic } from "@anthropic-ai/sdk";
const anthropic = new Anthropic();
const file = await anthropic.beta.files.retrieveMetadata(
"file_011CNha8iCJcU1wXNR6q4V8w",
{ betas: ["files-api-2025-04-14"] }
);
```
#### Delete a file
Remove a file from your workspace:
```bash Shell
curl -X DELETE https://api.anthropic.com/v1/files/file_011CNha8iCJcU1wXNR6q4V8w \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14"
```
```python Python
import anthropic
client = anthropic.Anthropic()
result = client.beta.files.delete("file_011CNha8iCJcU1wXNR6q4V8w")
```
```typescript TypeScript
import { Anthropic } from "@anthropic-ai/sdk";
const anthropic = new Anthropic();
const result = await anthropic.beta.files.delete(
"file_011CNha8iCJcU1wXNR6q4V8w",
{ betas: ["files-api-2025-04-14"] }
);
```
### Downloading a file
Download files that have been created by skills or the code execution tool:
```bash Shell
curl -X GET "https://api.anthropic.com/v1/files/file_011CNha8iCJcU1wXNR6q4V8w/content" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14" \
--output downloaded_file.txt
```
```python Python
import anthropic
client = anthropic.Anthropic()
file_content = client.beta.files.download("file_011CNha8iCJcU1wXNR6q4V8w")
# Save to file
with open("downloaded_file.txt", "w") as f:
f.write(file_content.decode("utf-8"))
```
```typescript TypeScript
import { Anthropic } from "@anthropic-ai/sdk";
import fs from "fs/promises";
const anthropic = new Anthropic();
const fileContent = await anthropic.beta.files.download(
"file_011CNha8iCJcU1wXNR6q4V8w",
{ betas: ["files-api-2025-04-14"] }
);
// Save to file
await fs.writeFile("downloaded_file.txt", fileContent);
```
You can only download files that were created by [skills](/docs/en/build-with-claude/skills-guide) or the [code execution tool](/docs/en/agents-and-tools/tool-use/code-execution-tool). Files that you uploaded cannot be downloaded.
---
## File storage and limits
### Storage limits
- **Maximum file size:** 500 MB per file
- **Total storage:** 100 GB per organization
### File lifecycle
- Files are scoped to the workspace of the API key. Other API keys can use files created by any other API key associated with the same workspace
- Files persist until you delete them
- Deleted files cannot be recovered
- Files are inaccessible via the API shortly after deletion, but they may persist in active `Messages` API calls and associated tool uses
- Files that users delete will be deleted in accordance with our [data retention policy](https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data).
---
## Error handling
Common errors when using the Files API include:
- **File not found (404):** The specified `file_id` doesn't exist or you don't have access to it
- **Invalid file type (400):** The file type doesn't match the content block type (e.g., using an image file in a document block)
- **Exceeds context window size (400):** The file is larger than the context window size (e.g. using a 500 MB plaintext file in a `/v1/messages` request)
- **Invalid filename (400):** Filename doesn't meet the length requirements (1-255 characters) or contains forbidden characters (`<`, `>`, `:`, `"`, `|`, `?`, `*`, `\`, `/`, or unicode characters 0-31)
- **File too large (413):** File exceeds the 500 MB limit
- **Storage limit exceeded (403):** Your organization has reached the 100 GB storage limit
```json
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "File not found: file_011CNha8iCJcU1wXNR6q4V8w"
}
}
```
## Usage and billing
File API operations are **free**:
- Uploading files
- Downloading files
- Listing files
- Getting file metadata
- Deleting files
File content used in `Messages` requests are priced as input tokens. You can only download files created by [skills](/docs/en/build-with-claude/skills-guide) or the [code execution tool](/docs/en/agents-and-tools/tool-use/code-execution-tool).
### Rate limits
During the beta period:
- File-related API calls are limited to approximately 100 requests per minute
- [Contact us](mailto:sales@anthropic.com) if you need higher limits for your use case
---
## Upload
**post** `/v1/files`
Upload File
### Header Parameters
- `"anthropic-beta": optional array of AnthropicBeta`
Optional header to specify the beta version(s) you want to use.
- `UnionMember0 = string`
- `UnionMember1 = "message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 17 more`
- `"message-batches-2024-09-24"`
- `"prompt-caching-2024-07-31"`
- `"computer-use-2024-10-22"`
- `"computer-use-2025-01-24"`
- `"pdfs-2024-09-25"`
- `"token-counting-2024-11-01"`
- `"token-efficient-tools-2025-02-19"`
- `"output-128k-2025-02-19"`
- `"files-api-2025-04-14"`
- `"mcp-client-2025-04-04"`
- `"mcp-client-2025-11-20"`
- `"dev-full-thinking-2025-05-14"`
- `"interleaved-thinking-2025-05-14"`
- `"code-execution-2025-05-22"`
- `"extended-cache-ttl-2025-04-11"`
- `"context-1m-2025-08-07"`
- `"context-management-2025-06-27"`
- `"model-context-window-exceeded-2025-08-26"`
- `"skills-2025-10-02"`
- `"fast-mode-2026-02-01"`
### Returns
- `FileMetadata = object { id, created_at, filename, 4 more }`
- `id: string`
Unique object identifier.
The format and length of IDs may change over time.
- `created_at: string`
RFC 3339 datetime string representing when the file was created.
- `filename: string`
Original filename of the uploaded file.
- `mime_type: string`
MIME type of the file.
- `size_bytes: number`
Size of the file in bytes.
- `type: "file"`
Object type.
For files, this is always `"file"`.
- `"file"`
- `downloadable: optional boolean`
Whether the file can be downloaded.
### Example
```http
curl https://api.anthropic.com/v1/files?beta=true \
-H 'Content-Type: multipart/form-data' \
-H 'anthropic-version: 2023-06-01' \
-H 'anthropic-beta: files-api-2025-04-14' \
-H "X-Api-Key: $ANTHROPIC_API_KEY" \
-F 'file=@/path/to/file'
```
---
## List
**get** `/v1/files`
List Files
### Query Parameters
- `after_id: optional string`
ID of the object to use as a cursor for pagination. When provided, returns the page of results immediately after this object.
- `before_id: optional string`
ID of the object to use as a cursor for pagination. When provided, returns the page of results immediately before this object.
- `limit: optional number`
Number of items to return per page.
Defaults to `20`. Ranges from `1` to `1000`.
### Header Parameters
- `"anthropic-beta": optional array of AnthropicBeta`
Optional header to specify the beta version(s) you want to use.
- `UnionMember0 = string`
- `UnionMember1 = "message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 17 more`
- `"message-batches-2024-09-24"`
- `"prompt-caching-2024-07-31"`
- `"computer-use-2024-10-22"`
- `"computer-use-2025-01-24"`
- `"pdfs-2024-09-25"`
- `"token-counting-2024-11-01"`
- `"token-efficient-tools-2025-02-19"`
- `"output-128k-2025-02-19"`
- `"files-api-2025-04-14"`
- `"mcp-client-2025-04-04"`
- `"mcp-client-2025-11-20"`
- `"dev-full-thinking-2025-05-14"`
- `"interleaved-thinking-2025-05-14"`
- `"code-execution-2025-05-22"`
- `"extended-cache-ttl-2025-04-11"`
- `"context-1m-2025-08-07"`
- `"context-management-2025-06-27"`
- `"model-context-window-exceeded-2025-08-26"`
- `"skills-2025-10-02"`
- `"fast-mode-2026-02-01"`
### Returns
- `data: array of FileMetadata`
List of file metadata objects.
- `id: string`
Unique object identifier.
The format and length of IDs may change over time.
- `created_at: string`
RFC 3339 datetime string representing when the file was created.
- `filename: string`
Original filename of the uploaded file.
- `mime_type: string`
MIME type of the file.
- `size_bytes: number`
Size of the file in bytes.
- `type: "file"`
Object type.
For files, this is always `"file"`.
- `"file"`
- `downloadable: optional boolean`
Whether the file can be downloaded.
- `first_id: optional string`
ID of the first file in this page of results.
- `has_more: optional boolean`
Whether there are more results available.
- `last_id: optional string`
ID of the last file in this page of results.
### Example
```http
curl https://api.anthropic.com/v1/files?beta=true \
-H 'anthropic-version: 2023-06-01' \
-H 'anthropic-beta: files-api-2025-04-14' \
-H "X-Api-Key: $ANTHROPIC_API_KEY"
```
---
## Download
**get** `/v1/files/{file_id}/content`
Download File
### Path Parameters
- `file_id: string`
ID of the File.
### Header Parameters
- `"anthropic-beta": optional array of AnthropicBeta`
Optional header to specify the beta version(s) you want to use.
- `UnionMember0 = string`
- `UnionMember1 = "message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 17 more`
- `"message-batches-2024-09-24"`
- `"prompt-caching-2024-07-31"`
- `"computer-use-2024-10-22"`
- `"computer-use-2025-01-24"`
- `"pdfs-2024-09-25"`
- `"token-counting-2024-11-01"`
- `"token-efficient-tools-2025-02-19"`
- `"output-128k-2025-02-19"`
- `"files-api-2025-04-14"`
- `"mcp-client-2025-04-04"`
- `"mcp-client-2025-11-20"`
- `"dev-full-thinking-2025-05-14"`
- `"interleaved-thinking-2025-05-14"`
- `"code-execution-2025-05-22"`
- `"extended-cache-ttl-2025-04-11"`
- `"context-1m-2025-08-07"`
- `"context-management-2025-06-27"`
- `"model-context-window-exceeded-2025-08-26"`
- `"skills-2025-10-02"`
- `"fast-mode-2026-02-01"`
### Example
```http
curl https://api.anthropic.com/v1/files/$FILE_ID/content?beta=true \
-H 'anthropic-version: 2023-06-01' \
-H 'anthropic-beta: files-api-2025-04-14' \
-H "X-Api-Key: $ANTHROPIC_API_KEY"
```
---
## Download
**get** `/v1/files/{file_id}/content`
Download File
### Path Parameters
- `file_id: string`
ID of the File.
### Header Parameters
- `"anthropic-beta": optional array of AnthropicBeta`
Optional header to specify the beta version(s) you want to use.
- `UnionMember0 = string`
- `UnionMember1 = "message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 17 more`
- `"message-batches-2024-09-24"`
- `"prompt-caching-2024-07-31"`
- `"computer-use-2024-10-22"`
- `"computer-use-2025-01-24"`
- `"pdfs-2024-09-25"`
- `"token-counting-2024-11-01"`
- `"token-efficient-tools-2025-02-19"`
- `"output-128k-2025-02-19"`
- `"files-api-2025-04-14"`
- `"mcp-client-2025-04-04"`
- `"mcp-client-2025-11-20"`
- `"dev-full-thinking-2025-05-14"`
- `"interleaved-thinking-2025-05-14"`
- `"code-execution-2025-05-22"`
- `"extended-cache-ttl-2025-04-11"`
- `"context-1m-2025-08-07"`
- `"context-management-2025-06-27"`
- `"model-context-window-exceeded-2025-08-26"`
- `"skills-2025-10-02"`
- `"fast-mode-2026-02-01"`
### Example
```http
curl https://api.anthropic.com/v1/files/$FILE_ID/content?beta=true \
-H 'anthropic-version: 2023-06-01' \
-H 'anthropic-beta: files-api-2025-04-14' \
-H "X-Api-Key: $ANTHROPIC_API_KEY"
```