The Memory Router and Memory API share the same memory pool. When you use the same user_id, memories are automatically shared between both systems.

How They Work Together

Key Insight: Both the Router and API access the same memories when using identical user_id values. This enables powerful hybrid implementations.

Shared Memory Pool

# Memory created via API
from supermemory import Client

api_client = Client(api_key="YOUR_SUPERMEMORY_KEY")

# Add memory via API
api_client.memories.add({
    "content": "User prefers Python over JavaScript for backend development",
    "user_id": "user123"
})

# Later, in your chat application using Router
from openai import OpenAI

router_client = OpenAI(
    api_key="YOUR_OPENAI_KEY",
    base_url="https://api.supermemory.ai/v3/https://api.openai.com/v1/",
    default_headers={
        "x-supermemory-api-key": "YOUR_SUPERMEMORY_KEY",
        "x-sm-user-id": "user123"  # Same user_id
    }
)

# Router automatically has access to the API-created memory
response = router_client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "What language should I use for my new backend?"}]
)
# Response will consider the Python preference

Pre-load Context via API

Use the API to add documents and context before conversations:
# Step 1: Load user's documents via API
api_client.memories.add({
    "content": "https://company.com/product-docs.pdf",
    "user_id": "support_agent_123",
    "metadata": {"type": "product_documentation"}
})

# Step 2: Support agent uses chat with Router
router_client = OpenAI(
    base_url="https://api.supermemory.ai/v3/https://api.openai.com/v1/",
    default_headers={"x-sm-user-id": "support_agent_123"}
)

# Agent has automatic access to product docs
response = router_client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "How does the enterprise pricing work?"}]
)

Best Practices

1. Consistent User IDs

Always use the same user_id format across both systems:
# ✅ Good - consistent user_id
api_client.memories.add({"user_id": "user_123"})
router_headers = {"x-sm-user-id": "user_123"}

# ❌ Bad - inconsistent user_id
api_client.memories.add({"user_id": "user-123"})
router_headers = {"x-sm-user-id": "user_123"}  # Different format!

2. Use Container Tags for Organization

# API: Add memories with tags
api_client.memories.add({
    "content": "Q3 revenue report",
    "user_id": "analyst_1",
    "containerTag": "financial_reports"
})

# Router: Memories are automatically organized
# The Router will intelligently retrieve from the right containers

3. Leverage Each System’s Strengths

Use CaseBest ChoiceWhy
Chat conversationsRouterAutomatic context management
Document uploadAPIBatch processing, custom IDs
Search & filterAPIAdvanced query capabilities
Quick prototypesRouterZero code changes
Memory managementAPIFull CRUD operations