---
title: "Get systematic review status and results"
method: GET
path: "/sessions/systematic-reviews/{sessionId}"
tags: ["Systematic Reviews"]
---

# Get systematic review status and results

`GET /sessions/systematic-reviews/{sessionId}`

## Request

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

Poll the status of a systematic review created via `POST /api/v2/sessions/systematic-reviews`.

### Status transitions

- **processing** — the pipeline is running. Watch progress at `url`.
- **pausedForInsufficientQuota** — the account exceeded its usage limit mid-run. The review stays paused until resumed via the `links.resume` URL (or the Elicit web interface) once the limit is resolved.
- **completed** — the pipeline finished. Stage-organized exports appear under `data`. Only stages that actually ran are included.
- **failed** — something went wrong. The `error` field contains details. `data` may still contain exports for stages that completed before the failure.
- **unknown** — status is not tracked (legacy or user-created).

### Response shape

`data` can include stage outputs before `status: "completed"`. `exportsStatus` describes cache availability, not whether every completed stage has been exported:

- `ready` — a cached export manifest was served. It can be stale and omit newly completed stages; missing URLs do not prove that a stage did not run.
- `generating` — exports are being generated and no cached downloads are available yet. Poll again later.
- `unavailable` — export generation is temporarily unavailable. Retry the GET later; this is separate from the research session's `status`.

Poll every 30–60 seconds while processing. If the session is paused for insufficient quota, resolve the usage limit and POST to `links.resume` instead of continuing to poll for completion.

**After completion, repoll for missing expected exports even when `exportsStatus` is `ready`.** Wait at least 60 seconds before fetching this endpoint again: a manifest younger than the 60-second cooldown can be served without checking newly completed stages. Older cached manifests can also be served while another request regenerates exports or when regeneration or session-state loading fails. There is no fixed freshness guarantee. Check `dataFreshness` to detect an unchanged cache, but do not treat its timestamp alone as proof that every stage is exported. Use bounded retries with backoff; if expected URLs remain missing, report incomplete export availability rather than assuming the stages never ran.

- `data.search.{csv,xlsx}` — gather-stage paper list.
- `data.screen.{csv,xlsx}` — abstract-screening results.
- `data.fulltext.{csv,xlsx}` — fulltext-screening results (only when fulltext screening is configured).
- `data.extract.{csv,xlsx}` — extraction-stage results.
- `data.report` — structured content under `result`, plus optional `pdf` / `docx` / `txt` (APA reference list) / `bib` (BibTeX) / `ris` presigned download URLs.

All stage URLs are presigned for 7 days and serve with `Content-Disposition: attachment` so browser downloads land with the canonical filename.

`dataFreshness` is the ISO timestamp of the cached export manifest used for this response, or `null` when no timestamp is available for the returned data. It is not the session's completion time or a guarantee of current exports.

### Including the full report body

By default, `data.report.result.reportBody` and `data.report.result.abstract` are omitted to keep responses light. Append `?include=reportBody` to include them.

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

Systematic review status, available stage results, and export availability.

- SystematicReviewSessionDetail
  - `type` 'systematicReview', 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. 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 → screening_fulltext → extracting_data → generating_report → done. Null when the stage isn't known — treat it as unknown, not as not-started.
  - `url` string, required: URL to view the review in the Elicit web interface
  - `isPublic` boolean, required: Whether the review is publicly accessible via its URL without authentication
  - `error` object: Error details, only present when status is failed
    - `code` string, required: Machine-readable error code
    - `message` string, required: Human-readable error message
  - `data` ReviewData
    - `search` StageData
      - `csv` string, uri, required: Presigned URL for the CSV export. Expires in 7 days.
      - `xlsx` string, uri, required: Presigned URL for the XLSX export. Expires in 7 days.
    - `screen` StageData
      - `csv` string, uri, required: Presigned URL for the CSV export. Expires in 7 days.
      - `xlsx` string, uri, required: Presigned URL for the XLSX export. Expires in 7 days.
    - `fulltext` StageData
      - `csv` string, uri, required: Presigned URL for the CSV export. Expires in 7 days.
      - `xlsx` string, uri, required: Presigned URL for the XLSX export. Expires in 7 days.
    - `extract` StageData
      - `csv` string, uri, required: Presigned URL for the CSV export. Expires in 7 days.
      - `xlsx` string, uri, required: Presigned URL for the XLSX export. Expires in 7 days.
    - `report` ReportData
      - `result` ReviewResult, required
        - `title` string, required: Auto-generated title
        - `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.
      - `pdf` string, uri: Presigned URL for the report PDF. Expires in 7 days.
      - `docx` string, uri: Presigned URL for the report DOCX. Expires in 7 days.
      - `txt` string, uri: Presigned URL for an APA-style plain-text reference list of the papers synthesized in the report. Expires in 7 days.
      - `bib` string, uri: Presigned URL for a BibTeX bibliography of the papers synthesized in the report. Expires in 7 days.
      - `ris` string, uri: Presigned URL for a RIS bibliography of the papers synthesized in the report. Expires in 7 days.
  - `dataFreshness` string, nullable, required: ISO timestamp of the cached export manifest used for this response, or null when no timestamp is available for the returned data. An unchanged timestamp can indicate a stale cache; the timestamp alone does not guarantee that every completed stage is exported.
  - `exportsStatus` 'ready' | 'generating' | 'unavailable', required: Availability of cached export download URLs in `data`. `ready`: a cached manifest was served; it can be stale, including during regeneration or failures, and does not guarantee a complete current export set. If expected URLs are missing, repoll after at least 60 seconds with bounded backoff, even after completion. `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; structured report content may still be available.
  - `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.
- `403`: API access is not available on your current plan. Upgrade to Pro or above to use the API.
- `404`: Review 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/systematic-reviews/: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)
