---
title: "Read the logbook of a project"
method: GET
path: "/projects/{id}/logbook"
tags: ["Logbook"]
---

# Read the logbook of a project

`GET /projects/{id}/logbook`

## Request

- Base URL: `https://api.epovest.com/v1`
- URL: `https://api.epovest.com/v1/projects/{id}/logbook`
- Auth: HTTP bearer

The composed timeline, newest first. Suite moves are derived from the product itself (the
canon moved to a version, a surface was marked aligned, a corroboration was recorded): they
appear on their own, carry no id, and are read-only. Manual entries are the actions the
customer records, freely editable. Every move also lands as an annotation on the citation
curves of the trackers of the project.

## Query parameters

- `source` 'tool' | 'manual'
- `category` 'content' | 'technical' | 'translation' | 'canon' | 'press' | 'other'
- `quest_id` string, uuid
- `deleted` 'only'

## Response `200`

The logbook of the project.

- object
  - `logbook` LogbookItem[], required
    - `source` 'tool' | 'manual', required
    - `kind` 'canon_version' | 'surface_aligned' | 'corroboration' | 'corroboration_archived' | 'entry', required
    - `occurred_at` string, date-time, required: The date of the action. On a `corroboration` item it is the PUBLICATION date when it is known, and the recording date otherwise, `published_on` sitting right next to it so you can tell which one you are reading.
    - `author` string, nullable, required
    - `id` string, uuid: Manual entries only.
    - `category` 'content' | 'technical' | 'translation' | 'canon' | 'press' | 'other'
    - `label` string: Manual entries only.
    - `notes` string, nullable
    - `recorded_at` string, date-time: The day the entry was recorded.
    - `quest_id` string, uuid, nullable
    - `quest` string, nullable: The title of the quest the action moves forward.
    - `deleted_at` string, date-time, nullable: The day the entry left the logbook.
    - `canon_version` integer, nullable
    - `changed` string[]: The canon keys that revision touched: the number says the registry has work waiting, `changed` says what the work is about. Version 1 lists everything it posted.
    - `surface_id` string, uuid
    - `surface` string
    - `corroboration_id` string, uuid
    - `corroboration` string
    - `url` string
    - `domain` string
    - `published_on` string, date, nullable
    - `archived` boolean

## Other responses

- `401`: `unauthenticated`: missing, unknown or revoked key.
- `403`: `insufficient_scope`: the credential may not do this, either because the key lacks the scope, or, on a one-click connection, because the person lacks the role the action needs (manager, or owner to start, pause and top up). On that path, read it as "this person may not do this" and tell them which role the action needs.
- `404`: `not_found`: unknown for this account.
- `422`: `invalid_filter`, `invalid_category`, `invalid_source` or `invalid_quest`: the message names the accepted values.
- `429`: `rate_limited`: 120 requests per minute per credential, sliding window. Retry after `Retry-After` seconds.

---

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