---
title: "Adding Memories"
description: "Learn how to add content to supermemory"
icon: "plus"
---
1. **Content Organization**
- **Use `containerTags` for grouping/partitioning**
- Optional tags (array of strings) to group memories.
- Can be a user ID, project ID, or any other identifier.
- Allows filtering for memories that share specific tags.
- Example: `["user_123", "project_alpha"]`
Read more about [filtering](/memory-api/features/filtering)
2. **Performance Tips**
- **Batch Operations**
- You can add multiple items in parallel
- Use different `containerTags` for different spaces
- Don't wait for processing to complete unless needed
- **Search Optimization**
```json
{
"q": "error logs",
"documentThreshold": 0.7, // Higher = more precise
"limit": 5, // Keep it small
"onlyMatchingChunks": true // Skip extra context if not needed
}
```
3. **URL Content**
- Send clean URLs without tracking parameters
- Use article URLs, not homepage URLs
- Check URL accessibility before sending
## Basic Usage
To add a memory, send a POST request to `/add` with your content:
```bash cURL
curl https://api.supermemory.ai/v3/documents \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY' \
--data '{
"customId": "xyz-my-db-id",
"content": "This is the content of my memory",
"metadata": {
"category": "technology",
"tag_1": "ai",
"tag_2": "machine-learning",
},
"containerTags": ["user_123", "project_xyz"]
}'
```
```typescript Typescript
await client.memory.create({
customId: "xyz-mydb-id",
content: "This is the content of my memory",
metadata: {
category: "technology",
tag_1": "ai",
tag_2": "machine-learning",
},
containerTags: ["user_123", "project_xyz"]
})
```
```python Python
client.memory.create(
customId="xyz-mydb-id",
content="documents related to python",
metadata={
"category": "datascience",
"tag_1": "ai",
"tag_2": "machine-learning",
},
containerTags=["user_123", "project_xyz"]
)
```
The API will return a response with an ID and initial status:
```json
{
"id": "mem_abc123",
"status": "queued"
}
```
```bash cURL
curl https://api.supermemory.ai/v3/documents \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY' \
-d '{
"content": "https://example.com/article",
"metadata": {
"source": "web", # Just example metadata
"category": "technology" # NOT required
},
"containerTags": ["user_456", "research_papers"]
}'
```
```typescript Typescript
await client.memory.create({
content: "https://example.com/article",
userId: "user_456",
metadata: {
source: "web", // Just example metadata
category: "technology", // NOT required
},
containerTags: ["user_456", "research_papers"],
});
```
```python Python
client.memory.create(
content="https://example.com/article",
userId="user_456",
metadata={
"source": "web",
"category": "technology"
},
containerTags=["user_456", "research_papers"]
)
```
## Metadata and Organization
You can add rich metadata to organize your content:
```json
{
"metadata": {
"source": "string", // String
"priority": 1234, // Custom numeric field
"custom_field": "any" // Any custom field
}
}
```
## Partitioning by user
You can attribute and partition your data by providing a `userId`:
```bash cURL
curl https://api.supermemory.ai/v3/documents \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY' \
-d '{
"content": "This is space-specific content",
"userId": "space_123",
"metadata": {
"category": "space-content"
}
}'
```
```typescript Typescript
await client.memory.create({
content: "This is space-specific content",
userId: "space_123",
metadata: {
category: "space-content",
},
});
```
```python Python
client.memory.create(
content="This is space-specific content",
userId="space_123",
metadata={
"category": "space-content"
}
)
```
When searching, if you provide a `userId`, only memories from that space will
be returned.
## Grouping
You can group memories by providing an array of `containerTags`:
```bash cURL
curl https://api.supermemory.ai/v3/documents \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY' \
-d '{
"content": "This is space-specific content",
"containerTags": ["user_123", "project_xyz"]
}'
```
```typescript Typescript
await client.memory.create({
content: "This is space-specific content",
containerTags: ["user_123", "project_xyz"],
});
```
```python Python
client.memory.create(
content="This is space-specific content",
containerTags=["user_123", "project_xyz"]
)
```
## Checking Status
Check status using the memory ID:
```bash cURL
curl https://api.supermemory.ai/v3/documents/mem_abc123 \
--request GET \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY'
```
```typescript Typescript
await client.memory.get("mem_abc123");
```
```python Python
client.memory.get("mem_abc123")
```
Memories are deleted after 2 minutes if an irrecoverable error occurs.
## File Uploads
For file uploads, use the dedicated file upload endpoint. You can include `containerTags` directly in the form data:
```bash cURL
curl https://api.supermemory.ai/v3/documents/file \
--request POST \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY' \
--form 'file=@/path/to/your/file.pdf' \
--form 'containerTags=["user_123", "project_xyz"]'
```
```typescript Typescript
const formData = new FormData();
formData.append("file", fileBlob);
formData.append("containerTags", JSON.stringify(["user_123", "project_xyz"]));
const response = await fetch("https://api.supermemory.ai/v3/documents/file", {
method: "POST",
headers: {
Authorization: "Bearer SUPERMEMORY_API_KEY",
},
body: formData,
});
```
```python Python
import requests
import json
with open('/path/to/your/file.pdf', 'rb') as f:
files = {'file': f}
data = {'containerTags': json.dumps(["user_123", "project_xyz"])}
response = requests.post(
'https://api.supermemory.ai/v3/documents/file',
headers={'Authorization': 'Bearer SUPERMEMORY_API_KEY'},
files=files,
data=data
)
```
### Adding Additional Metadata to Files
If you need to add additional metadata (like title or description) after upload, you can use the PATCH endpoint:
```bash cURL
curl https://api.supermemory.ai/v3/documents/MEMORY_ID \
--request PATCH \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SUPERMEMORY_API_KEY' \
--data '{
"metadata": {
"title": "My Document",
"description": "Important project document"
}
}'
```
```typescript Typescript
await fetch(`https://api.supermemory.ai/v3/documents/${memoryId}`, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer SUPERMEMORY_API_KEY",
},
body: JSON.stringify({
metadata: {
title: "My Document",
description: "Important project document",
},
}),
});
```
```python Python
import requests
requests.patch(
f'https://api.supermemory.ai/v3/documents/{memory_id}',
headers={
'Content-Type': 'application/json',
'Authorization': 'Bearer SUPERMEMORY_API_KEY'
},
json={
'metadata': {
'title': 'My Document',
'description': 'Important project document'
}
}
)
```
The file upload endpoint returns immediately with a memory ID and processing
status. The file will be processed asynchronously, and you can check its
status using the GET endpoint.
## Next Steps
Explore more advanced features in our API Reference tab.