Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/docs/API_GUIDELINES.md
2026-04-14 19:34:55 +03:30

14 KiB
Executable file

📚 راهنمای جامع استفاده از Hesabix API

فهرست مطالب

  1. شروع سریع
  2. احراز هویت
  3. صفحه‌بندی
  4. فیلتر و جستجو
  5. مرتب‌سازی
  6. مدیریت خطاها
  7. Rate Limiting
  8. چندزبانه
  9. تقویم
  10. Versioning
  11. Best Practices

🚀 شروع سریع

دسترسی به مستندات

اولین درخواست

# 1. بررسی وضعیت API
curl https://agent.hesabix.ir/api/v1/health

# 2. دریافت کپچا
curl -X POST https://agent.hesabix.ir/api/v1/auth/captcha

# 3. ثبت‌نام
curl -X POST https://agent.hesabix.ir/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -H "Accept-Language: fa" \
  -d '{
    "first_name": "احمد",
    "last_name": "احمدی",
    "email": "ahmad@example.com",
    "password": "SecurePassword123!",
    "captcha_id": "...",
    "captcha_code": "12345"
  }'

🔐 احراز هویت

نوع احراز هویت

Hesabix API از API Key Authentication استفاده می‌کند.

فرمت Header

Authorization: Bearer sk_your_api_key_here

انواع کلید API

1. Session Keys (موقت)

  • با ورود/ثبت‌نام ایجاد می‌شوند
  • مدت اعتبار: 30 روز
  • فرمت: sk_session_...
  • استفاده: برای web apps و موبایل apps

2. Personal Keys (دائمی)

  • توسط کاربر ایجاد می‌شوند
  • بدون تاریخ انقضا
  • فرمت: sk_personal_...
  • استفاده: برای یکپارچه‌سازی‌ها و automation

نحوه دریافت کلید

روش 1: ثبت‌نام

POST /api/v1/auth/register

روش 2: ورود

POST /api/v1/auth/login

روش 3: ایجاد کلید شخصی

POST /api/v1/auth/api-keys
Authorization: Bearer sk_session_...

{
  "name": "Integration Key",
  "scopes": "read,write",
  "expires_at": null
}

مثال کامل

# ورود و دریافت کلید
curl -X POST https://agent.hesabix.ir/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "identifier": "ahmad@example.com",
    "password": "SecurePassword123!",
    "captcha_id": "...",
    "captcha_code": "12345"
  }'

# استفاده از کلید
curl https://agent.hesabix.ir/api/v1/auth/me \
  -H "Authorization: Bearer sk_session_abc123..."

📄 صفحه‌بندی

روش استاندارد: Skip & Take

تمام endpoint های لیست از skip و take استفاده می‌کنند:

{
  "skip": 0,
  "take": 20
}

پارامترها:

  • skip: تعداد رکوردی که از ابتدا رد می‌شود (پیش‌فرض: 0)
  • take: تعداد رکورد در هر صفحه (پیش‌فرض: 10، حداکثر: 1000)

مثال

# صفحه اول (رکورد 1-20)
curl -X POST https://agent.hesabix.ir/api/v1/businesses/1/transfers \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "skip": 0,
    "take": 20
  }'

# صفحه دوم (رکورد 21-40)
curl -X POST https://agent.hesabix.ir/api/v1/businesses/1/transfers \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "skip": 20,
    "take": 20
  }'

پاسخ

{
  "success": true,
  "data": {
    "items": [...],
    "total_count": 156,
    "has_more": true
  }
}

🔍 فیلتر و جستجو

جستجوی ساده

{
  "search": "احمد",
  "search_fields": ["name", "email", "mobile"]
}

فیلترهای پیشرفته

استفاده از آرایه filters:

{
  "filters": [
    {
      "property": "total_amount",
      "operator": ">=",
      "value": 1000000
    },
    {
      "property": "status",
      "operator": "in",
      "value": ["active", "pending"]
    },
    {
      "property": "name",
      "operator": "*",
      "value": "احمد"
    }
  ]
}

عملگرهای موجود

عملگر نام توضیح مثال
= برابر برابری دقیق {"property": "status", "operator": "=", "value": "active"}
!= نابرابر عدم برابری {"property": "is_deleted", "operator": "!=", "value": true}
> بزرگتر بزرگتر از {"property": "age", "operator": ">", "value": 18}
>= بزرگتر مساوی بزرگتر یا مساوی {"property": "amount", "operator": ">=", "value": 1000}
< کوچکتر کوچکتر از {"property": "quantity", "operator": "<", "value": 10}
<= کوچکتر مساوی کوچکتر یا مساوی {"property": "price", "operator": "<=", "value": 5000}
* شامل شامل (در هر جای متن) {"property": "description", "operator": "*", "value": "خرید"}
*? شروع با شروع می‌شود با {"property": "code", "operator": "*?", "value": "P"}
?* پایان با پایان می‌یابد با {"property": "email", "operator": "?*", "value": "@gmail.com"}
in موجود در موجود در لیست {"property": "type", "operator": "in", "value": ["sale", "purchase"]}
not_in موجود نیست موجود نیست در لیست {"property": "status", "operator": "not_in", "value": ["deleted", "cancelled"]}
is_null خالی است مقدار null دارد {"property": "deleted_at", "operator": "is_null", "value": null}
is_not_null خالی نیست مقدار null ندارد {"property": "confirmed_at", "operator": "is_not_null", "value": null}

مثال کامل

curl -X POST https://agent.hesabix.ir/api/v1/businesses/1/transfers \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "take": 50,
    "skip": 0,
    "search": "بانک",
    "filters": [
      {
        "property": "total_amount",
        "operator": ">=",
        "value": 1000000
      },
      {
        "property": "document_date",
        "operator": ">=",
        "value": "2024-01-01"
      }
    ]
  }'

📊 مرتب‌سازی

پارامترها

{
  "sort_by": "created_at",
  "sort_desc": true
}

پارامترها:

  • sort_by: نام فیلد مورد نظر
  • sort_desc: true = نزولی (Z-A, 9-1), false = صعودی (A-Z, 1-9)

فیلدهای معمول برای مرتب‌سازی

  • created_at - تاریخ ایجاد
  • updated_at - تاریخ ویرایش
  • name - نام
  • code - کد
  • total_amount - مبلغ
  • document_date - تاریخ سند

مثال

{
  "sort_by": "total_amount",
  "sort_desc": true,
  "take": 20,
  "skip": 0
}

⚠️ مدیریت خطاها

فرمت پاسخ خطا

{
  "success": false,
  "error_code": "VALIDATION_ERROR",
  "message": "داده‌های ورودی نامعتبر است",
  "details": [
    {
      "field": "email",
      "message": "فرمت ایمیل نامعتبر است",
      "code": "INVALID_EMAIL_FORMAT"
    }
  ],
  "timestamp": "2024-01-15T10:30:00Z",
  "path": "/api/v1/users"
}

کدهای خطای رایج

کد HTTP کد خطا توضیح
400 VALIDATION_ERROR خطا در اعتبارسنجی داده‌ها
400 INVALID_INPUT ورودی نامعتبر
401 UNAUTHORIZED احراز هویت نشده
401 INVALID_API_KEY کلید API نامعتبر
403 FORBIDDEN عدم دسترسی
403 INSUFFICIENT_PERMISSIONS مجوزهای کافی نیست
404 NOT_FOUND منبع یافت نشد
409 DUPLICATE_ENTRY رکورد تکراری
429 RATE_LIMIT_EXCEEDED تعداد درخواست بیش از حد
500 INTERNAL_SERVER_ERROR خطای سرور
503 SERVICE_UNAVAILABLE سرویس در دسترس نیست

مثال مدیریت خطا (JavaScript)

try {
  const response = await fetch('https://agent.hesabix.ir/api/v1/transfers/123', {
    headers: {
      'Authorization': 'Bearer sk_...',
    }
  });
  
  const data = await response.json();
  
  if (!data.success) {
    switch(data.error_code) {
      case 'UNAUTHORIZED':
        // هدایت به صفحه ورود
        window.location.href = '/login';
        break;
      case 'NOT_FOUND':
        // نمایش پیام منبع یافت نشد
        showError('سند مورد نظر یافت نشد');
        break;
      case 'VALIDATION_ERROR':
        // نمایش خطاهای فیلدها
        data.details.forEach(err => {
          showFieldError(err.field, err.message);
        });
        break;
      default:
        // خطای عمومی
        showError(data.message);
    }
  }
} catch (error) {
  // خطای شبکه
  showError('خطا در برقراری ارتباط با سرور');
}

🚦 Rate Limiting

محدودیت‌های فعلی

Endpoint Type محدودیت بازه زمانی
عمومی 100 درخواست 1 دقیقه
احراز هویت 5 درخواست 1 ساعت
ثبت‌نام 5 درخواست 1 ساعت
کپچا 20 درخواست 1 دقیقه

Headers پاسخ

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1705315800

پاسخ محدودیت

{
  "success": false,
  "error_code": "RATE_LIMIT_EXCEEDED",
  "message": "تعداد درخواست‌های شما بیش از حد مجاز است",
  "retry_after": 60
}

بهترین روش‌ها

  1. ✅ ذخیره‌سازی پاسخ‌ها (Caching)
  2. ✅ استفاده از Batch Operations
  3. ✅ بررسی headers قبل از درخواست بعدی
  4. ✅ Exponential Backoff برای retry

🌍 چندزبانه (i18n)

Header زبان

Accept-Language: fa

زبان‌های پشتیبانی شده

  • fa - فارسی (پیش‌فرض)
  • en - انگلیسی
  • fa-IR - فارسی ایران
  • en-US - انگلیسی آمریکا

مثال

# فارسی
curl https://agent.hesabix.ir/api/v1/auth/me \
  -H "Authorization: Bearer sk_..." \
  -H "Accept-Language: fa"

# انگلیسی
curl https://agent.hesabix.ir/api/v1/auth/me \
  -H "Authorization: Bearer sk_..." \
  -H "Accept-Language: en"

📅 تقویم

Header تقویم

X-Calendar-Type: jalali

انواع تقویم

  • jalali - تقویم شمسی (پیش‌فرض)
  • gregorian - تقویم میلادی

نکته

  • تاریخ‌ها در پاسخ بر اساس تقویم انتخابی فرمت می‌شوند
  • تاریخ‌ها در request می‌توانند ISO (YYYY-MM-DD) یا جلالی (YYYY/MM/DD) باشند

مثال

curl https://agent.hesabix.ir/api/v1/businesses/1/transfers \
  -H "Authorization: Bearer sk_..." \
  -H "X-Calendar-Type: jalali"

پاسخ:

{
  "document_date": "1403/10/15",
  "created_at": "1403/10/15 14:30:00"
}

🔄 Versioning

نسخه فعلی: v1

https://agent.hesabix.ir/api/v1/

استراتژی Versioning

  • نسخه در URL قرار دارد
  • نسخه‌های قدیمی حداقل 12 ماه پشتیبانی می‌شوند
  • تغییرات Breaking در نسخه جدید اعمال می‌شوند
  • تغییرات Non-breaking در همان نسخه اضافه می‌شوند

تغییرات Non-breaking

  • افزودن endpoint جدید
  • افزودن فیلد اختیاری
  • افزودن enum value جدید

تغییرات Breaking

  • حذف endpoint
  • حذف فیلد
  • تغییر نوع فیلد
  • تغییر رفتار موجود

✨ Best Practices

1. امنیت

// ❌ بد
const API_KEY = 'sk_...'; // hardcoded

// ✅ خوب
const API_KEY = process.env.HESABIX_API_KEY;

2. Error Handling

// ❌ بد
const data = await api.get('/users');
console.log(data.items);

// ✅ خوب
try {
  const response = await api.get('/users');
  if (response.success) {
    console.log(response.data.items);
  } else {
    handleError(response.error_code, response.message);
  }
} catch (error) {
  handleNetworkError(error);
}

3. Pagination

// ❌ بد - دریافت همه رکوردها یکجا
const all = await api.get('/transfers?take=10000');

// ✅ خوب - pagination
let skip = 0;
const take = 100;
while (true) {
  const response = await api.post('/transfers', { skip, take });
  processItems(response.data.items);
  if (!response.data.has_more) break;
  skip += take;
}

4. Rate Limiting

// ✅ خوب - بررسی rate limit
async function apiCall(url, options) {
  const response = await fetch(url, options);
  
  if (response.status === 429) {
    const retryAfter = response.headers.get('Retry-After');
    await sleep(retryAfter * 1000);
    return apiCall(url, options); // retry
  }
  
  return response.json();
}

5. Caching

// ✅ خوب - کش کردن داده‌های ثابت
const cache = new Map();

async function getCategories() {
  if (cache.has('categories')) {
    return cache.get('categories');
  }
  
  const data = await api.get('/categories');
  cache.set('categories', data, { ttl: 3600 }); // 1 hour
  return data;
}

6. Batch Operations

// ❌ بد - تک تک
for (const id of productIds) {
  await api.delete(`/products/${id}`);
}

// ✅ خوب - گروهی
await api.post('/products/bulk-delete', {
  ids: productIds
});

📞 پشتیبانی


📝 تغییرات و به‌روزرسانی‌ها

برای مطلع شدن از آخرین تغییرات:


نسخه مستندات: 1.0.0
آخرین به‌روزرسانی: 2024-12-04