---
title: "Retrieve a library source"
method: GET
path: "/library/sources/{sourceId}"
tags: ["Library"]
---

# Retrieve a library source

`GET /library/sources/{sourceId}`

## Request

- Base URL: `https://elicit.com/api/v2`
- URL: `https://elicit.com/api/v2/library/sources/{sourceId}`
- Auth: HTTP bearer

Retrieves a source by id. Includes a nullable `download` object with `downloadUrl`, `expiresAt`, `filename`, and `contentType` for the original stored PDF, even before parsing finishes. It is null when no stored PDF exists or a download URL is temporarily unavailable. The URL expires after 30 minutes; call this tool again for a fresh URL. Fetch `download.downloadUrl` with `curl -L --fail --output paper.pdf '<downloadUrl>'`, without an Authorization header.

`fullTextStatus` values: `pending`, Elicit has not finished looking for a PDF; `available`, full text is ready; `unavailable`, no PDF was found.

### Example

```bash
curl https://elicit.com/api/v2/library/sources/{sourceId} \
  -H "Authorization: Bearer elk_live_your_key_here"
```

## Path parameters

- `sourceId` string, uuid, required

## Response `200`

The source.

- GetLibrarySourceResponse
  - `id` string, uuid, required: Stable id of the source.
  - `title` string, nullable, required
  - `authors` string[], required
  - `year` integer, nullable, required
  - `venue` string, nullable, required
  - `abstract` string, nullable, required: Abstract as markdown.
  - `doi` string, nullable, required
  - `url` string, nullable, required
  - `elicitId` string, nullable, required: Elicit corpus id, present once the paper has been matched to the corpus.
  - `pdfUrls` string[], required
  - `collectionIds` string[], required: Collections this source belongs to that are visible to you.
  - `role` 'writer' | 'reader', required: Your role on this source: `writer` for your own sources and for a shared collection's papers when you own or can edit that collection; `reader` for a shared collection's papers you can only view. Any role can read the source and use it in reviews. Writers edit metadata, attach a PDF, delete, and add to collections.
  - `fullTextStatus` 'pending' | 'available' | 'unavailable', required: Whether parsed full text is attached: pending — a PDF is still parsing, or none has been looked for yet; available — parsed and attached; unavailable — looked for, none found.
  - `createdAt` string, required
  - `updatedAt` string, required
  - `links` object, required
    - `self` string, required: API URL of this source.
    - `fullText` string, required: API URL of the parsed full text; 404s until fullTextStatus is available.
  - `download` object, nullable, required: Download details for the original PDF; null when no stored PDF exists or a download URL is temporarily unavailable. URLs expire after 30 minutes; retrieve the source again for a fresh URL.
    - `downloadUrl` string, uri, required: Presigned URL for the original PDF. Fetch without an Authorization header.
    - `expiresAt` string, date-time, required
    - `filename` string, required
    - `contentType` 'application/pdf', required

## Other responses

- `400`: A malformed id, or an unknown or invalid query parameter.
- `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 source does not exist or is not visible to you.
- `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-22** `78db836edb9c`: 1 info
  - added the required property `download` to the response with the `200` status
- **2026-10-13** `27c80b9a3470`: 5 info
  - added the optional property `error/details` to the response with the `400` status
  - added the optional property `error/details` to the response with the `401` status
  - added the optional property `error/details` to the response with the `403` status
  - added the optional property `error/details` to the response with the `404` status
  - …1 more
- **2026-09-27** `9b5b75b828ab`: 5 info
  - added the optional property `error/sessionId` to the response with the `400` status
  - added the optional property `error/sessionId` to the response with the `401` status
  - added the optional property `error/sessionId` to the response with the `403` status
  - added the optional property `error/sessionId` to the response with the `404` status
  - …1 more
- **2026-09-15** `69b6844982c1`: 1 breaking, 1 info
  - removed the required property `ownedByMe` from the response with the `200` status
  - added the required property `role` to the response with the `200` status
- **2026-09-11** `acdbab329322`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/elicit/apis/elicit-api/changes/library/sources/:sourceId/get.md)

---

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