REST API
数百〜数千ページのドキュメントを、ご自身のスクリプトから保存・削除します。AI は 関与しません。
PDF、表計算、レポートを 1 件ずつ手で入れる代わりに、一連の作業をスクリプトに任せます。 テキストの抽出と分割はご自身で行い、その結果だけを送ってください。
ここで保存したものは、接続した AI から保存したものとまったく同じです。同じ保存先に入り、AI の 呼び出し方も変わりません。
読み取りは検索ではなく id 単位です。 意味による取得は MCP と ダッシュボードが担当します。
はじめに
- REST API のカードでキーを作成します — アカウントページに
あります。キーの名前は、そのキーで保存したものすべての出所として記録されます。
Import script、pdf-importerのように、後から見てわかる名前にしてください。 - キーは作成直後に一度だけ表示されます。その場でコピーしてください。再表示は できません。
- キーはいくつでも作成でき、いつでも個別に削除できます。
認証
https://contextick.aiAuthorization: Bearer api_xxxxxxxx
ここで使えるのは api_ で始まるキーだけです。MCP キーや OAuth トークンはこの API で
401 になり、REST API キーは MCP エンドポイントで 401 になります。表面が
分かれているので、片方だけを失効させられます。
エンドポイント
POST /api/v1/notes
1 件を保存します。
Body
| Field | Type | Required | Limit |
|---|---|---|---|
| title | string | ✓ | 120 文字 — 超えた分は切り詰められます |
| summary | string | ✓ | 300 文字 — 超えた分は切り詰められます |
| content | string | ✓ | 16,000 文字 — 超えると拒否されます |
3 つとも空にはできません。空の値は推測で埋めず、拒否します。
Request
curl -X POST https://contextick.ai/api/v1/notes \
-H "Authorization: Bearer api_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"title":"Q3 report","summary":"Revenue and headcount for Q3.","content":"…"}'
Response 201
{ "id": 42, "saved_items": 118, "stored_bytes": 1048576 }
saved_items と stored_bytes は保存後の合計です。読み取れなかった場合は
0 ではなくフィールドごと省かれます。
ドキュメントに記録される出所はキーの名前です。リクエストからは指定できません。
GET /api/v1/notes/{id}
1 件を全文で読み取ります。
Request
curl https://contextick.ai/api/v1/notes/42 \
-H "Authorization: Bearer api_xxxxxxxx"
Response 200
{ "id": 42, "title": "Q3 report", "summary": "…", "content": "…",
"author": "you@example.com", "origin": "Import script", "created_at": "…",
"status": "ready", "group_id": null, "times_opened": 3 }
ここで読んでも times_opened は変わりません。あの数はスクリプトの同期ではなく、ご自身が開いた回数を数えます。
status は ready・pending・failed のいずれかです。ready の項目だけが検索で見つかります。
group_id はアップロードしたファイル由来の項目にだけ入り、それ以外は null です。存在しない id には 404 を返します。
GET /api/v1/notes/group/{group_id}
アップロードした 1 ファイルが分かれた各パートを一覧します。
Request
curl https://contextick.ai/api/v1/notes/group/6f1c2a94 \
-H "Authorization: Bearer api_xxxxxxxx"
Response 200
{ "group_id": "6f1c2a94", "title": "Q3 report",
"part_count": 13, "ready": 11, "pending": 2, "failed": 0,
"items": [
{ "id": 42, "title": "Q3 report (1/13)", "status": "ready" },
{ "id": 43, "title": "Q3 report (2/13)", "status": "pending" } ] }
title はファイル自体のタイトルで、最初のパートからパート番号を除いたものです。4 つの件数は items を走査しなくても分かるようにあります。
各パートは id 順で返り、本文は含まれません。パートの content が要る場合は上の 1 件読み取りを呼びます。
group_id は上の 1 件読み取りの応答から得ます。該当する項目がないラベルには 404 を返します。
DELETE /api/v1/notes/group/{group_id}
アップロードした 1 ファイルのすべてのパートを削除します。
Request
curl -X DELETE https://contextick.ai/api/v1/notes/group/6f1c2a94 \
-H "Authorization: Bearer api_xxxxxxxx"
Response 200
{ "group_id": "6f1c2a94", "deleted": [42, 43, 44],
"saved_items": 117, "stored_bytes": 1040000 }
全部か何もかのどちらかです。そのラベルを持つパートは 1 つのトランザクションでまとめて消えるので、途中で中断されてもファイルが半分だけ消えた状態にはなりません。
上の 2 つの削除と違い not_found 配列はありません。ここが受け取るのは id の一覧ではなくラベル 1 つなので、該当する項目がないラベルには上の読み取りと同じく 404 を返します。
GET /api/v1/notes/changes
前回の確認以降に追加された項目を、古い順に取得します。
Query
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| cursor | 整数 | 再開する位置 — 直前のレスポンスのカーソルです。 | |
| since | RFC 3339 | 開始時点です。例: 2026-09-01T13:00:00+09:00。オフセットは必須です。最初の呼び出しのみ。 | |
| limit | 整数 | 1–100。既定値は 50。 |
since か、何も付けずに開始し、以降はカーソルをたどります。両方を同時に指定するとエラーです。
リクエスト
curl "https://contextick.ai/api/v1/notes/changes?since=2026-09-01T04:00:00Z&limit=50" \
-H "Authorization: Bearer api_xxxxxxxx"
レスポンス 200
{ "data": [
{ "id": 41, "title": "Q3 report", "summary": "…", "created_at": "2026-09-01T04:00:12Z",
"origin": "Import script", "status": "ready", "group_id": null } ],
"pagination": { "limit": 50, "poll_cursor": "41" } }
next_cursor は続きがある合図で、すぐ次を要求します。poll_cursor は追いついた合図で、保存して次回に確認します。どちらか一方だけが入ります。
古い順に届くのでカーソルは前へ進むだけで、長く空けても飛ばされる項目はありません。本文は含みません — 必要なときに単体で読みます。
since はフィルタではなく開始点なので、少し古い項目が数件混ざることがあります。status が pending のことがあります — 保存され読めますが、まだ検索対象ではありません。削除とその後の状態変化はここには出ません。
DELETE /api/v1/notes/{id}
1 件を削除します。
Request
curl -X DELETE https://contextick.ai/api/v1/notes/42 \
-H "Authorization: Bearer api_xxxxxxxx"
POST /api/v1/notes/delete
まとめて削除します。
Body
| Field | Type | Required | Limit |
|---|---|---|---|
| ids | number[] | ✓ | 1 回につき 50 件 — 超えると拒否されます |
一括取り込みを取り消せるのはこの経路だけです。
Request
curl -X POST https://contextick.ai/api/v1/notes/delete \
-H "Authorization: Bearer api_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"ids":[42,43]}'
Delete response 200
{ "deleted": [42], "not_found": [43], "saved_items": 117, "stored_bytes": 1040000 }
どちらの削除も同じ形を返します。存在しない id はエラーではなく not_found として
報告されます。削除は永久で、取り消せません。
エラー
失敗はすべて同じ形です:
{ "error": { "code": "quota_exceeded", "message": "…" } }
分岐は code で行ってください。message は人が読むための文章で、予告なく
変わることがあります。
empty_titleempty_summaryempty_contentcontent_too_longtoo_many_idsinvalid_bodyinvalid_idinvalid_query
api_ キーを確認します
unauthorized
payment_past_duesubscription_pausedsubscription_canceledrefund_pending
not_foundendpoint_not_found
Allow ヘッダーのメソッドを使います
method_not_allowed
Content-Type: application/json を付けます
unsupported_media_type
rate_limitedembedding_rate_limited
quota_exceeded
Webhook を受け取る
保存・削除と、項目が検索可能になったことをあなたのエンドポイントへ送る経路は、独立したページに なりました — ヘッダー、4 つのイベント種別、署名の検証、再試行は Webhook のドキュメントにあります。
知っておくこと
- 保存できる容量はプランによります — 料金をご覧ください。
- 呼び出しには1時間あたり・1日あたりの上限があり、
429にはRetry-Afterが付きます。上限は通常のスクリプト利用よりずっと高い位置にあります。長い文書をまとめて入れるときはダッシュボードからアップロードしてください。そちらは分割数ではなくファイル単位で数えます。 - わかりにくい点や動かない点がありますか。お問い合わせください。すべての メッセージに担当者が目を通します。