---
title: "S3 Connector"
description: "Connect Amazon S3 or S3-compatible storage to sync files into your Supermemory knowledge base"
icon: "database"
---
Connect Amazon S3 buckets or S3-compatible storage services (MinIO, DigitalOcean Spaces, Cloudflare R2, Tigris) to sync files into your Supermemory knowledge base.
The S3 connector requires a **Scale Plan** or higher. You can also create S3 connections directly from the [Supermemory Console](https://console.supermemory.ai).
## Quick Setup
```typescript
import Supermemory from 'supermemory';
const client = new Supermemory({
apiKey: process.env.SUPERMEMORY_API_KEY!
});
const connection = await client.connections.create('s3', {
metadata: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
bucket: 'my-documents-bucket',
region: 'us-east-1'
},
containerTag: 'org-123'
});
```
```python
from supermemory import Supermemory
import os
client = Supermemory(api_key=os.environ["SUPERMEMORY_API_KEY"])
connection = client.connections.create(
's3',
metadata={
'accessKeyId': os.environ["AWS_ACCESS_KEY_ID"],
'secretAccessKey': os.environ["AWS_SECRET_ACCESS_KEY"],
'bucket': 'my-documents-bucket',
'region': 'us-east-1'
},
container_tag='org-123'
)
```
```bash
curl -X POST "https://api.supermemory.ai/v3/connections/s3" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"bucket": "my-documents-bucket",
"region": "us-east-1"
},
"containerTag": "org-123"
}'
```
## Configuration Options
For S3, provider-specific connection fields are passed inside the top-level `metadata` object. General connection options stay top-level.
| Parameter | Location | Required | Description |
|-----------|----------|----------|-------------|
| `accessKeyId` | `metadata.accessKeyId` | Yes | AWS access key ID or S3-compatible service key |
| `secretAccessKey` | `metadata.secretAccessKey` | Yes | AWS secret access key |
| `bucket` | `metadata.bucket` | Yes | S3 bucket name |
| `region` | `metadata.region` | Yes | AWS region (e.g., `us-east-1`). Use `auto` for S3-compatible providers that don't expose AWS-style regions (MinIO, R2, Tigris). |
| `endpoint` | `metadata.endpoint` | No | Custom endpoint for S3-compatible services |
| `prefix` | `metadata.prefix` | No | Key prefix filter (e.g., `documents/`) |
| `containerTagRegex` | `metadata.containerTagRegex` | No | Regex to extract container tags from file paths |
| `containerTag` | top-level | No | Tag for organizing this connection |
| `documentLimit` | top-level | No | Maximum documents to sync (default: 10,000) |
In the Python SDK, use `container_tags` for the top-level option, but keep S3 metadata keys in camelCase: `accessKeyId`, `secretAccessKey`, and `containerTagRegex`.
## S3-Compatible Services
Use `metadata.endpoint` to connect to S3-compatible storage. These services don't use AWS-style regions, so set `metadata.region` to `auto` — the value is still required for request signing but the service ignores it.
```typescript
// MinIO
const connection = await client.connections.create('s3', {
metadata: {
accessKeyId: 'minio-key',
secretAccessKey: 'minio-secret',
bucket: 'my-bucket',
region: 'auto',
endpoint: 'https://minio.example.com'
},
containerTag: 'minio-sync'
});
```
Common S3-compatible endpoint values:
| Service | `metadata.endpoint` | `metadata.region` |
|---------|----------------------|-------------------|
| DigitalOcean Spaces | `https://nyc3.digitaloceanspaces.com` | `nyc3` |
| Cloudflare R2 | `https://.r2.cloudflarestorage.com` | `auto` |
| Tigris | `https://t3.storage.dev` | `auto` |
Cloudflare R2 example:
```typescript
const connection = await client.connections.create('s3', {
metadata: {
accessKeyId: process.env.R2_ACCESS_KEY_ID!,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
bucket: 'my-bucket',
region: 'auto',
endpoint: 'https://.r2.cloudflarestorage.com'
},
containerTag: 'r2-sync'
});
```
For S3-compatible services, `metadata.endpoint` is the base S3 endpoint. Do not include the bucket name in the endpoint URL; pass the bucket separately as `metadata.bucket`.
## Prefix Filtering
Sync only files within a specific path:
```typescript
const connection = await client.connections.create('s3', {
metadata: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
bucket: 'company-data',
region: 'us-east-1',
prefix: 'documents/engineering/' // Only syncs files under this path
},
containerTag: 'engineering-docs'
});
```
## Dynamic Container Tags
Extract container tags from S3 key paths for multi-tenant setups:
```typescript
const connection = await client.connections.create('s3', {
metadata: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
bucket: 'user-files',
region: 'us-east-1',
containerTagRegex: 'users/(?[^/]+)/'
},
containerTag: 'user-files'
});
// File: users/user-123/documents/notes.md → container tag: user-123
// File: users/user-456/reports/q4.pdf → container tag: user-456
```
The regex must contain a named capture group `(?...)` and be less than 200 characters.
## Connection Management
### Delete Connection
```typescript
await client.connections.deleteByID('conn_s3_abc123');
```
```bash
curl -X DELETE "https://api.supermemory.ai/v3/connections/conn_s3_abc123" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY"
```
By default, deleting a connection removes all synced documents from Supermemory. To keep documents, pass `deleteDocuments=false` as a query parameter: `DELETE /v3/connections/:id?deleteDocuments=false`
### Manual Sync
```typescript
await client.connections.import('s3', {
containerTags: ['org-123']
});
```
```bash
curl -X POST "https://api.supermemory.ai/v3/connections/s3/import" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"containerTags": ["org-123"]}'
```
## Sync Behavior
| Feature | Behavior |
|---------|----------|
| **Initial sync** | Fetches all files matching prefix filter |
| **Incremental sync** | Only files modified since last sync |
| **Sync schedule** | Every 4 hours + manual triggers |
| **Document limit** | 10,000 files per connection (default) |
## IAM Permissions
Minimum required permissions:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
]
}
]
}
```
## Error Codes
| Code | Message | Solution |
|------|---------|----------|
| 401 | Authentication failed | Verify access key and secret |
| 403 | Access denied | Check IAM permissions and bucket policy |
| 404 | Bucket not found | Verify bucket name and region |