REST API

수백~수천 페이지짜리 문서를 스크립트로 저장하고 삭제합니다. AI 는 관여하지 않습니다.

PDF, 스프레드시트, 보고서를 한 건씩 손으로 넣는 대신, 전 과정을 스크립트에 맡깁니다. 텍스트 추출과 분할은 직접 하고, 그 결과만 보내면 됩니다.

여기서 저장한 것은 연결된 AI 로 저장한 것과 똑같습니다 — 같은 저장소에 들어가고, AI 가 꺼내오는 방식도 같습니다.

읽기는 검색이 아니라 id 로 합니다. 의미 기반 조회는 MCP대시보드가 맡습니다.

시작하기

  1. REST API 카드에서 키를 만듭니다 — 계정 페이지에 있습니다. 키 이름은 그 키로 저장된 모든 것의 출처로 기록되니 — Import script, pdf-importer 처럼 — 나중에 알아볼 이름으로 붙이세요.
  2. 키는 만든 직후 한 번만 보여드립니다. 그때 복사하세요. 다시 볼 수 없습니다.
  3. 키는 원하는 만큼 만들 수 있고, 언제든 개별 삭제할 수 있습니다.

인증

Base URLhttps://contextick.ai
Authorization: Bearer api_xxxxxxxx

api_ 로 시작하는 키만 여기서 동작합니다. MCP 키나 OAuth 토큰은 이 API 에서 401 이고, REST API 키는 MCP 엔드포인트에서 401 입니다 — 두 표면이 갈려 있어 한쪽만 따로 폐기할 수 있습니다.

엔드포인트

POST /api/v1/notes

한 건을 저장합니다.

Body

FieldTypeRequiredLimit
titlestring120자 — 넘으면 잘립니다
summarystring300자 — 넘으면 잘립니다
contentstring16,000자 — 넘으면 거절됩니다

셋 다 비어 있으면 안 됩니다. 빈 값은 임의로 채우지 않고 거절합니다.

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_itemsstored_bytes 는 저장 후의 총량입니다. 읽지 못했을 때는 0 이 아니라 필드 자체가 빠집니다.

문서에 기록되는 출처는 키 이름입니다. 요청으로 지정할 수 없습니다.

GET /api/v1/notes/{id}

한 건을 전문으로 읽습니다.

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 는 바뀌지 않습니다 — 그 숫자는 스크립트가 동기화한 것이 아니라 사람이 열어본 것을 셉니다.

statusready·pending·failed 중 하나입니다 — ready 인 항목만 검색으로 찾힙니다.

group_id 는 업로드한 파일에서 나온 항목에만 있고, 아니면 null 입니다. 없는 id 는 404 로 답합니다.

GET /api/v1/notes/group/{group_id}

업로드한 파일 하나가 나뉜 조각들을 나열합니다.

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 은 파일 자체의 제목입니다 — 첫 조각에서 조각 번호를 뗀 것이고, 네 개의 개수는 items 를 훑지 않고도 바로 얻으라고 있습니다.

조각은 id 순으로 오고 본문은 들어 있지 않습니다 — 조각의 content 가 필요하면 위 단건 조회를 부릅니다.

group_id 는 위 단건 조회 응답에서 얻습니다. 해당 항목이 없는 라벨은 404 로 답합니다.

DELETE /api/v1/notes/group/{group_id}

업로드한 파일 하나의 모든 조각을 삭제합니다.

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 }

전부 아니면 전무입니다 — 그 라벨을 단 조각이 한 트랜잭션에서 함께 사라지므로, 도중에 끊겨도 파일이 반쯤 지워진 채 남지 않습니다.

위의 두 삭제와 달리 not_found 배열이 없습니다. 여기는 id 목록이 아니라 라벨 하나를 받으므로, 해당 항목이 없는 라벨은 위 조회와 같이 404 로 답합니다.

GET /api/v1/notes/changes

마지막으로 확인한 뒤 추가된 항목을 오래된 것부터 가져옵니다.

Query

파라미터타입필수설명
cursor정수이어받을 지점 — 직전 응답의 커서입니다.
sinceRFC 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 는 필터가 아니라 시작점이라 조금 더 오래된 항목이 몇 건 함께 올 수 있습니다. statuspending 일 수 있습니다 — 저장돼 읽히지만 아직 검색되지는 않습니다. 삭제와 이후의 상태 변화는 여기 나오지 않습니다.

DELETE /api/v1/notes/{id}

한 건을 삭제합니다.

Request

curl -X DELETE https://contextick.ai/api/v1/notes/42 \
  -H "Authorization: Bearer api_xxxxxxxx"

POST /api/v1/notes/delete

여러 건을 한 번에 삭제합니다.

Body

FieldTypeRequiredLimit
idsnumber[]한 번에 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 는 사람이 읽기 위한 문장이라 언제든 바뀔 수 있습니다.

400 요청을 고쳐 다시 보냅니다 empty_titleempty_summaryempty_contentcontent_too_longtoo_many_idsinvalid_bodyinvalid_idinvalid_query
401 api_ 키를 확인합니다 unauthorized
402 결제 상태를 해결합니다 — 그동안 조회는 계속 됩니다 payment_past_duesubscription_pausedsubscription_canceledrefund_pending
404 그 id·그룹·경로가 없습니다 not_foundendpoint_not_found
405 Allow 헤더의 메서드를 씁니다 method_not_allowed
415 Content-Type: application/json 을 붙입니다 unsupported_media_type
429 잠시 후 같은 요청을 다시 보냅니다 rate_limitedembedding_rate_limited
507 공간을 비우거나 더 큰 플랜으로 — 그대로 재시도하지 마세요 quota_exceeded
503 500 일시적이거나 서버측 문제 — 잠시 후 다시 보냅니다

웹훅 받기

저장·삭제와 항목이 검색 가능해지는 것을 회원님이 등록한 주소로 밀어주는 경로는 이제 자기 페이지를 가집니다 — 헤더, 이벤트 4종, 서명 검증, 재시도는 웹훅 문서에 있습니다.

알아두기