원격 가계부 API
최종 업데이트: 2026년 5월 10일
개인 API 토큰으로 cURL, iOS 단축어, 자동화 스크립트에서 원격으로 기록할 수 있습니다. 토큰은 쓰기 전용으로, 거래 추가 및 카테고리·태그 목록 조회는 가능하지만 거래 데이터를 읽거나 삭제할 수는 없습니다.
1. 토큰 받기
admin 으로 로그인하여 설정 → 🔑 원격 가계부 API 를 열고 "토큰 생성" 을 누르세요.
평문 토큰은 한 번만 표시되므로 즉시 복사해 두세요. 서버는 SHA-256 해시만 저장하므로 분실 시 재생성(기존 토큰 무효화)하는 방법뿐입니다.
토큰 형식: bb_<userId>_<secret>. 모든 요청에 Authorization: Bearer <token> 으로 전달하세요.
2. POST /api/ingest — 거래 한 건 추가
요청 본문은 다음 필드를 가진 JSON 객체입니다:
title(string, 필수) — 거래 이름amount(number, 필수) — 양수여야 함type(string, 선택, 기본expense) —expense/income/prepaid_expense/pending_incomecategory(string, 선택) — 카테고리 이름note(string, 선택) — 자유 메모created_at(string, 선택) — ISO 8601, 생략 시 현재
curl -X POST https://billbook.me/api/ingest \
-H "Authorization: Bearer bb_<userId>_<secret>" \
-H "Content-Type: application/json" \
-d '{"title":"Coffee","amount":120,"type":"expense","category":"Food"}'
# response: 201
{ "id": "...", "created_at": "..." }3. GET /api/ingest/categories — 카테고리 목록 조회
admin 의 카테고리 이름을 대시보드 드롭다운 순서대로 반환합니다. 응답에는 이름 문자열만 포함되며 id 나 거래 데이터는 없습니다.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — 최근 사용한 태그
최근 업데이트된 태그 접두어(#XXX 형식)를 반환합니다. 기본 20개, ?limit= 로 조정 가능(최대 100).
tag_prefixes 테이블이 아직 없으면 오류 대신 빈 배열을 반환합니다.
curl "https://billbook.me/api/ingest/tags?limit=20" \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }5. 오류 코드
모든 오류는 JSON: { "error": "메시지" }.
401— 인증 정보 없음, 토큰 형식 오류, 폐기 또는 불일치402— 구독 만료. 쓰기에는 갱신 필요405— 메서드 미지원 (예:/api/ingest에 GET)501— 서버에SUPABASE_SERVICE_ROLE_KEY미설정500— 기타 내부 오류
6. 보안과 제한
설계상 호출자 자신의 조직에만 쓸 수 있으며, 다른 조직 사칭이나 기존 데이터 조회는 불가능합니다:
user_id는 항상 토큰 소유자 본인 — 위조 불가org_id는 항상 소유자의 조직 — 조직 간 쓰기 불가- 토큰은 admin 역할에만 발급 (manager / staff 는 403)
- 응답은 다른 행을 노출하지 않고
{ id, created_at }만 반환 - 폐기는 즉시 반영. 설정에서 언제든 갱신 가능
7. iOS 단축어 예제
"URL 콘텐츠 가져오기" 동작을 추가하고 URL 을 https://billbook.me/api/ingest, 메서드 POST, 헤더에 Authorization: Bearer bb_... 와 Content-Type: application/json, 요청 본문을 JSON {"title":"커피","amount":120,"type":"expense"} 으로 설정하세요. title 과 amount 를 단축어 입력 또는 "매번 묻기" 변수로 연결하면 됩니다.
이 문서는 빠른 참조용이며 실제 동작은 백엔드 코드를 기준으로 합니다.