> ## Documentation Index
> Fetch the complete documentation index at: https://animus.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Content

> Save, retrieve, and manage content in your library

## Save content

<ParamField body="url" type="string" required>
  The URL to save. Supports articles, tweets, YouTube videos, Reddit posts, and more.
</ParamField>

<ParamField body="collectionId" type="string">
  Optional collection ID to add the content to after saving.
</ParamField>

<ParamField body="tags" type="string[]">
  Optional tags to attach to the content. Tags are normalized to lowercase with dashes replacing spaces.
</ParamField>

```bash theme={null}
POST /api/v1/content
```

Save a URL to your library. Animus automatically processes and analyzes the content.

**Scope:** `write`

```bash theme={null}
curl -X POST https://api.animus.so/api/v1/content \
  -H "Authorization: Bearer anm_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/article"}'
```

**Response** `200`

```json theme={null}
{
  "success": true,
  "message": "Processing content...",
  "userContentId": "550e8400-e29b-41d4-a716-446655440000"
}
```

If the URL was already saved, the response includes `"duplicate": true`. If you don't have enough credits, the content may be saved as a bookmark without AI analysis — the response will include `"savedAsBookmark": true` with a `"bookmarkReason": "no_credits"`.

***

## List recent content

```bash theme={null}
GET /api/v1/content/recent
```

Returns your most recently saved content, ordered by save date.

**Scope:** `read`

| Parameter | Type    | Default      | Description                                     |
| --------- | ------- | ------------ | ----------------------------------------------- |
| `limit`   | integer | `20`         | Items per page (1-50)                           |
| `offset`  | integer | `0`          | Offset for pagination (0-10000)                 |
| `sort`    | string  | `created_at` | Sort by: `created_at`, `updated_at`, or `title` |

```bash theme={null}
curl "https://api.animus.so/api/v1/content/recent?limit=10" \
  -H "Authorization: Bearer anm_your_key"
```

**Response** `200`

```json theme={null}
{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "url": "https://example.com/article",
      "thumbnailUrl": null,
      "platform": "web",
      "savedAt": "2025-01-15T10:30:00.000Z",
      "tags": ["technology"],
      "isFavorite": false,
      "isArchived": false,
      "status": "ready",
      "title": "Article Title",
      "summary": "A brief summary...",
      "creator": null
    }
  ],
  "total": 142,
  "offset": 0,
  "limit": 10,
  "hasMore": true
}
```

<Note>`total` is only included on the first page (when `offset` is 0). Use `hasMore` for subsequent pagination.</Note>

***

## Get content detail

```bash theme={null}
GET /api/v1/content/:id
```

Returns full details for a specific content item, including AI-generated summary, key takeaways, entities, topics, and metadata.

**Scope:** `read`

| Parameter | Type   | Description                          |
| --------- | ------ | ------------------------------------ |
| `id`      | string | The content item ID (path parameter) |

```bash theme={null}
curl https://api.animus.so/api/v1/content/CONTENT_ID \
  -H "Authorization: Bearer anm_your_key"
```

**Response** `200`

```json theme={null}
{
  "content": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "url": "https://example.com/article",
    "thumbnailUrl": null,
    "platform": "web",
    "savedAt": "2025-01-15T10:30:00.000Z",
    "tags": ["technology", "ai"],
    "isFavorite": false,
    "isArchived": false,
    "status": "ready",
    "title": "Article Title",
    "summary": "A brief summary of the article...",
    "fullSummary": "A detailed multi-paragraph summary...",
    "keyTakeaways": ["Key point 1", "Key point 2"],
    "creator": null,
    "notes": null,
    "entities": [
      { "text": "OpenAI", "type": "organization" }
    ],
    "sentiment": { "label": "positive" },
    "topics": [
      { "name": "Artificial Intelligence", "category": "technology" }
    ],
    "specializedContent": null,
    "collections": [
      { "id": "uuid", "title": "Research" }
    ]
  },
  "specializedContent": null
}
```

<Note>The response is wrapped in a `content` object. AI-analyzed fields (`summary`, `keyTakeaways`, `entities`, etc.) are `null` while content is still processing or if it was saved as a bookmark. When `specializedContent` is present, it includes a `contentType` (e.g. `recipe`, `review`, `tutorial`), `readingTimeMinutes`, and the structured `data`.</Note>

***

## Get library statistics

```bash theme={null}
GET /api/v1/content/stats
```

Returns aggregate statistics about your library.

**Scope:** `read`

```bash theme={null}
curl https://api.animus.so/api/v1/content/stats \
  -H "Authorization: Bearer anm_your_key"
```

**Response** `200`

```json theme={null}
{
  "totalItems": 142,
  "collectionsCount": 8,
  "uncategorizedCount": 23,
  "archivedCount": 5,
  "deletedCount": 2,
  "bookmarkCount": 31
}
```

***

## List deleted content

```bash theme={null}
GET /api/v1/content/deleted
```

Returns content items in your trash. Same response shape as [list recent content](#list-recent-content).

**Scope:** `read`

```bash theme={null}
curl https://api.animus.so/api/v1/content/deleted \
  -H "Authorization: Bearer anm_your_key"
```

***

## Delete content

```bash theme={null}
DELETE /api/v1/content/:id
```

Moves a content item to the trash (soft delete). Can be restored within 30 days.

**Scope:** `write`

| Parameter | Type   | Description                          |
| --------- | ------ | ------------------------------------ |
| `id`      | string | The content item ID (path parameter) |

```bash theme={null}
curl -X DELETE https://api.animus.so/api/v1/content/CONTENT_ID \
  -H "Authorization: Bearer anm_your_key"
```

**Response:** `204 No Content`
