---
title: "Get report status and results"
method: GET
path: "/sessions/reports/{sessionId}"
tags: ["Reports"]
---

# Get report status and results

`GET /sessions/reports/{sessionId}`

## Request

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

Poll the status of a report created via `POST /api/v2/sessions/reports`.

### Status transitions

- **processing** — Elicit is actively searching, screening, and extracting data. You can watch progress in real time at the `url`.
- **pausedForInsufficientQuota** — The account exceeded its usage limit mid-run. The report stays paused until resumed via the `links.resume` URL (or the Elicit web interface) once the limit is resolved.
- **completed** — The report is finished. The `result` field contains the report content.
- **failed** — Something went wrong. The `error` field contains details.
- **unknown** — Status is not tracked for this report (legacy or user-created reports).

### Polling recommendation

Poll every 30–60 seconds. Reports typically complete in 5–15 minutes depending on the number of papers.

### Including the full report body

By default, `result.reportBody` and `result.abstract` are omitted to keep polling responses lightweight. To include them, add `?include=reportBody` to the request.

### Download availability

Download URLs are optional and expire after 7 days; fetch this endpoint again for fresh URLs. `exportsStatus` describes the reference-list exports (`txtUrl`, `bibUrl`, `risUrl`), not PDF/DOCX. `ready` means a cached export manifest was served, which can be stale; it does not prove that missing formats have no export. `generating` or `unavailable` means no cached downloads can be served yet.

If expected reference-list URLs are missing, wait at least 60 seconds and repeat this GET, even after `status: "completed"` and `exportsStatus: "ready"`. Cached manifests are reused for a 60-second cooldown, and older manifests can also be served during generation or upstream failures. One retry is not a freshness guarantee: use bounded retries with backoff, then report that the expected downloads remain unavailable instead of concluding they do not exist.

### Example

```bash
# Poll for status
curl https://elicit.com/api/v2/sessions/reports/{sessionId} \
  -H "Authorization: Bearer elk_live_your_key_here"

# Fetch with full report body
curl "https://elicit.com/api/v2/sessions/reports/{sessionId}?include=reportBody" \
  -H "Authorization: Bearer elk_live_your_key_here"
```

## Path parameters

- `sessionId` string, uuid, required: The session ID (UUID) returned by the create endpoints and `GET /sessions`

## Query parameters

- `include` 'reportBody': Set to 'reportBody' to include the full report markdown and abstract in the response

## Response `200`

Report status and results (if completed).

- ReportSessionDetail
  - `type` 'report', required
  - `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. Transitions: processing ⇄ pausedForInsufficientQuota (paused when the account exceeds its usage limit; stays paused until explicitly resumed via the resume endpoint or the Elicit web interface), processing → completed/failed. Poll until completed or failed.
  - `executionStage` 'gathering_sources' | 'screening_abstract' | 'screening_fulltext' | 'extracting_data' | 'generating_report' | 'done' | 'null', nullable, required: Current pipeline stage. Advances through gathering_sources → screening_abstract → extracting_data → generating_report → done. Null for reports created before this field was introduced or when the stage isn't known.
  - `url` string, required: URL to view the report in the Elicit web interface
  - `isPublic` boolean, required: Whether the report is publicly accessible via its URL without authentication
  - `result` ReportResult
    - `title` string, required: Auto-generated title for the report
    - `summary` string, required: AI-generated executive summary of the findings
    - `reportBody` string, nullable: Full report content in markdown format. Only included when ?include=reportBody is specified.
    - `abstract` string, nullable: Report abstract in markdown format. Only included when ?include=reportBody is specified.
  - `error` object: Error details, only present when status is failed
    - `code` string, required: Machine-readable error code
    - `message` string, required: Human-readable error message
  - `pdfUrl` string, nullable: Pre-signed URL to download the report as PDF. Only present when status is completed and assets have been generated. Expires after 7 days — re-fetch the report for a fresh URL.
  - `docxUrl` string, nullable: Pre-signed URL to download the report as DOCX. Only present when status is completed and assets have been generated. Expires after 7 days — re-fetch the report for a fresh URL.
  - `txtUrl` string, nullable: Pre-signed URL to download the report's reference list as a plain-text (APA) file. Only present when status is completed and the report has a non-empty bibliography. Expires after 7 days — re-fetch the report for a fresh URL.
  - `bibUrl` string, nullable: Pre-signed URL to download the report's references as a BibTeX (.bib) file. Only present when status is completed and the report has a non-empty bibliography. Expires after 7 days — re-fetch the report for a fresh URL.
  - `risUrl` string, nullable: Pre-signed URL to download the report's references as an RIS (.ris) file. Only present when status is completed and the report has a non-empty bibliography. Expires after 7 days — re-fetch the report for a fresh URL.
  - `exportsStatus` 'ready' | 'generating' | 'unavailable': Availability of cached reference-list exports (`txtUrl`/`bibUrl`/`risUrl`); `pdfUrl`/`docxUrl` are unaffected. Only present when status is completed. `ready`: a cached manifest was served, which can be stale; missing URLs do not prove a format has no export. Repoll after at least 60 seconds for expected missing URLs, using bounded retries with backoff. `generating`: exports are being generated and no cached downloads can be served. `unavailable`: export generation or retrieval failed and no cached downloads can be served.
  - `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.

## Other responses

- `400`: The request body, query parameters, or path ID failed validation.
- `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`: Report not found, has a different session type, or belongs to a different user. A malformed session ID returns 400.
- `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/sessions/reports/:sessionId/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)
