board_id
ボード一覧・作成 API が返す不透明なボード識別子です。ボード名から推測せず、返された値をそのまま使います。
item_count
ボードに紐づく有効なアイテムの総数で、論文とドキュメントの両方を含みます。ボード内論文 API は論文だけを返すため、その papers.length とは一致しないことがあります。
アカウント専用 API で、ボードの作成・削除、ボード内の論文管理、ライブラリからの論文削除、論文メモの取得・更新ができます。
すべてのエンドポイントは JSON を使い、次のベースパス以下にあります。
/api/v1/agent対話型の Bash では、一度だけ表示されたキーを非 export の変数へ画面表示なしで読み、非公開の設定用ファイルディスクリプタだけを通して curl へ渡します。キーをシェル履歴、子プロセスの環境変数、curl の引数へ残しません。
unset LITLAS_API_KEYbuiltin printf 'Litlas API key: ' >&2IFS= read -r -s LITLAS_API_KEYbuiltin printf '\n' >&2litlas_curl() { if [[ ! ${LITLAS_API_KEY-} =~ ^litlas_sk_[A-Za-z0-9_-]{43}$ ]]; then builtin printf 'Invalid Litlas API key.\n' >&2 return 64 fi command curl --config <( builtin printf 'header = "Authorization: Bearer %s"\n' "$LITLAS_API_KEY" ) "$@"}すべてのリクエストで Litlas API キーを Authorization ヘッダーに指定します。
Authorization: Bearer <YOUR_LITLAS_API_KEY>完全なキーを表示するのは、発行またはローテートの直後に一度だけです。Litlas はキーの検証に必要な情報だけを保存するため、あとから完全な値を再表示できません。
ローテートすると以前のキーは即時に失効します。次のリクエストより前にエージェントやシークレットストアを更新してください。古いキーを使ったリクエストは 401 になります。
キーはパスワードと同様に扱ってください。URL、ソースコード、チャット記録、ログ、シェル履歴、リポジトリには記載しないでください。完全な値をシェルコマンドへ直接入力しないでください。意図したシークレットストアへ貼り付けたあとは、クリップボードを上書きし、設定画面でキーを隠してください。
使い終わったら、現在のシェルからキーと補助関数を消去します。
unset LITLAS_API_KEYunset -f litlas_curlboard_idボード一覧・作成 API が返す不透明なボード識別子です。ボード名から推測せず、返された値をそのまま使います。
item_countボードに紐づく有効なアイテムの総数で、論文とドキュメントの両方を含みます。ボード内論文 API は論文だけを返すため、その papers.length とは一致しないことがあります。
paper_id論文とともに返される Litlas の不透明な論文識別子です。解釈したり、タイトル、DOI、ボード内の位置から導出したりせず、返された値を正確にコピーします。API は前後の空白だけを除去し、内部の文字はすべて保持します。連続する空白は別の値として扱われ、paper_id には / ? # % も含まれることがあります。
識別子全体を一つのパスセグメントとしてエンコードします。スラッシュで分割したり、URL 全体をエンコードしたりしないでください。
const paperId = 'SOURCE/ID';encodeURIComponent(paperId); // 'SOURCE%2FID'論文メモはアカウント内で一つであり、すべてのボードで共通です。どのボードから更新しても同じメモが全体で変わります。論文をボードから外しても、そのメモは削除されません。PATCH は既定で既存メモへの追記です(mode「append」)。エージェントが持っているのは読み取った時点のメモだけで、既定を置き換えにすると、その間に書かれた内容を消してしまうためです。全体を上書きするときは mode「replace」を指定します。メモを消去できるのもこのモードだけです。GET と PATCH は、その論文がアカウントのライブラリに有効な保存アイテムとして存在する場合だけ使えます。存在しない場合は 404 を返します。
ボードから論文を削除しても紐付けが外れるだけで、論文とメモはライブラリに残ります。ライブラリから論文そのものを消すのは、論文に対する DELETE です。既定ではライブラリのごみ箱へ移動し、保持期間のあいだはライブラリのごみ箱画面から復元できます。ボードへの所属も保持するため、復元すると元のボードに戻ります。permanent=true を付けると、ごみ箱を経由しているかどうかにかかわらず、論文・メモ・保存済みスナップショットをそのまま削除します。アプリからも API からも元に戻せません。
expected_updated_at は必須です。すべてのメモ編集で楽観的排他制御を使います。
{ "detail": { "code": "note_conflict", "paper_id": "P43NTWMNFA70", "current_note": "The note saved by another client.", "current_updated_at": "2026-09-03T12:34:00Z" }}JSON 本文があるコマンドは、表示した例を引数ではなく標準入力から curl へ渡します。実際の本文に機密情報が含まれる場合は、対話シェルのコマンドや履歴内の例を実値へ置き換えず、エージェントからログへ出さずに標準入力へ生成してください。
/api/v1/agent/library/upload-pdfmultipart/form-data の pdf に PDF(50 MiB 以下)、または source_url に公開 PDF URL のどちらか一方を送ります。任意の board_ids にはボード ID の JSON 配列を指定します。URL はリダイレクト先も検査し、PDF でなければ失敗します。PDF 本文から書誌情報を抽出し、カタログ未登録の論文も PDF 付きで自分のライブラリへ登録します。既存のボード所属とメモは保持します。応答例は主要項目の抜粋で、paper と item には通常のライブラリ情報も含まれます。
litlas_curl --fail-with-body --silent --show-error \ --request POST \ --form 'pdf=@paper.pdf;type=application/pdf' \ --form-string 'board_ids=["board_01JABCDEF"]' \ 'https://litlas.ai/api/v1/agent/library/upload-pdf'{ "ok": true, "created": true, "pdf_uploaded": true, "paper": { "id": "browser_import:example", "title": "Example paper title" }, "item": { "paper_id": "browser_import:example", "board_ids": [ "board_01JABCDEF" ] }}pdf_uploaded と返された paper.id を確認します。同じ論文の再送は PDF を更新し、ライブラリ項目を重複させません。タイムアウト後はボードを確認してから再送します。不正 PDF は 400、上限超過は 413、保存先が利用不能なら 503 です。
/api/v1/agent/library/import-bibtexmultipart/form-data の bib に UTF-8 の .bib(50万文字以下)、任意の board_ids にボード ID の JSON 配列を送ります。共通インポーターがカタログ未登録の論文も個人レコードとして保存します。PDF は取得しません。imported_count・unmatched_count・note_conflict_count を確認してください。imported_paper_ids は最大20件です。board_ids を省略すると、通常の取り込み画面と同じくファイル内のボード指定で所属を置き換えます。応答例は主要項目の抜粋です。
litlas_curl --fail-with-body --silent --show-error \ --request POST \ --form 'bib=@papers.bib;type=application/x-bibtex' \ --form-string 'board_ids=["board_01JABCDEF"]' \ 'https://litlas.ai/api/v1/agent/library/import-bibtex'{ "total_entries": 1, "imported_count": 1, "matched_count": 0, "captured_count": 1, "unmatched_count": 0, "note_conflict_count": 0, "imported_paper_ids": [ "browser_import:example" ], "target_board_ids": [ "board_01JABCDEF" ]}既存論文を照合し直し、個人メモは保持します。board_ids を指定すれば所属は追加です。空または不正な BibTeX は 400、上限超過は 413 です。未登録項目やメモの競合は結果を確認して処理してください。
/api/v1/agent/boardsAPI キーのアカウントが所有するボードを返します。item_count の計算前に、所有者の古い所属ミラーを検証します。検証に論文カタログが必要で利用不能な場合はリクエスト全体を 502 paper_metadata_unavailable、保存済み ID が曖昧な場合は 409 library_identity_ambiguous にします。一部だけのボード一覧や不正確な可能性がある件数は返しません。
litlas_curl --fail-with-body --silent --show-error \ --request GET \ 'https://litlas.ai/api/v1/agent/boards'{ "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" } ]}安全に再実行できます。上記の所属自己修復を行うことがあります。502 では論文カタログの復旧後だけ再試行します。論文 ID に関する 409 では、推測せず下記の retryable 契約に従ってください。
/api/v1/agent/boardsアカウントにボードを作成し、board 内に作成結果を返します。
{ "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{ "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" }}冪等ではありません。同じ名前を再送すると、重複を作らず 400 を返します。結果が不明なときは、再試行を決める前にボード一覧を取得してください。
/api/v1/agent/boards/{board_id}指定したボードを削除し、論文とドキュメントのボードへの紐付けを外します。保存論文とそのメモはアカウントのライブラリに残り、紐付いていたドキュメント本体も残ります。
litlas_curl --fail-with-body --silent --show-error \ --request DELETE \ 'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF'{ "board_id": "board_01JABCDEF", "deleted": true}削除成功後に同じリクエストを繰り返すと 404 になります。結果が不明なときは、再試行前にボード一覧を取得してください。
/api/v1/agent/boards/{board_id}/papers指定したボードに現在入っている論文を返します。応答前に、所有者の古い所属ミラーを検証します。検証に必要な論文カタログが利用不能な場合はリクエスト全体を 502 paper_metadata_unavailable、保存済み ID が曖昧な場合は 409 library_identity_ambiguous にします。返却対象論文のメタデータを解決できない場合も 502 になります。未検証の所属や、メタデータを解決できた論文だけを入れた 200 応答は返しません。
litlas_curl --fail-with-body --silent --show-error \ --request GET \ 'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF/papers'{ "board_id": "board_01JABCDEF", "papers": [ { "paper_id": "P43NTWMNFA70", "title": "Example paper title", "authors": [ "Ada Lovelace", "Alan Turing" ], "year": 2026 } ]}安全に再実行できます。上記の所属自己修復を行うことがあります。502 では論文カタログの復旧後だけ再試行します。論文 ID に関する 409 では、推測せず下記の retryable 契約に従ってください。
/api/v1/agent/boards/{board_id}/paperspaper_id で指定した論文をボードへ追加します。その論文が有効な保存論文としてまだ存在しない場合は、同時にアカウントのライブラリへ保存します。正常なカタログ照会でメタデータが見つからず、そのアカウント所有のスナップショットからも解決できない場合に限り 404、論文カタログへ到達できない、または応答を検証できず、かつ所有スナップショットからも解決できない場合は detail.code が paper_metadata_unavailable の 502 を返します。
{ "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{ "board_id": "board_01JABCDEF", "paper_id": "P43NTWMNFA70", "added": true}同じボードと論文に対して冪等です。繰り返した場合も成功し、added が false になります。paper_metadata_unavailable の場合は、先に対象ボードの論文一覧を GET してください。その読取が成功し、論文が無いことを確認できた場合だけ追加を最大 1 回再試行し、読取失敗または不存在を確認できない場合は中止してエラーを表面化させます。論文 ID に関する 409 では、下記の retryable 契約に従ってください。
/api/v1/agent/boards/{board_id}/papers/{paper_id}このボードへの所属だけを削除します。アカウントのライブラリにある既存の保存論文と、アカウント共通のメモは削除しません。指定された paper_id がこのボードの所属と正確に一致する場合、または保存論文と正確に一致し、かつそのボードにほかの論文が 1 件も無い場合は、論文カタログを使いません。保存論文と一致するだけでは足りません。それ以外では先に論文カタログで識別子を解決し、論文カタログへ到達できない、または応答を検証できず、かつそのアカウント所有のスナップショットからも解決できない場合は、所属を変更する前に detail.code が paper_metadata_unavailable の 502 を返します。正常なカタログ照会でメタデータが見つからない場合や、識別子に対応する所属がこのボードに無い場合はエラーではなく、removed が false の成功になります。
litlas_curl --fail-with-body --silent --show-error \ --request DELETE \ 'https://litlas.ai/api/v1/agent/boards/board_01JABCDEF/papers/P43NTWMNFA70'{ "board_id": "board_01JABCDEF", "paper_id": "P43NTWMNFA70", "removed": true}同じボードと論文に対して冪等です。所属がすでに無ければ removed は false になります。paper_metadata_unavailable の場合は無制限に再試行せず、まず対象ボードの論文一覧を GET します。その読取が成功し、同じ不透明な paper_id が正確に含まれる場合だけ、同じ DELETE を最大 1 回再試行します。読取失敗、正確な ID の不在、再試行の失敗のいずれかでは、別名を推測せずに中止し、エラーを表面化させます。論文 ID に関する 409 では、下記の retryable 契約に従ってください。
/api/v1/agent/papers/{paper_id}/noteアカウント共通メモと、PATCH に必要な updated_at を返します。ローカルの論文 ID と正確に一致する場合、カタログ照会は不要です。保存論文を別名の可能性から特定する必要がある場合、カタログ利用不能なら 502 paper_metadata_unavailable、保存済み ID が曖昧なら 409 library_identity_ambiguous を返し、一部だけの 200 応答にはしません。不在または無効と確認できた場合は 404 を返します。
litlas_curl --fail-with-body --silent --show-error \ --request GET \ 'https://litlas.ai/api/v1/agent/papers/P43NTWMNFA70/note'{ "paper_id": "P43NTWMNFA70", "note": "Initial note.", "updated_at": "2026-09-03T12:31:00Z"}読み取り専用です。502 では論文カタログの復旧後だけ再試行します。論文 ID に関する 409 では、推測せず下記の retryable 契約に従ってください。
/api/v1/agent/papers/{paper_id}/noteexpected_updated_at が現在値と一致する場合に限り、アカウント共通メモを書き込みます。既定の mode「append」は既存のメモを残し、空行を挟んで送られた本文を後ろへ足します。メモが空の場合は送られた本文がそのままメモになります。mode「replace」はメモ全体を置き換え、空文字列なら消去します。追記の結果がメモの上限を超える場合は 422 note_too_long になり、何も書き込みません。ローカルの論文 ID と正確に一致する場合、カタログ照会は不要です。保存論文を別名の可能性から特定する必要がある場合、カタログ利用不能なら 502 paper_metadata_unavailable、保存済み ID が曖昧なら 409 library_identity_ambiguous を返し、メモは変更しません。不在または無効と確認できた場合は 404 を返します。
{ "note": "Key finding and follow-up questions.", "expected_updated_at": "2026-09-03T12:31:00Z", "mode": "append"}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","mode":"append"}JSON{ "paper_id": "P43NTWMNFA70", "note": "Initial note.\n\nKey finding and follow-up questions.", "updated_at": "2026-09-03T12:35:00Z"}そのまま再試行しないでください。502 では論文カタログの復旧後だけ再試行します。ほかの更新後に同じバージョンを使うと 409 になります。先に GET し直して明示的に調整します。追記を繰り返しても二重にならないのはこのバージョン照合があるからなので、一度成功したバージョンを使い回さないでください。論文 ID に関する 409 では下記の retryable 契約に従ってください。
/api/v1/agent/papers/{paper_id}アカウントのライブラリから論文を削除します。ボードへの所属を外す操作ではなく、保存論文そのものを削除します。既定ではライブラリのごみ箱へ移動するため、メモとボードへの所属は保持され、保持期間のあいだはライブラリのごみ箱画面から復元できます。permanent=true を付けると、ごみ箱に入っているかどうかにかかわらず、論文・メモ・ボードへの所属・保存済みスナップショットをそのまま削除し、復元できません。ローカルの論文 ID と正確に一致する場合、カタログ照会は不要です。保存論文を別名の可能性から特定する必要がある場合、カタログ利用不能なら 502 paper_metadata_unavailable、保存済み ID が曖昧なら 409 library_identity_ambiguous を返し、何も削除しません。このアカウントのライブラリに無い論文は 404 を返します。
litlas_curl --fail-with-body --silent --show-error \ --request DELETE \ 'https://litlas.ai/api/v1/agent/papers/P43NTWMNFA70?permanent=false'{ "paper_id": "P43NTWMNFA70", "permanent": false, "deleted": true}既定の削除は冪等です。すでにごみ箱にある論文はそのままで、保持期間も延びません。permanent=true の削除を繰り返すと、論文が無くなっているため 404 になります。502 では論文カタログの復旧後だけ再試行します。論文 ID に関する 409 では下記の retryable 契約に従ってください。完全削除は元に戻せないため、実行前に対象を確認してください。
2xx 応答だけが成功です。エラー本文を成功結果として扱わないでください。
| ステータス | 意味 |
|---|---|
400 | リクエストの形式が不正、または操作を適用できません。 |
401 | Bearer キーが無い、無効、またはローテートで失効しています。 |
403 | キーは有効ですが、このアカウントにはその操作が許可されていません。 |
404 | このアカウントの範囲に、指定したボードまたは論文がありません。 |
409 | リソースの状態とリクエストが競合しています。古いメモ、無料プランの容量超過、ライブラリ内の論文 ID の並行変更、安全に解決できない保存済み ID を含みます。 |
422 | パス引数、クエリ引数、または JSON フィールドがドキュメントの形式に合いません。追記でメモが上限を超える場合は detail.code が note_too_long になり、何も書き込みません。 |
502 | 必要な論文メタデータまたはカタログ検証を利用できませんでした。detail.code は paper_metadata_unavailable、detail.paper_id は対象論文を示します。ボード一覧は一部だけの一覧や不正確な可能性がある件数を返さず、ボード内論文一覧は未検証の所属やメタデータの部分結果を 200 で返しません。論文追加は成功を報告せず、論文削除とメモ PATCH はこの応答より前に要求された変更を適用しません。 |
500 / その他の 5xx | Litlas がリクエストを完了できませんでした。結果は未確定です。書き込みを再試行する前に応答を確認してください。 |
すべてのエラーは最上位に detail フィールドを持ちます。エラーに応じて、detail は文字列、機械判定できるオブジェクト、または標準のバリデーション配列になります。最初に HTTP ステータスで分岐し、detail がオブジェクトの場合は detail.code でも分岐してください。すべての非 2xx 応答が同じ detail 形式だと仮定しないでください。
{ "detail": "Board not found"}{ "detail": { "code": "free_capacity_exceeded", "kind": "items", "limit": 100, "used": 100 }}{ "detail": { "code": "library_identity_changed", "message": "The library changed concurrently. Retry the request.", "retryable": true }}{ "detail": { "code": "library_identity_ambiguous", "message": "Stored library identities cannot be resolved unambiguously. No changes were applied.", "retryable": false }}{ "detail": { "code": "note_conflict", "paper_id": "P43NTWMNFA70", "current_note": "The note saved by another client.", "current_updated_at": "2026-09-03T12:34:00Z" }}{ "detail": { "code": "note_too_long", "paper_id": "P43NTWMNFA70", "limit": 2000, "length": 2064 }}{ "detail": { "code": "paper_metadata_unavailable", "paper_id": "P43NTWMNFA70" }}保存済み論文 ID を解決するリクエストでは、論文 ID が並行して変わった場合や、保存済み ID を安全に解決できない場合に次の 409 を返すことがあります。retryable を明示的な指示として扱ってください。
例では curl --fail-with-body を使います。HTTP エラー時に終了コードを非ゼロにしつつ、調査用の応答本文を残せます。