---
title: "List sessions in a project"
method: GET
path: "/projects/{projectId}/sessions"
tags: ["Projects"]
---

# List sessions in a project

`GET /projects/{projectId}/sessions`

## Request

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

Lists the project's sessions that are readable through the public API, newest first. Requires access to the project as an owner, reader, or writer (including organization access). A missing, trashed, deleted, or inaccessible project returns `404 project_not_found`.

This is the intersection of project contents and your API-visible sessions: reports and systematic reviews must be owned by you; research-agent sessions must be owned by you or shared directly with you. Project access alone does not grant session access on this API. The result can therefore contain fewer sessions than the project's web interface.

Supports the same `type`, `status`, `source`, `limit`, and `cursor` parameters and `sessions`, `nextCursor`, `totalCount` response as `GET /sessions`. Default page size 50, maximum 100. Membership and filters apply before pagination and counting; `totalCount` is the matching total across all pages. Pass `nextCursor` as `cursor` until it is null. Unknown query parameters return 400.

Only supported session types are included: reports, systematic reviews, and top-level research-agent sessions. Removed/deleted sessions, subagents, files, artifacts, and collections are excluded. Both notebook and imported review project entries are supported.

### Example

```bash
curl "https://elicit.com/api/v2/projects/{projectId}/sessions?limit=100" \
  -H "Authorization: Bearer elk_live_your_key_here"
```

## Path parameters

- `projectId` string, uuid, required: The project ID (UUID) from `GET /projects` or `POST /projects`

## Query parameters

- `limit` integer: Maximum number of sessions to return (default: 50, max: 100)
- `cursor` string: Opaque pagination cursor from a previous response's nextCursor field. Omit for the first page.
- `source` 'user' | 'api' | 'mcp' | 'agent_session': Filter by how the session was created
- `type` 'report' | 'systematicReview' | 'agent': Filter to a single session type
- `status` 'processing' | 'pausedForInsufficientQuota' | 'completed' | 'failed' | 'unknown': Filter by session status

## Response `200`

One page of API-visible sessions in the project.

- ListSessionsResponse
  - `sessions` SessionListItem[], required: Reports, systematic reviews, and research-agent sessions interleaved, ordered by creation date (newest first)
    - `type` 'report' | 'systematicReview' | 'agent', required: Which kind of session this is; use it to pick the matching typed get endpoint
    - `sessionId` string, uuid, required: The session ID (UUID) returned by the create endpoints and `GET /sessions`
    - `status` 'processing' | 'pausedForInsufficientQuota' | 'completed' | 'failed' | 'unknown', required: Current status of the report
    - `executionStage` 'gathering_sources' | 'screening_abstract' | 'screening_fulltext' | 'extracting_data' | 'generating_report' | 'done' | 'null', nullable: Current pipeline stage, or null when not yet known. Omitted entirely for agent sessions, which have no pipeline stages.
    - `title` string, required: Report title (the research question)
    - `url` string, required: URL to view the report in the Elicit web interface
    - `source` 'user' | 'api' | 'mcp' | 'agent_session', required: How the report was created
    - `createdAt` string, required: ISO 8601 timestamp of when the report was created
    - `isPublic` boolean, required: Whether the report is publicly accessible via its URL without authentication
    - `role` 'owner' | 'shared': The caller's relationship to this session: "owner" for a session the caller created, or "shared" for an agent session another user shared with them read-only. Reports and systematic reviews are always "owner".
    - `links` SessionLinks, required
      - `self` string, required: API URL for this session's full status and results (the typed get endpoint for its type)
      - `resume` string: API URL to resume this session. Present only while the session is paused for insufficient quota. Only the owner can use it; a shared recipient receives 404 even when this link is present.
  - `nextCursor` string, nullable, required: Opaque cursor for the next page; pass it back as `cursor`. Null if there are no more results.
  - `totalCount` integer, required: Total sessions matching the filters 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.
- `404`: The project does not exist, or is not visible to you at the access this call needs.
- `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-16** `22847bf7e65d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/elicitlabs/apis/elicit-labs-api/changes/projects/:projectId/sessions/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)
