supermemory/apps/docs/ingestion/document-operations.mdx
MaheshtheDev 672defc08b docs: move SDK snippets to the shipped v5 call shape and finish the namespace rename (#1772)
Rewrites 339 TypeScript calls across 50 pages from the rc.5 `method({ namespace, body })` form to the shipped `method(namespace, { ... })` form, and aligns field names with the live v5 spec: `attach` to `include`, `authUrl` to `authorization`, `lastSync` to `latestRun`, `deletedCount` to `count`, and the paginated `namespaces.list()`.

Renames container tags to namespaces across concepts, connectors, integrations and snippets. The namespace pages keep container tag in the description, search keywords and a rename note so old searches still land, and the v3 reference page points at v5.

The migration guide's SDK table now covers both 5.0.0 SDKs, and the SDK integration page uses the real client options (`baseUrl`, `timeoutInSeconds`, `maxRetries`) and error classes.
2026-10-06 17:06:38 +00:00

325 lines
8.9 KiB
Text

---
title: "Document operations"
sidebarTitle: "Documents"
description: "List, get, update, and delete your ingested documents"
icon: "/icons/hugeicons/files-02.svg"
---
Manage documents after ingestion using the SDK. Every call is scoped to one `namespace` (what v3/v4 called a container tag).
## List documents
Retrieve paginated documents with filtering. One `list` call serves documents, chunks, and memories; pick with `type`.
<Tabs>
<Tab title="TypeScript">
```typescript
const { documents } = await supermemory.list("user_123", "documents", {
limit: 10,
});
documents.forEach(d => {
console.log(d.id, d.title, d.system.status);
});
```
</Tab>
<Tab title="Python">
```python
page = client.list("user_123", "documents", limit=10)
for doc in page.documents:
print(doc.id, doc.title, doc.system.status)
```
</Tab>
<Tab title="cURL">
```bash
curl -X POST "https://api.supermemory.ai/ns/user_123/list/documents?limit=10" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
```
</Tab>
</Tabs>
**Response:**
```json
{
"documents": [
{
"id": "doc_abc123",
"title": "Meeting notes",
"type": "text",
"metadata": { "source": "slack" },
"system": {
"status": "done",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}
}
],
"chunks": [],
"memories": [],
"pagination": {
"currentPage": 1,
"limit": 10,
"totalItems": 25,
"totalPages": 3
}
}
```
Every response contains `documents`, `chunks`, `memories`, and `pagination`. Only the array for the requested `type` is filled.
### Parameters
`namespace` and `type` are required. Pagination and sorting are query parameters (top-level keys in the SDK); `filter` goes in `body`.
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `type` | string | required | `documents`, `chunks`, or `memories` |
| `limit` | number | 10 | Items per page |
| `page` | number | 1 | Page number |
| `sort` | string | `createdAt` | Sort by `createdAt`, `updatedAt`, or `position` |
| `order` | string | `desc` | `desc` (newest) or `asc` (oldest) |
| `body.filter` | object | — | Metadata filter. See [Organizing & Filtering](/concepts/filtering) |
<Accordion title="Pagination example">
```typescript
async function getAllDocuments(namespace: string) {
const all = [];
let page = 1;
while (true) {
const { documents, pagination } = await supermemory.list(namespace, "documents", {
limit: 100,
page,
});
all.push(...documents);
if (page >= pagination.totalPages) break;
page++;
}
return all;
}
```
</Accordion>
<Accordion title="Filter by metadata">
```typescript
const { documents } = await supermemory.list("user_123", "documents", {
filter: {
operator: "and",
operands: [
{ field: "status", operator: "eq", value: "reviewed" },
{ field: "priority", operator: "eq", value: "high" },
],
},
});
```
</Accordion>
---
## Get document
Get a specific document with its processing status. Pass `include` to include its chunks and memories.
<Tabs>
<Tab title="TypeScript">
```typescript
const doc = await supermemory.documents.get("user_123", "doc_abc123", {
include: ["chunks", "memories"], // optional
});
console.log(doc.system.status); // "queued" | "processing" | "done" | "failed"
console.log(doc.content);
```
</Tab>
<Tab title="Python">
```python
doc = client.documents.get(
"user_123",
"doc_abc123",
include=["chunks", "memories"], # optional
)
print(doc.system.status) # "queued" | "processing" | "done" | "failed"
print(doc.content)
```
</Tab>
<Tab title="cURL">
```bash
curl "https://api.supermemory.ai/ns/user_123/document/doc_abc123?include=chunks&include=memories" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY"
```
</Tab>
</Tabs>
The `id` may be the Supermemory document ID or the `id` you supplied at ingestion. It resolves only inside the namespace in the path.
### Processing status
| Status | Description |
|--------|-------------|
| `queued` | Waiting to process |
| `extracting` | Extracting content (OCR, transcription) |
| `chunking` | Breaking into searchable pieces |
| `embedding` | Creating vector representations |
| `done` | Ready for search |
| `failed` | Processing failed |
<Accordion title="Poll for completion">
```typescript
async function waitForProcessing(namespace: string, id: string) {
while (true) {
const doc = await supermemory.documents.get(namespace, id);
if (doc.system.status === "done") return doc;
if (doc.system.status === "failed") throw new Error("Processing failed");
await new Promise(r => setTimeout(r, 2000));
}
}
```
</Accordion>
---
## Update document
Update a document's content or metadata. **Content changes** trigger full reprocessing; **metadata-only changes** (e.g. updating `accepted`, `version`) do not reindex. The body accepts any non-empty subset of `content`, `metadata`, `supportingContext`, `group`, or `date`.
<Tabs>
<Tab title="TypeScript">
```typescript
await supermemory.documents.update("user_123", "doc_abc123", {
content: "Updated content here",
metadata: { version: 2, reviewed: true },
});
```
</Tab>
<Tab title="Python">
```python
client.documents.update(
"user_123",
"doc_abc123",
content="Updated content here",
metadata={"version": 2, "reviewed": True},
)
```
</Tab>
<Tab title="cURL">
```bash
curl -X PATCH "https://api.supermemory.ai/ns/user_123/document/doc_abc123" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "Updated content here", "metadata": {"version": 2}}'
```
</Tab>
</Tabs>
For file-backed documents use `documents.updateFile` (PATCH: partial, `file` optional, metadata merges key by key) or `documents.replaceWithFile` (POST: full replace, `file` required, omitted metadata keys are cleared).
```typescript
await supermemory.documents.updateFile("user_123", "doc_abc123", {
metadata: JSON.stringify({ reviewed: true }),
});
await supermemory.documents.replaceWithFile("user_123", "doc_abc123", {
file,
metadata: JSON.stringify({ revision: 2 }),
});
```
---
## Delete documents
Permanently remove documents. One call deletes 1 to 100 documents by Supermemory or caller-defined ID.
<Tabs>
<Tab title="TypeScript">
```typescript
// One or many
const { count, errors } = await supermemory.documents.delete("user_123", {
ids: ["doc_1", "doc_2", "doc_3"],
});
// Delete a whole namespace (all content for a user)
await supermemory.namespaces.delete("user_123");
```
</Tab>
<Tab title="Python">
```python
# One or many
result = client.documents.delete("user_123", ids=["doc_1", "doc_2", "doc_3"])
print(result.count, result.errors)
# Delete a whole namespace (all content for a user)
client.namespaces.delete("user_123")
```
</Tab>
<Tab title="cURL">
```bash
# One or many
curl -X DELETE "https://api.supermemory.ai/ns/user_123/document" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ids": ["doc_1", "doc_2", "doc_3"]}'
# Delete a whole namespace
curl -X DELETE "https://api.supermemory.ai/ns/user_123" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
```
</Tab>
</Tabs>
Inspect both `count` and per-ID `errors`; HTTP success can include partial failures.
<Warning>
Deletes are permanent — no recovery.
</Warning>
---
## Processing queue
There is no separate processing endpoint. List documents and read `system.status` on each item.
<Tabs>
<Tab title="TypeScript">
```typescript
const { documents } = await supermemory.list("user_123", "documents", {
limit: 100,
});
const processing = documents.filter(d => d.system.status !== "done" && d.system.status !== "failed");
console.log(`${processing.length} documents processing`);
```
</Tab>
<Tab title="Python">
```python
page = client.list("user_123", "documents", limit=100)
processing = [d for d in page.documents if d.system.status not in ("done", "failed")]
print(f"{len(processing)} documents processing")
```
</Tab>
<Tab title="cURL">
```bash
curl -X POST "https://api.supermemory.ai/ns/user_123/list/documents?limit=100" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
```
</Tab>
</Tabs>
---
## Next steps
- [Memory Operations](/recall/memory-operations) — Forget memories
- [Search](/recall/search) — Query your memories
- [Ingesting Content](/ingestion/add-memories) — Add new content