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

# Projects

## Create a project

<br />

```
POST /projects
```

Start a new project. The agent begins working immediately.

### Request body

| Parameter         | Type      | Required | Description                                                                                                                                                                                                                                                                             |
| ----------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `brief`           | string    | Yes      | Creative direction for the agent. Max 8,000 characters.                                                                                                                                                                                                                                 |
| `title`           | string    | No       | Project title. Max 30 characters.                                                                                                                                                                                                                                                       |
| `mode`            | string    | No       | `autonomous` (default) or `collaborative`.                                                                                                                                                                                                                                              |
| `aspect_ratio`    | string    | No       | `16:9` (default), `9:16`, `1:1`, or `21:9`.                                                                                                                                                                                                                                             |
| `skills`          | string\[] | No       | Skills to activate on this project. Each entry is an Eversince skill (`cinema`, `animation`, `ugc`, `music`, `photography`, `motion-graphics`) or a custom-skill UUID from `GET /account/skills`. Stack freely up to the 40,000-token combined budget. Omit or pass `[]` for no skills. |
| `video_model`     | string    | No       | Default video model ID. Agent selects if not set.                                                                                                                                                                                                                                       |
| `image_model`     | string    | No       | Default image model ID. Agent selects if not set.                                                                                                                                                                                                                                       |
| `agent_model`     | string    | No       | One of `opus-4.7`, `opus-4.6`, `sonnet-4.6`.                                                                                                                                                                                                                                            |
| `reasoning_mode`  | string    | No       | `thinking` (default) — deeper reasoning. `fast` — quicker turns.                                                                                                                                                                                                                        |
| `webhook_url`     | string    | No       | HTTPS URL for status change notifications.                                                                                                                                                                                                                                              |
| `idempotency_key` | string    | No       | Prevent duplicate projects on retries. Max 256 characters.                                                                                                                                                                                                                              |
| `references`      | array     | No       | Reference media. See below.                                                                                                                                                                                                                                                             |
| `extract_content` | boolean   | No       | Extract content from reference URLs. Default `true`.                                                                                                                                                                                                                                    |

### References

Each reference is either an uploaded file or a URL:

```json theme={"dark"}
[
  { "upload_id": "upl_abc123" },
  { "url": "https://example.com/image.jpg", "type": "image" },
  { "url": "https://youtube.com/watch?v=...", "type": "url" }
]
```

Reference types: `image`, `video`, `audio`, `url`. Max 10 references per request, max 3 URL references.

### Response `202`

```json theme={"dark"}
{
  "id": "proj_abc123",
  "status": "queued",
  "mode": "autonomous",
  "project_url": null,
  "credits_balance": 1450,
  "created_at": "2025-03-15T10:30:00Z"
}
```

### Example

<CodeGroup>
  ```bash curl theme={"dark"}
  curl -X POST https://eversince.ai/api/v1/projects \
    -H "Authorization: Bearer $EVERSINCE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "brief": "Your brief here",
      "mode": "autonomous"
    }'
  ```

  ```python Python theme={"dark"}
  resp = requests.post(f"{BASE}/projects", headers=headers, json={
      "brief": "Your brief here",
      "mode": "autonomous"
  })
  project = resp.json()
  ```

  ```javascript JavaScript theme={"dark"}
  const project = await fetch(`${BASE}/projects`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      brief: "Your brief here",
      mode: "autonomous",
    }),
  }).then((r) => r.json());
  ```
</CodeGroup>

<Note>
  If you include an `idempotency_key` and a non-failed project already exists for that key, the endpoint returns `200` with a different response shape:

  ```json theme={"dark"}
  {
    "id": "proj_abc123",
    "status": "running",
    "message": "Project already exists for this idempotency key"
  }
  ```
</Note>

## Adopt a project

<br />

```
POST /projects/adopt
```

Adopt an existing studio project for API management.

### Request body

| Parameter    | Type   | Required | Description                                |
| ------------ | ------ | -------- | ------------------------------------------ |
| `project_id` | string | Yes      | ID of the studio project to adopt.         |
| `mode`       | string | No       | `autonomous` or `collaborative` (default). |

### Response `201`

Returned when the project is newly adopted.

```json theme={"dark"}
{
  "id": "proj_abc123",
  "status": "idle",
  "mode": "collaborative",
  "project_url": "https://eversince.ai/app/projects/..."
}
```

### Response `200`

Returned when the project has already been adopted.

```json theme={"dark"}
{
  "id": "proj_abc123",
  "status": "idle",
  "mode": "collaborative",
  "project_url": "https://eversince.ai/app/projects/...",
  "message": "Project already adopted"
}
```

## List projects

<br />

```
GET /projects
```

| Parameter | Type    | Default | Description                         |
| --------- | ------- | ------- | ----------------------------------- |
| `limit`   | integer | 20      | Results per page. 1–100.            |
| `offset`  | integer | 0       | Pagination offset.                  |
| `status`  | string  |         | Filter by status.                   |
| `title`   | string  |         | Search by title (case-insensitive). |

### Response `200`

```json theme={"dark"}
{
  "projects": [
    {
      "id": "proj_abc123",
      "source_project_id": null,
      "status": "idle",
      "mode": "autonomous",
      "title": "My Project",
      "brief": "Your brief here...",
      "assembled_url": "https://...",
      "project_url": "https://eversince.ai/app/projects/...",
      "created_at": "2025-03-15T10:30:00Z",
      "updated_at": "2025-03-15T10:35:00Z"
    }
  ],
  "total": 42,
  "limit": 20,
  "offset": 0
}
```

The `brief` field is truncated to 200 characters in list responses. The `source_project_id` field indicates the original studio project when a project was adopted via the API.

## Get project status

<br />

```
GET /projects/:id
```

Returns the current status, agent message, and output URLs.

### Response `200`

```json theme={"dark"}
{
  "id": "proj_abc123",
  "status": "idle",
  "mode": "autonomous",
  "output_type": "assembled",
  "assembled_url": "https://...",
  "assembled_url_expires_at": "2025-03-16T10:30:00Z",
  "project_url": "https://eversince.ai/app/projects/...",
  "agent_message": "Your project is complete. 4 scenes ready for review...",
  "variation_id": "var_xyz",
  "created_at": "2025-03-15T10:30:00Z",
  "updated_at": "2025-03-15T10:35:00Z"
}
```

| Field             | Description                                                                                                                                  |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `output_type`     | `assembled` (rendered video available), `assets` (standalone assets, no render needed), or `pending` (still in progress).                    |
| `assembled_url`   | URL of the rendered video. Expires after 24 hours. Render again or create a [share link](/api/output#create-share-link) for a permanent URL. |
| `agent_message`   | The agent's last message. In collaborative mode, this contains what the agent wants feedback on.                                             |
| `credits_warning` | Present when balance is below 100 credits.                                                                                                   |
| `variation_id`    | The currently active variation.                                                                                                              |
| `error_message`   | Present when status is `failed`.                                                                                                             |

## Update project settings

<br />

```
PATCH /projects/:id/settings
```

Update project configuration. Blocked while the agent is actively running (`running`, `generating`, `rendering`).

### Request body

All fields are optional. Only include fields you want to change.

| Parameter        | Type         | Description                                                                                                                                                                                                                                     |
| ---------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `title`          | string\|null | Project title. Max 30 characters. Set to `null` to clear.                                                                                                                                                                                       |
| `mode`           | string       | `autonomous`, `collaborative`, or `none` (hand project to studio).                                                                                                                                                                              |
| `video_model`    | string       | Default video model ID.                                                                                                                                                                                                                         |
| `image_model`    | string       | Default image model ID.                                                                                                                                                                                                                         |
| `agent_model`    | string       | One of `opus-4.7`, `opus-4.6`, `sonnet-4.6`.                                                                                                                                                                                                    |
| `reasoning_mode` | string       | `thinking` (default) — deeper reasoning. `fast` — quicker turns.                                                                                                                                                                                |
| `skills`         | string\[]    | Replace the active skill set. Each entry is an Eversince skill slug (`cinema`, `animation`, `ugc`, `music`, `photography`, `motion-graphics`) or a custom-skill UUID. Pass `[]` to clear. Combined token budget across active skills is 40,000. |
| `webhook_url`    | string\|null | Webhook URL. Set to `null` to remove.                                                                                                                                                                                                           |

### Response `200`

```json theme={"dark"}
{
  "title": "My Project",
  "mode": "collaborative",
  "aspect_ratio": "16:9",
  "video_model": "seedance-2.0",
  "image_model": "nano-banana-pro",
  "agent_model": "sonnet-4.6",
  "reasoning_mode": "thinking",
  "skills": ["skill-cinema"],
  "webhook_url": "https://your-server.com/webhooks/eversince"
}
```

## Cancel a project

<br />

```
POST /projects/:id/cancel
```

Stop the agent. Valid when status is `queued`, `running`, `generating`, or `idle`. Generations already in progress at the provider level will still complete, but the agent won't continue to the next step.

### Response `200`

```json theme={"dark"}
{
  "id": "proj_abc123",
  "status": "cancelled"
}
```

## Send a message

<br />

```
POST /projects/:id/messages
```

Send feedback or direction to the agent. Valid when the project is `idle`, `completed`, `cancelled`, or `failed`. Returns 400 if the agent is still actively working (`running`, `generating`, `rendering`). Requires at least 10 credits.

### Request body

| Parameter         | Type    | Required | Description                                          |
| ----------------- | ------- | -------- | ---------------------------------------------------- |
| `message`         | string  | Yes      | Your feedback or direction. Max 8,000 characters.    |
| `references`      | array   | No       | Reference media (same format as project creation).   |
| `extract_content` | boolean | No       | Extract content from reference URLs. Default `true`. |

### Response `202`

```json theme={"dark"}
{
  "id": "proj_abc123",
  "status": "running"
}
```

The agent resumes work with your feedback.

### Example

<CodeGroup>
  ```bash curl theme={"dark"}
  curl -X POST https://eversince.ai/api/v1/projects/proj_abc123/messages \
    -H "Authorization: Bearer $EVERSINCE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "message": "The music is too intense. Make it more subtle and add a female voiceover."
    }'
  ```

  ```python Python theme={"dark"}
  resp = requests.post(f"{BASE}/projects/{project_id}/messages",
      headers=headers,
      json={"message": "The music is too intense. Make it more subtle and add a female voiceover."})
  ```

  ```javascript JavaScript theme={"dark"}
  await fetch(`${BASE}/projects/${project.id}/messages`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      message: "The music is too intense. Make it more subtle and add a female voiceover.",
    }),
  });
  ```
</CodeGroup>

## Get messages

<br />

```
GET /projects/:id/messages
```

Retrieve conversation history.

| Parameter | Type    | Default | Description                                             |
| --------- | ------- | ------- | ------------------------------------------------------- |
| `limit`   | integer | 20      | Messages per page. 1–50.                                |
| `after`   | string  |         | Message ID cursor. Returns messages newer than this ID. |
| `before`  | string  |         | Message ID cursor. Returns messages older than this ID. |

### Response `200`

```json theme={"dark"}
{
  "messages": [
    {
      "id": "msg_001",
      "role": "user",
      "content": "Your brief here.",
      "source": "chat",
      "created_at": "2025-03-15T10:30:00Z"
    },
    {
      "id": "msg_002",
      "role": "assistant",
      "content": "I've created a 4-scene project ready for review...",
      "source": "chat",
      "created_at": "2025-03-15T10:32:00Z"
    }
  ],
  "has_more": false
}
```

<Tip>
  Use the `after` cursor for efficient polling. Store the last message ID you've seen and pass it as `?after=msg_002` to get only new messages.
</Tip>
