Commands with a JSON body pass the displayed example to curl on standard input instead of an argument. If the real body contains sensitive content, do not replace the example inside an interactive shell command or history; have the agent generate the JSON on standard input without logging it.
GET/api/v1/agent/boards
List boards
Returns the boards owned by the API-key account. Litlas verifies stale owner-membership mirrors before calculating item_count. If that verification needs the paper catalog and it is unavailable, the whole request returns 502 paper_metadata_unavailable; if stored identities are ambiguous, it returns 409 library_identity_ambiguous. It never returns a partial board list or a possibly inaccurate count.
litlas_curl --fail-with-body --silent --show-error \
--request GET \
'https://litlas.ai/api/v1/agent/boards'
Success response (HTTP 200){
"boards": [
{
"board_id": "board_01JABCDEF",
"name": "Reading list",
"item_count": 0,
"created_at": "2026-09-03T12:30:00Z",
"updated_at": "2026-09-03T12:30:00Z"
}
]
}
Retry and idempotencySafe to repeat. It may perform the membership self-healing described above. On 502, retry only after the paper catalog has recovered. On an identity-related 409, follow the retryable contract below instead of guessing.
POST/api/v1/agent/boards
Create a board
Creates a board for the account and returns it under board.
JSON request body{
"name": "Reading list"
}
litlas_curl --fail-with-body --silent --show-error \
--request POST \
--header 'Content-Type: application/json' \
--data-binary @- \
'https://litlas.ai/api/v1/agent/boards' <<'JSON'
{"name":"Reading list"}
JSON
Success response (HTTP 201){
"board": {
"board_id": "board_01JABCDEF",
"name": "Reading list",
"item_count": 0,
"created_at": "2026-09-03T12:30:00Z",
"updated_at": "2026-09-03T12:30:00Z"
}
}
Retry and idempotencyNot idempotent. Re-sending the same name returns 400 instead of creating a duplicate. After an uncertain result, list boards before deciding what to do.
DELETE/api/v1/agent/boards/{board_id}
Delete a board
Deletes the selected board and detaches its papers and documents. Saved papers and their notes remain in the account library; attached document records also remain, with only the board link removed.
litlas_curl --fail-with-body --silent --show-error \
--request DELETE \
'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF'
Success response (HTTP 200){
"board_id": "board_01JABCDEF",
"deleted": true
}
Retry and idempotencyAfter a successful delete, repeating the request returns 404. After an uncertain result, list boards before retrying.
GET/api/v1/agent/boards/{board_id}/papers
List papers on a board
Returns the papers currently attached to the selected board. Before returning them, Litlas verifies stale owner-membership mirrors. If that verification needs an unavailable paper catalog, the whole request returns 502 paper_metadata_unavailable; if stored identities are ambiguous, it returns 409 library_identity_ambiguous. Metadata resolution for the returned papers can also produce 502. It never returns a 200 response with unverified membership or only the papers whose metadata resolved.
litlas_curl --fail-with-body --silent --show-error \
--request GET \
'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF/papers'
Success response (HTTP 200){
"board_id": "board_01JABCDEF",
"papers": [
{
"paper_id": "P43NTWMNFA70",
"title": "Example paper title",
"authors": [
"Ada Lovelace",
"Alan Turing"
],
"year": 2026
}
]
}
Retry and idempotencySafe to repeat. It may perform the membership self-healing described above. On 502, retry only after the paper catalog has recovered. On an identity-related 409, follow the retryable contract below instead of guessing.
POST/api/v1/agent/boards/{board_id}/papers
Add a paper to a board
Attaches the paper identified by paper_id to the selected board. If it is not already an active saved paper, this operation also saves it to the account library. A valid catalog lookup that finds no metadata returns 404 only when no snapshot owned by that account can resolve it; if the paper catalog cannot be reached or its response cannot be validated and no owned snapshot can resolve the metadata, the request returns 502 with detail.code paper_metadata_unavailable.
JSON request body{
"paper_id": "P43NTWMNFA70"
}
litlas_curl --fail-with-body --silent --show-error \
--request POST \
--header 'Content-Type: application/json' \
--data-binary @- \
'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF/papers' <<'JSON'
{"paper_id":"P43NTWMNFA70"}
JSON
Success response (HTTP 200){
"board_id": "board_01JABCDEF",
"paper_id": "P43NTWMNFA70",
"added": true
}
Retry and idempotencyIdempotent for one board and paper: a repeat succeeds with added set to false. On paper_metadata_unavailable, first GET the target board's papers. Retry the add at most once only if that read succeeds and confirms the paper is absent; if the read fails or cannot confirm absence, stop and surface the error. For an identity-related 409, follow the retryable contract below.
DELETE/api/v1/agent/boards/{board_id}/papers/{paper_id}
Remove a paper from a board
Removes only this board membership. It does not delete an existing saved paper from the account library or its account-level note. Litlas needs no catalog lookup when the supplied paper_id exactly matches a membership on this board, or when it exactly matches a saved paper and the board holds no other paper; an exact saved paper alone is not enough. Otherwise Litlas resolves the identifier through the paper catalog first, and returns 502 with detail.code paper_metadata_unavailable before applying a membership change when the catalog cannot be reached or its response cannot be validated and no snapshot owned by that account can resolve it. A valid catalog lookup that finds no metadata, or an identifier that names no membership on this board, is not an error: the request succeeds with removed set to false.
litlas_curl --fail-with-body --silent --show-error \
--request DELETE \
'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF/papers/P43NTWMNFA70'
Success response (HTTP 200){
"board_id": "board_01JABCDEF",
"paper_id": "P43NTWMNFA70",
"removed": true
}
Retry and idempotencyIdempotent for one board and paper: if the membership is already absent, removed is false. On paper_metadata_unavailable, do not loop blindly: first GET the target board's papers. Retry the same DELETE at most once only if that read succeeds and contains the exact opaque paper_id; if the read fails, the exact id is absent, or the retry fails, stop and surface the error instead of guessing an alias. For an identity-related 409, follow the retryable contract below.
GET/api/v1/agent/papers/{paper_id}/note
Read a paper note
Returns the account-level note and the updated_at version required by PATCH. An exact local paper identity needs no catalog lookup. When only a possible alias can identify the saved paper, an unavailable catalog returns 502 paper_metadata_unavailable and ambiguous stored identities return 409 library_identity_ambiguous; no partial 200 response is returned. A confirmed missing or inactive item returns 404.
litlas_curl --fail-with-body --silent --show-error \
--request GET \
'https://litlas.ai/api/v1/agent/papers/P43NTWMNFA70/note'
Success response (HTTP 200){
"paper_id": "P43NTWMNFA70",
"note": "Initial note.",
"updated_at": "2026-09-03T12:31:00Z"
}
Retry and idempotencyRead-only. On 502, retry only after the paper catalog has recovered. On an identity-related 409, follow the retryable contract below instead of guessing.
PATCH/api/v1/agent/papers/{paper_id}/note
Update a paper note
Replaces the account-level note only if expected_updated_at still matches. An exact local paper identity needs no catalog lookup. When only a possible alias can identify the saved paper, an unavailable catalog returns 502 paper_metadata_unavailable and ambiguous stored identities return 409 library_identity_ambiguous before the note is changed. A confirmed missing or inactive item returns 404.
JSON request body{
"note": "Key finding and follow-up questions.",
"expected_updated_at": "2026-09-03T12:31:00Z"
}
litlas_curl --fail-with-body --silent --show-error \
--request PATCH \
--header 'Content-Type: application/json' \
--data-binary @- \
'https://litlas.ai/api/v1/agent/papers/P43NTWMNFA70/note' <<'JSON'
{"note":"Key finding and follow-up questions.","expected_updated_at":"2026-09-03T12:31:00Z"}
JSON
Success response (HTTP 200){
"paper_id": "P43NTWMNFA70",
"note": "Key finding and follow-up questions.",
"updated_at": "2026-09-03T12:35:00Z"
}
Retry and idempotencyDo not blindly retry. On 502, retry only after the paper catalog has recovered. Reusing a version after another update returns 409; GET the note again and reconcile explicitly. For an identity-related 409, follow the retryable contract below.