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

# Account

> Credits, skills, memories, learned preferences, API keys, and share links.

## Get credit balance

<br />

```
GET /account/credits
```

### Response `200`

```json theme={"dark"}
{
  "credits_balance": 1450
}
```

## Get credit packages

<br />

```
GET /account/credit-packages
```

Returns available top-up packages with purchase links.

### Response `200`

```json theme={"dark"}
{
  "credits_balance": 1450,
  "has_subscription": true,
  "subscription_required": false,
  "packages": [
    {
      "id": "1k",
      "credits": 1000,
      "price": "$15",
      "price_cents": 1500,
      "purchase_url": "https://eversince.ai/app/subscription?buy=1k"
    },
    {
      "id": "4k",
      "credits": 4000,
      "price": "$50",
      "price_cents": 5000,
      "purchase_url": "https://eversince.ai/app/subscription?buy=4k"
    }
  ]
}
```

## Skills

Skills are persistent instructions that shape agent behavior across all projects. Use them for brand guidelines, style rules, or domain-specific knowledge.

### List skills

```
GET /account/skills
```

Returns available skills, both Eversince skills (built by Eversince) and custom skills.

#### Response `200`

```json theme={"dark"}
{
  "skills": [
    {
      "id": "skill-cinema",
      "name": "Cinema",
      "is_active": false,
      "source": "eversince",
      "description": "Story-driven filmmaking with shot design, camera movement, and emotional pacing.",
      "tokens": 26000
    },
    {
      "id": "skill_001",
      "name": "Brand Guidelines",
      "is_active": true,
      "source": "user",
      "tokens": 113,
      "sort_order": 0
    }
  ],
  "budget": {
    "used": 113,
    "limit": 40000
  }
}
```

### Create a skill

```
POST /account/skills
```

| Parameter      | Type    | Required | Description                                                                                                                 |
| -------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
| `name`         | string  | Yes      | Skill name. Max 100 characters.                                                                                             |
| `instructions` | string  | Yes      | What the agent should know or do. No per-skill cap. Active skills share a 40,000-token budget (roughly 160,000 characters). |
| `is_active`    | boolean | No       | Enable immediately. Default `true`.                                                                                         |

#### Response `201`

```json theme={"dark"}
{
  "skill": {
    "id": "skill_002",
    "name": "Brand Guidelines",
    "instructions": "Always use warm color palettes. Brand voice is confident but approachable...",
    "is_active": true,
    "source": "user",
    "characters": 450,
    "sort_order": 1,
    "created_at": "2025-03-15T10:30:00Z",
    "updated_at": "2025-03-15T10:30:00Z"
  },
  "budget": {
    "used": 113,
    "limit": 40000
  }
}
```

#### Example

<CodeGroup>
  ```bash curl theme={"dark"}
  curl -X POST https://eversince.ai/api/v1/account/skills \
    -H "Authorization: Bearer $EVERSINCE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Brand Guidelines",
      "instructions": "Brand: Acme Corp. Colors: deep navy (#1a237e) and warm gold (#ffd54f). Voice: confident, modern, never corporate. Always end with the tagline. Product shots should emphasize materials and craftsmanship.",
      "is_active": true
    }'
  ```

  ```python Python theme={"dark"}
  skill = requests.post(f"{BASE}/account/skills", headers=headers, json={
      "name": "Brand Guidelines",
      "instructions": "Brand: Acme Corp. Colors: deep navy (#1a237e) and warm gold (#ffd54f). Voice: confident, modern, never corporate. Always end with the tagline. Product shots should emphasize materials and craftsmanship.",
      "is_active": True
  }).json()
  ```

  ```javascript JavaScript theme={"dark"}
  const skill = await fetch(`${BASE}/account/skills`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      name: "Brand Guidelines",
      instructions:
        "Brand: Acme Corp. Colors: deep navy (#1a237e) and warm gold (#ffd54f). Voice: confident, modern, never corporate. Always end with the tagline. Product shots should emphasize materials and craftsmanship.",
      is_active: true,
    }),
  }).then((r) => r.json());
  ```
</CodeGroup>

### Get a skill

```
GET /account/skills/:id
```

Returns full skill details including instructions.

#### Response `200`

Custom skill:

```json theme={"dark"}
{
  "skill": {
    "id": "skill_001",
    "name": "Brand Guidelines",
    "instructions": "Always use warm color palettes...",
    "is_active": true,
    "source": "user",
    "characters": 450,
    "sort_order": 0,
    "created_at": "2025-03-15T10:30:00Z",
    "updated_at": "2025-03-15T10:30:00Z"
  }
}
```

Eversince skill:

```json theme={"dark"}
{
  "skill": {
    "id": "skill-cinema",
    "name": "Cinema",
    "is_active": false,
    "source": "eversince",
    "description": "Story-driven filmmaking with shot design, camera movement, and emotional pacing."
  }
}
```

### Update a skill

```
PATCH /account/skills/:id
```

Update a custom skill's name, instructions, or active state. For Eversince skills, only `is_active` can be toggled.

| Parameter      | Type    | Description                                                                    |
| -------------- | ------- | ------------------------------------------------------------------------------ |
| `name`         | string  | New name. Max 100 characters.                                                  |
| `instructions` | string  | New instructions. No per-skill cap. Active skills share a 40,000-token budget. |
| `is_active`    | boolean | Enable or disable.                                                             |

#### Response `200`

Custom skill update returns the skill with updated budget:

```json theme={"dark"}
{
  "skill": {
    "id": "skill_002",
    "name": "Updated Name",
    "instructions": "Updated instructions...",
    "is_active": true,
    "source": "user",
    "characters": 230,
    "sort_order": 1,
    "created_at": "2025-03-15T10:30:00Z",
    "updated_at": "2025-03-16T08:00:00Z"
  },
  "budget": {
    "used": 58,
    "limit": 40000
  }
}
```

Eversince skill toggle returns the skill without budget:

```json theme={"dark"}
{
  "skill": {
    "id": "skill-cinema",
    "name": "Cinema",
    "is_active": true,
    "source": "eversince"
  }
}
```

### Delete a skill

```
DELETE /account/skills/:id
```

Only custom skills can be deleted.

#### Response `200`

```json theme={"dark"}
{
  "deleted": true
}
```

<Note>
  Skills stack freely. Multiple skills can be active at once. Active skills (Eversince + custom) share a combined budget of 40,000 tokens. The agent receives all active skill instructions as part of its context.
</Note>

## Learned preferences

The agent learns your patterns across projects. Style tendencies, brand preferences, production habits. These persist across all projects.

### Get preferences

```
GET /account/learned-preferences
```

#### Response `200`

```json theme={"dark"}
{
  "content": "Prefers warm color grading. Favors cinematic aspect ratios...",
  "enabled": true,
  "characters": 340
}
```

### Update preferences

```
PUT /account/learned-preferences
```

| Parameter | Type    | Description                            |
| --------- | ------- | -------------------------------------- |
| `content` | string  | Updated preferences text.              |
| `enabled` | boolean | Enable or disable preference learning. |

#### Response `200`

```json theme={"dark"}
{
  "content": "Prefers warm color grading. Favors cinematic aspect ratios.",
  "enabled": true,
  "characters": 340
}
```

## Memories

Short user-authored facts the agent reads at runtime — preferred voice, recurring brand details, audience, anything you want carried across all projects. Lighter-weight than skills: use memories for one-line facts, skills for full instructions. Active memories share a 10,000-character budget.

### List memories

```
GET /account/memories
```

#### Response `200`

```json theme={"dark"}
{
  "memories": [
    {
      "id": "mem_001",
      "title": "Preferred voiceover",
      "body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise.",
      "is_active": true,
      "sort_order": 0,
      "characters": 67,
      "created_at": "2026-03-15T10:30:00Z",
      "updated_at": "2026-03-15T10:30:00Z"
    }
  ],
  "budget": {
    "used": 67,
    "limit": 10000
  }
}
```

### Create a memory

```
POST /account/memories
```

| Parameter   | Type    | Required | Description                                                                                |
| ----------- | ------- | -------- | ------------------------------------------------------------------------------------------ |
| `title`     | string  | Yes      | Short label. Max 100 characters.                                                           |
| `body`      | string  | Yes      | Memory content. Up to 10,000 characters. Active memories share a 10,000-char total budget. |
| `is_active` | boolean | No       | Enable immediately. Default `true`.                                                        |

If `is_active` is true and the new body would push active memories past 10,000 chars, the request returns `400`.

#### Response `201`

```json theme={"dark"}
{
  "memory": {
    "id": "mem_002",
    "title": "Audience",
    "body": "Indie film festivals and creative directors at boutique agencies.",
    "is_active": true,
    "sort_order": 1,
    "characters": 64,
    "created_at": "2026-03-15T10:35:00Z",
    "updated_at": "2026-03-15T10:35:00Z"
  },
  "budget": {
    "used": 131,
    "limit": 10000
  }
}
```

#### Example

<CodeGroup>
  ```bash curl theme={"dark"}
  curl -X POST https://eversince.ai/api/v1/account/memories \
    -H "Authorization: Bearer $EVERSINCE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "title": "Preferred voiceover",
      "body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise."
    }'
  ```

  ```python Python theme={"dark"}
  memory = requests.post(f"{BASE}/account/memories", headers=headers, json={
      "title": "Preferred voiceover",
      "body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise."
  }).json()
  ```

  ```javascript JavaScript theme={"dark"}
  const memory = await fetch(`${BASE}/account/memories`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      title: "Preferred voiceover",
      body: "Use Adam (warm, mid-tempo) for all narration unless asked otherwise.",
    }),
  }).then((r) => r.json());
  ```
</CodeGroup>

### Get a memory

```
GET /account/memories/:id
```

#### Response `200`

```json theme={"dark"}
{
  "memory": {
    "id": "mem_001",
    "title": "Preferred voiceover",
    "body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise.",
    "is_active": true,
    "sort_order": 0,
    "characters": 67,
    "created_at": "2026-03-15T10:30:00Z",
    "updated_at": "2026-03-15T10:30:00Z"
  }
}
```

### Update a memory

```
PATCH /account/memories/:id
```

Provide at least one of `title`, `body`, `is_active`. Activating a memory that would push active memories past the 10,000-char budget returns `400`.

| Parameter   | Type    | Description                      |
| ----------- | ------- | -------------------------------- |
| `title`     | string  | New title. Max 100 characters.   |
| `body`      | string  | New body. Max 10,000 characters. |
| `is_active` | boolean | Toggle on or off.                |

#### Response `200`

```json theme={"dark"}
{
  "memory": {
    "id": "mem_001",
    "title": "Preferred voiceover",
    "body": "Use Adam (warm, mid-tempo). Slow pacing for product shots.",
    "is_active": true,
    "sort_order": 0,
    "characters": 58,
    "created_at": "2026-03-15T10:30:00Z",
    "updated_at": "2026-03-15T11:00:00Z"
  },
  "budget": {
    "used": 122,
    "limit": 10000
  }
}
```

### Delete a memory

```
DELETE /account/memories/:id
```

#### Response `200`

```json theme={"dark"}
{
  "deleted": true
}
```

## API keys

### Create a key

```
POST /keys
```

| Parameter | Type   | Required | Description                           |
| --------- | ------ | -------- | ------------------------------------- |
| `name`    | string | Yes      | Descriptive name. Max 100 characters. |

#### Response `201`

```json theme={"dark"}
{
  "id": "key_001",
  "name": "Production",
  "key": "es_live_a1b2c3d4e5f6...",
  "key_prefix": "es_live_a1b2",
  "created_at": "2025-03-15T10:30:00Z",
  "message": "Store this key securely. It will not be shown again."
}
```

<Warning>
  The full key is only returned once at creation. Store it securely.
</Warning>

### List keys

```
GET /keys
```

Returns keys with prefix only (for identification).

#### Response `200`

```json theme={"dark"}
{
  "keys": [
    {
      "id": "key_001",
      "name": "Production",
      "key_prefix": "es_live_a1b2",
      "last_used_at": "2025-03-20T14:00:00Z",
      "created_at": "2025-03-15T10:30:00Z"
    }
  ]
}
```

### Revoke a key

```
DELETE /keys/:id
```

Immediately invalidates the key. Max 10 keys per account.

#### Response `200`

```json theme={"dark"}
{
  "id": "key_001",
  "revoked": true
}
```

## Share links

### List shares

```
GET /account/shares
```

| Parameter | Type    | Default | Description             |
| --------- | ------- | ------- | ----------------------- |
| `limit`   | integer | 10      | Results per page. 1–50. |
| `offset`  | integer | 0       | Pagination offset.      |

#### Response `200`

```json theme={"dark"}
{
  "shares": [
    {
      "share_url": "https://eversince.ai/share/abc123",
      "video_url": "https://...",
      "title": "My Project",
      "aspect_ratio": "16:9",
      "view_count": 42,
      "created_at": "2025-03-15T10:30:00Z"
    }
  ],
  "total": 3,
  "total_views": 156,
  "has_more": false
}
```

## Submit feedback

```
POST /feedback
```

Report bugs or suggest improvements.

| Parameter    | Type   | Required | Description                          |
| ------------ | ------ | -------- | ------------------------------------ |
| `type`       | string | Yes      | `bug`, `suggestion`, or `question`.  |
| `message`    | string | Yes      | Your feedback. Max 5,000 characters. |
| `project_id` | string | No       | Related project ID.                  |

#### Response `201`

```json theme={"dark"}
{
  "received": true
}
```
