--- 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.