---
title: "Read EDMS documents in a project (subject to change)"
method: GET
path: "/projects/{projectId}/items/documents"
tags: ["Documents", "Preview"]
---

# Read EDMS documents in a project (subject to change)

`GET /projects/{projectId}/items/documents`

## Request

- Base URL: `https://app.ketryx.com/api/v1`
- URL: `https://app.ketryx.com/api/v1/projects/{projectId}/items/documents`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/ketryx/apis/ketryx-api/docs/projects/:projectId/items/documents/get.ts> (a function with typed inputs; its response is checked against the schema)

Documents are items, so a document ID is an item ID. There is no document-specific history endpoint: read a document's revisions from `GET /projects/{projectId}/items/{itemId}/records`, passing the document ID as the item ID.

## Path parameters

- `projectId` string, required: Ketryx ID of the project, e.g., `KXPRJ12345`

## Query parameters

- `startAt` integer: Index to start at. Defaults to 0.
- `maxResults` integer: Maximum number of results to return
- `folderPath` string: Path of the containing EDMS folder, with `/` separating folder names. Empty for the project root.

## Response `200`

Successful response

- object
  - `startAt` integer, required: Index that the pagination started at
  - `maxResults` integer, required: Maximum number of results returned
  - `documents` object[], required: List of documents
    - `id` string, required: Ketryx ID of the document item, e.g., `KXITM12345`
    - `title` string, required: Title of the document, per its current record
    - `type` string, required: Document type by its user-facing label in this organization
    - `folderPath` string, required: Path of the containing EDMS folder, with `/` separating folder names. Empty for the project root.
    - `createdAt` string, date-time, required: Document creation date and time
    - `isDeleted` boolean, required: Whether the document has been deleted
    - `file` object, nullable, required: File backing the current record, if it has one
      - `id` string, required: Ketryx ID of the uploaded file, e.g., `KXUPF12345`
      - `filename` string, required: Filename the file was uploaded under
      - `contentType` string, required: MIME type of the file
      - `sizeBytes` integer, required: Size of the file in bytes
    - `contentUrl` string, nullable, required: URL to download the file backing this document, or `null` if it has no file
    - `currentRecord` object, required: Current record of this document
      - `id` string, required
    - `controlledRecord` object, nullable, required: Latest controlled record of this document
      - `id` string, required
    - `fields` object[], required: Fields and values of the current record, as `GET /projects/{projectId}/items/{itemId}/records` reports them, without the record content
      - `label` string, required: Human-readable label of the field
      - `type` 'string' | 'jdf' | 'select' | 'multiselect' | 'date' | 'number', required: Type of field value
      - `value` unknown, required
      - `isCustom` boolean, required: True for custom fields — either organization-defined (customFieldsConfiguration) or project-level legacy (extraFieldNames). False for built-in system fields.

## Other responses

- `400`: Invalid input data
- `401`: Authorization not provided
- `403`: Insufficient access
- `404`: Not found
- `500`: Internal server error

---

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