API حسابداری از راه دور
آخرین بهروزرسانی: ۱۰ مه ۲۰۲۶
با یک توکن 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 را به ترتیب منوی کشویی داشبورد بازمیگرداند. پاسخ فقط شامل نامهاست — بدون ids، user ids یا داده تراکنش.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — برچسبهای اخیراً استفادهشده
جدیدترین پیشوندهای برچسب بهروزشده (نشانگرهای #XXX جاسازیشده در عناوین) را بازمیگرداند. پیشفرض ۲۰؛ برای بازنویسی ?limit= را بفرستید (حداکثر ۱۰۰).
اگر جدول 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": "message" }.
401— نبود مجوز، توکن نادرست، باطلشده یا ناهماهنگ402— اشتراک منقضی شده؛ برای نوشتن تمدید لازم است405— متد پشتیبانی نمیشود (مثلاً GET روی/api/ingest)501— سرورSUPABASE_SERVICE_ROLE_KEYرا ندارد500— خطای داخلی دیگر
6. امنیت و محدودیتها
بنا به طراحی، توکن فقط میتواند در سازمان خودش بنویسد — نمیتواند خود را به جای orgs دیگر جا بزند یا دادههای موجود را بخواند:
user_idهمیشه مالک توکن است؛ قابل جعل نیستorg_idهمیشه org مالک است؛ نوشتن بین orgs غیرممکن است- توکنها فقط به نقش admin صادر میشوند (manager / staff کد 403 میگیرند)
- پاسخها هرگز ردیفهای دیگر را افشا نمیکنند — فقط
{ id, created_at }بازگردانده میشود - باطلسازی فوری است؛ هر زمان از تنظیمات بچرخانید
7. نمونه میانبر iOS
یک کنش «Get Contents of URL» اضافه کنید، URL را روی https://billbook.me/api/ingest، متد POST، هدرها Authorization: Bearer bb_... و Content-Type: application/json، و بدنه درخواست بهصورت JSON: {"title":"قهوه","amount":120,"type":"expense"} تنظیم کنید. title و amount را به ورودی میانبر یا متغیرهای «هر بار بپرس» متصل کنید.
این سند یک مرجع سریع است؛ کد backend منبع حقیقت برای رفتار واقعی است.