---
title: "List projects"
method: GET
path: "/projects"
tags: ["Projects"]
---

# List projects

`GET /projects`

## Request

- Base URL: `https://elicit.com/api/v2`
- URL: `https://elicit.com/api/v2/projects`
- Auth: HTTP bearer

Returns the projects you own and those shared with you, most recently updated first. A project shared with you is listed as soon as it is shared — you do not have to open it in the web interface first.

Default page size 50, maximum 100. `totalCount` counts every project you can see, not the page.

Routine listing uses the reader (`consistency=eventual`, also the default) and can lag recent writes. For recovery after a project-create timeout, explicitly request `consistency=strong` to read from the writer. Keep that consistency on every page. This is read-after-write recovery, not an idempotency guarantee or a frozen snapshot.

`nextCursor` is the last project on the page, and the ordering is by `updatedAt`, so a cursor is only valid against a stable set: paging again after that project was deleted or unshared returns `400`, and a project updated between two requests moves to the front, where a later page will not show it. For a consistent snapshot, page through without pausing, or restart from the first page.

### Example

```bash
curl https://elicit.com/api/v2/projects \
  -H "Authorization: Bearer elk_live_your_key_here"
```

## Query parameters

- `consistency` 'eventual' | 'strong': Read consistency. Omit or use eventual for routine reader-backed listing, which may lag recent writes. Use strong for writer-consistent recovery after a project-create timeout; keep the same consistency on every page. Strong reads do not make project creation idempotent.
- `limit` integer: Maximum number of projects to return (default: 50, max: 100)
- `cursor` string: Pagination cursor from a previous response's nextCursor. Omit for the first page. The cursor is the id of the last project on the previous page, and the list is ordered by `updatedAt`, so it is only stable while the set is: if that project is deleted or unshared before you page again the request returns 400, and a project updated between pages moves to the front and can be missed. Restart from the first page if either matters.

## Response `200`

One page of projects.

- ListProjectsResponse
  - `projects` Project[], required: Projects you own and projects shared with you, most recently updated first.
    - `id` string, uuid, required: The project ID (UUID) from `GET /projects` or `POST /projects`
    - `name` string, required: Project name.
    - `goal` string, required: The project's stated goal; empty string when none was set.
    - `role` 'owner' | 'writer' | 'reader', required: Your access level on this project. `owner`: you created it, and you alone can share it. `writer`: you can add and remove its contents. `reader`: you can view it.
    - `owner` object, required: Who owns the project. On your own projects, that is you.
      - `email` string, required
      - `fullName` string, nullable, required
    - `createdAt` string, required
    - `updatedAt` string, required: Last change to the project or its contents. Lists are ordered by this, newest first.
    - `url` string, required: URL to open this project in the Elicit web interface.
    - `links` object, required
      - `self` string, required: API URL of this project.
      - `shares` string, required: API URL of this project's shares.
  - `nextCursor` string, nullable, required: Pass as `?cursor=` to fetch the next page; null on the last page.
  - `totalCount` integer, required: Total projects you can see, across all pages.

## Other responses

- `400`: A malformed id, or an unknown or invalid query parameter or body key.
- `401`: Authentication failed. The API key is missing, invalid, revoked, or expired.
- `403`: API access is not available on your current plan. Upgrade to Pro or above to use the API.
- `429`: Rate limit exceeded. More than 100 requests per minute were received from your IP address; further requests are blocked for 5 minutes.
- `500`: An unexpected error occurred. Retry reads with backoff; before retrying a write, check whether it took effect. See Error Handling for retry guidance.

## Changes

- **2026-10-19** `01e18335df05`: 1 info
  - added the new optional `query` request parameter `consistency`
- **2026-10-16** `22847bf7e65d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/elicitlabs/apis/elicit-labs-api/changes/projects/get.md)

---

[API](https://skmtc.dev/elicitlabs/apis/elicit-labs-api.md) - [All operations](https://skmtc.dev/elicitlabs/apis/elicit-labs-api/llms.txt) - [OpenAPI document](https://skmtc.dev/elicitlabs/apis/elicit-labs-api/revisions/cbbe29509d04?raw)
