مستندات API

راهنمای کامل برای توسعه‌دهندگانی که می‌خواهند به REST API نرم‌افزار CRM لویال‌اکسیس متصل شوند: احراز هویت، فرمت درخواست‌ها و مثال‌های کاربردی برای رایج‌ترین عملیات‌ها.


API لویال‌اکسیس CRM چیست؟

API لویال‌اکسیس CRM یک REST API است که روی REST API خود وردپرس ساخته شده. این API به یک اپلیکیشن خارجی — یک وب‌سایت، یک اپ موبایل، یک CRM دیگر یا یک اسکریپت اتوماسیون — اجازه می‌دهد مستقیماً و از طریق HTTPS با CRM شما ارتباط برقرار کند.
کاربردهای رایج:
  • ساخت یا به‌روزرسانی **Lead** ها از فرم یک وب‌سایت خارجی، لندینگ‌پیج یا پلتفرم تبلیغاتی.
  • خواندن یا به‌روزرسانی کارت‌های **فرصت فروش** یک مشتری از یک سیستم دیگر.
  • جست‌وجو یا ساخت **کاربر CRM** از یک اپ موبایل یا پرتال شخص‌ثالث.
  • کشیدن داده‌های داشبورد، کانبان یا گزارش‌ها به یک ابزار BI خارجی.
  • خودکارسازی فرآیندهایی که قبلاً باید داخل پنل CRM به‌صورت دستی انجام می‌شدند.
هر درخواست احراز هویت می‌شود، بر پایه JSON است و کد وضعیت HTTP قابل‌پیش‌بینی برمی‌گرداند؛ بنابراین هر زبان یا پلتفرمی که بتواند درخواست HTTPS بفرستد می‌تواند از این API استفاده کند.

فعال‌سازی API

* پیش از شروع: REST API به‌صورت پیش‌فرض **غیرفعال** است. یک ادمین باید پیش از پاسخ‌گویی هر اندپوینت آن را فعال کند. خطوط زیر را به فایل `wp-config.php` سایت خود اضافه کنید:
php
define( 'LA24_API_ENABLED', true );
define( 'hash_key_jwt_token', 'YOUR_CUSTOM_SECRET_KEY' );
define( 'jwt_auth_expire', 604800 ); // مدت اعتبار توکن به ثانیه، پیش‌فرض ۷ روز
ثابت (Constant)ضروریتوضیح
`LA24_API_ENABLED`بلهباید `true` باشد تا اندپوینت‌های API در دسترس قرار بگیرند.
`hash_key_jwt_token`بلهکلید مخفی برای امضا و اعتبارسنجی توکن‌های احراز هویت. یک رشتهٔ طولانی و تصادفی انتخاب کنید و آن را محرمانه نگه دارید.
`jwt_auth_expire`خیرمدت اعتبار توکن به ثانیه. در صورت عدم تعریف، پیش‌فرض ۷ روز (`604800`) است.

آدرس پایه و فرمت درخواست

تمام اندپوینت‌ها زیر پیشوند استاندارد REST API وردپرس سرو می‌شوند:
javascript
https://yourdomain.com/wp-json/{namespace}/v{version}/{endpoint}
  • `yourdomain.com` — دامنه واقعی سایت خودتان را جایگزین کنید.
  • `{namespace}` — ماژول مربوطه را مشخص می‌کند (جدول زیر).
  • `v{version}` — نسخهٔ API آن ماژول، مثلاً `v1`.
  • `{endpoint}` — عملیات مشخص، مثل `lead` یا `get-kanban`.
Namespaceماژولمثال
`core`احراز هویت (صدور/اعتبارسنجی توکن)`/wp-json/core/token`
`ums`کاربران و Lead ها`/wp-json/ums/v1/lead`
`sales-opportunity`Sales Opportunity (پایپ‌لاین فروش)`/wp-json/sales-opportunity/v1/get-kanban`
`knowledge`پایگاه دانش`/wp-json/knowledge/v1/...`
`support`تیکت‌های پشتیبانی`/wp-json/support/v1/...`
`notifications`اعلان‌ها`/wp-json/notifications/v1/...`
`warehouse`انبار / موجودی`/wp-json/warehouse/v1/...`
`accounting`حسابداری`/wp-json/accounting/v1/...`
**فرمت درخواست**
  • بادی درخواست‌های `POST`، `PATCH` و `DELETE` را به‌صورت JSON و با هدر `Content-Type: application/json` ارسال کنید. اکثر اندپوینت‌ها فرمت form-encoded را هم می‌پذیرند، اما JSON توصیه می‌شود.
  • پارامترهای `GET` را به‌صورت query string استاندارد ارسال کنید.
  • خروجی همهٔ اندپوینت‌ها، مستقل از متد یا نتیجه، JSON است.

احراز هویت

این API از احراز هویت مبتنی بر **JWT (JSON Web Token)** استفاده می‌کند. یک‌بار نام کاربری و رمز عبور را با یک توکن مبادله می‌کنید، سپس آن توکن را در تمام درخواست‌های بعدی ارسال می‌کنید.

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

فیلدمحلضروریتوضیح
`username`Bodyبلهنام کاربری یک کاربر CRM که دسترسی API دارد (معمولاً ادمین).
`password`Bodyبلهرمز عبور همان کاربر.
javascript
POST /wp-json/core/token
**نمونه پاسخ**
json
{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
  "user_email": "admin@yourdomain.com",
  "user_nicename": "admin",
  "user_display_name": "Site Admin"
}
فیلدتوضیح
`token`JWT که باید در هدر `Authorization` هر درخواست بعدی ارسال شود.
`user_email`ایمیل کاربر احراز هویت‌شده.
`user_nicename`نام مستعار (nicename) کاربر در وردپرس.
`user_display_name`نام نمایشی کاربر.

مرحله ۲ — ارسال توکن در هر درخواست

این هدر را به هر درخواست احراز هویت‌شده اضافه کنید:
javascript
Authorization: Bearer {token}

مرحله ۳ — اعتبارسنجی توکن (اختیاری)

javascript
POST /wp-json/core/token/validate
هدرضروریتوضیح
`Authorization`بله`Bearer {token}` — توکنی که باید بررسی شود.
توکن معتبر این پاسخ را برمی‌گرداند:
json
{
  "code": "jwt_auth_valid_token",
  "data": { "status": 200 }
}

خطاهای توکن

خطاهای احراز هویت با این ساختار برمی‌گردند (توجه کنید که ساختار خطا با خطاهای معمول اندپوینت‌ها متفاوت است — به بخش [فرمت درخواست و پاسخ](#فرمت-درخواست-و-پاسخ) مراجعه کنید):
json
{
  "code": "[jwt_auth] incorrect_password",
  "message": "The password you entered is incorrect.",
  "data": { "status": 403 }
}
کدهای رایج: `incorrect_password`، `invalid_username` (ورود اشتباه)، `jwt_auth_no_auth_header` (هدر `Authorization` وجود ندارد)، `jwt_auth_bad_auth_header` (فرمت هدر `Bearer ` نیست)، `jwt_auth_invalid_token` (توکن منقضی یا دستکاری‌شده)، `jwt_auth_bad_iss` (توکن توسط سایت دیگری صادر شده).

اولین درخواست شما به API

در این بخش با دو درخواست به یک پاسخ واقعی از API می‌رسید: گرفتن توکن، سپس دریافت اطلاعات یک Lead.

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

**cURL**
bash
curl -X POST https://yourdomain.com/wp-json/core/token \
  -d "username=your_admin_username" \
  -d "password=your_admin_password"
**جاوااسکریپت (fetch)**
javascript
const response = await fetch('https://yourdomain.com/wp-json/core/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    username: 'your_admin_username',
    password: 'your_admin_password',
  }),
});

const { token } = await response.json();
console.log(token);
**PHP**
php
$response = wp_remote_post( 'https://yourdomain.com/wp-json/core/token', array(
    'body' => array(
        'username' => 'your_admin_username',
        'password' => 'your_admin_password',
    ),
) );

$body  = json_decode( wp_remote_retrieve_body( $response ), true );
$token = $body['token'] ?? null;

مرحله ۲ — فراخوانی یک اندپوینت با توکن

مثال: دریافت اطلاعات یک Lead با شناسه (`GET /ums/v1/lead/:id`).
**cURL**
bash
curl -X GET https://yourdomain.com/wp-json/ums/v1/lead/123 \
  -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
**جاوااسکریپت (fetch)**
javascript
const response = await fetch('https://yourdomain.com/wp-json/ums/v1/lead/123', {
  method: 'GET',
  headers: { 'Authorization': `Bearer ${token}` },
});

const result = await response.json();
console.log(result);
**PHP**
php
$response = wp_remote_get( 'https://yourdomain.com/wp-json/ums/v1/lead/123', array(
    'headers' => array(
        'Authorization' => 'Bearer ' . $token,
    ),
) );

$result = json_decode( wp_remote_retrieve_body( $response ), true );

نمونه پاسخ

json
{
  "status": 200,
  "message": "Lead retrieved successfully.",
  "data": {
    "id": 123,
    "display_name": "John Doe",
    "email": "john@example.com",
    "registered_date": "2026-05-01 10:12:00",
    "customer_type": "1",
    "first_name": "John",
    "last_name": "Doe",
    "phone": "+989123456789",
    "phone_numbers": [
      { "tell": "+989123456789", "desc": "", "default": "1" }
    ],
    "gender": "1",
    "job": "Manager",
    "created_by": { "id": 1, "name": "Site Admin" }
  }
}

توضیح فیلد به فیلد

فیلدنوعتوضیح
`status`Numberکد وضعیت که مشابه HTTP status در بادی تکرار می‌شود (`200` یعنی موفق).
`message`Stringخلاصهٔ قابل‌خواندن نتیجه.
`data.id`Numberشناسهٔ یکتای Lead.
`data.display_name`Stringنام نمایشی در CRM.
`data.email`Stringایمیل Lead.
`data.registered_date`Stringزمان ایجاد Lead (`Y-m-d H:i:s`).
`data.customer_type`String`1` = شخص حقیقی، `2` = شرکت.
`data.first_name` / `data.last_name`Stringفیلدهای نام (برای شخص حقیقی).
`data.company_name`Stringفقط زمانی وجود دارد که `customer_type` برابر `2` باشد.
`data.phone`Stringشماره تماس اصلی.
`data.phone_numbers`Arrayتمام شماره‌های ثبت‌شده، هرکدام با `tell`، `desc` و `default`.
`data.gender`String`1` = مرد، `2` = زن.
`data.job`Stringعنوان شغلی، در صورت وارد شدن.
`data.created_by`Objectکاربر CRM (`id`, `name`) که این Lead را ایجاد کرده.

مرور کلی مستندات API

کشف اندپوینت‌ها

تمام اندپوینت‌های CRM بر اساس ماژول دسته‌بندی شده‌اند (`Authentication`، `Leads`، `SalesOpportunity`، `Player`، پایگاه دانش، پشتیبانی، اعلان‌ها، انبار، حسابداری و موارد دیگر). فهرست کامل و همیشه به‌روز تمام اندپوینت‌ها — با تمام پارامترها و مثال‌ها — در لینک بخش [مرجع رسمی API](#مرجع-رسمی-api) منتشر شده. این راهنما مفاهیم اصلی و رایج‌ترین عملیات‌ها را پوشش می‌دهد؛ برای فهرست کامل اندپوینت‌ها از آن مرجع استفاده کنید.

فرمت درخواست و پاسخ

تقریباً تمام اندپوینت‌های ماژول‌ها یک ساختار یکسان برمی‌گردانند:
json
{
  "status": 200,
  "message": "پیام قابل‌خواندن اختیاری.",
  "data": {}
}
فیلدهمیشه موجودتوضیح
`status`بلهکد وضعیت عددی، مشابه HTTP status.
`message`معمولاًتوضیح کوتاه نتیجه، مناسب برای لاگ یا نمایش.
`data`در صورت موفقیتمحتوای اصلی پاسخ — یک آبجکت، آرایه یا فهرست رکورد.
**اندپوینت‌های احراز هویت** (`/core/token`، `/core/token/validate`) تنها استثنا هستند: در صورت خطا، یک آبجکت به سبک خطای وردپرس برمی‌گردانند:
json
{
  "code": "jwt_auth_invalid_token",
  "message": "Signature verification failed.",
  "data": { "status": 403 }
}
همیشه ابتدا **کد وضعیت HTTP** پاسخ را بررسی کنید — این کد معتبرترین منبع است — و از `status`/`code` و `message` در بادی برای نمایش یا لاگ جزئیات استفاده کنید.

کدهای وضعیت HTTP

کدمعنی
`200`موفقیت‌آمیز.
`400`درخواست نامعتبر — یک پارامتر ضروری غایب یا نامعتبر است.
`403`ممنوع — توکن غایب/نامعتبر است، یا کاربر احراز هویت‌شده مجوز این عملیات را ندارد.
`404`یافت نشد — رکورد (Lead، کارت، برد و غیره) وجود ندارد.
`500`خطای سرور — پردازش درخواست با خطا مواجه شده؛ برای جزئیات به `message` نگاه کنید.

صفحه‌بندی (Pagination)

اندپوینت‌های فهرستی که ممکن است رکوردهای زیادی برگردانند، پارامترهای query به نام `page` و `per_page` می‌پذیرند و یک آبجکت `pagination` برمی‌گردانند:
javascript
GET /wp-json/sales-opportunity/v1/get-cards?page=2&per_page=25
json
{
  "status": 200,
  "data": [ /* رکوردهای این صفحه */ ],
  "pagination": {
    "page": 2,
    "per_page": 25,
    "total": 118,
    "total_pages": 5
  }
}
فیلدتوضیح
`page`صفحه‌ای که درخواست کرده‌اید (پیش‌فرض `1`).
`per_page`تعداد رکورد در هر صفحه (پیش‌فرض معمولاً `25`، بسته به اندپوینت).
`total`تعداد کل رکوردهای منطبق در تمام صفحات.
`total_pages`تعداد کل صفحات موجود.

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

اکثر اندپوینت‌های فهرستی یک پارامتر `s` برای جست‌وجوی متنی آزاد می‌پذیرند (نام، ایمیل یا عنوان، بسته به اندپوینت)، به‌علاوهٔ فیلترهای مخصوص هر اندپوینت مثل `date_from` / `date_to`، `user_id`، `tag` یا `type`. برخی اندپوینت‌های فهرستی همچنین پارامتر `sort` برای مرتب‌سازی نتایج می‌پذیرند (مقادیر مجاز در مرجع کامل، برای هر اندپوینت مستند شده است). فیلترهایی که یک اندپوینت پشتیبانی نمی‌کند به‌سادگی نادیده گرفته می‌شوند — برای فهرست دقیق هر اندپوینت به مستندات همان اندپوینت مراجعه کنید.

مدیریت خطاها

۱. ابتدا کد وضعیت HTTP را بررسی کنید. ۲. اگر `2xx` نبود، دلیل را از `message` (یا `code` برای اندپوینت‌های احراز هویت) بخوانید. ۳. برای `403` روی اندپوینت‌های غیرِ احراز هویت، ابتدا فرض کنید توکن منقضی شده و دوباره احراز هویت کنید؛ سپس اگر باز هم خطا گرفتید، مشکل را دسترسی (permission) بدانید. ۴. برای `400`، بادی/پارامترهای ذکرشده در `message` را اصلاح کرده و دوباره تلاش کنید.

مثال‌ها

در تمام مثال‌های زیر فرض شده یک توکن معتبر در متغیر `token` دارید و آن را به‌صورت `Authorization: Bearer {token}` ارسال می‌کنید.

دریافت داده (Retrieving data)

bash
curl -X GET "https://yourdomain.com/wp-json/ums/v1/lead/123" \
  -H "Authorization: Bearer your_token_here"

جست‌وجوی رکوردها (Searching)

bash
curl -X GET "https://yourdomain.com/wp-json/sales-opportunity/v1/search-leads?s=john&limit=10" \
  -H "Authorization: Bearer your_token_here"
json
{
  "status": 200,
  "data": [
    {
      "id": 123,
      "label": "John Doe",
      "name": "John Doe",
      "email": "john@example.com",
      "profile_url": "https://yourdomain.com/panel/profile/?id=123&clue=on",
      "type": "clue"
    }
  ]
}

ساخت رکورد (Creating)

bash
curl -X POST "https://yourdomain.com/wp-json/ums/v1/lead" \
  -H "Authorization: Bearer your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "John",
    "last_name": "Doe",
    "lead_email": "john@example.com",
    "phone": "+989123456789",
    "customer_type": "1"
  }'
json
{
  "status": 200,
  "message": "Lead created successfully.",
  "data": {
    "status": true,
    "profile_id": 124,
    "profile_link": "https://yourdomain.com/panel/profile/?id=124",
    "display_name": "John Doe"
  }
}

به‌روزرسانی رکورد (Updating)

متد `PATCH` فقط فیلدهایی را که ارسال می‌کنید به‌روزرسانی می‌کند؛ سایر فیلدهای رکورد دست‌نخورده باقی می‌مانند.
bash
curl -X PATCH "https://yourdomain.com/wp-json/ums/v1/lead/124" \
  -H "Authorization: Bearer your_token_here" \
  -H "Content-Type: application/json" \
  -d '{ "phone": "+989350000000" }'
json
{
  "status": 200,
  "message": "Lead updated successfully.",
  "data": {
    "status": true,
    "profile_id": 124,
    "profile_link": "https://yourdomain.com/panel/profile/?id=124",
    "display_name": "John Doe"
  }
}

حذف رکورد (Deleting)

bash
curl -X DELETE "https://yourdomain.com/wp-json/ums/v1/lead/124" \
  -H "Authorization: Bearer your_token_here"
json
{
  "status": 200,
  "message": "Lead deleted successfully.",
  "data": { "success": true, "lead_id": 124 }
}

فهرست صفحه‌بندی‌شده با فیلتر

bash
curl -X GET "https://yourdomain.com/wp-json/sales-opportunity/v1/get-cards?so_id=1&page=1&per_page=25&s=john" \
  -H "Authorization: Bearer your_token_here"

مدیریت خطاهای احراز هویت

**توکن ارسال نشده**
bash
curl -X GET "https://yourdomain.com/wp-json/ums/v1/lead/123"
json
{ "status": 403, "message": "The request cannot be processed." }
**توکن منقضی یا نامعتبر**
json
{
  "code": "jwt_auth_invalid_token",
  "message": "Expired token",
  "data": { "status": 403 }
}
وقتی با یک `403` همراه با کد `jwt_auth_*` مواجه شدید، یک توکن جدید بگیرید (بخش [احراز هویت](#احراز-هویت)) و دوباره تلاش کنید. اگر `403` با ساختار ساده `status`/`message` برگشت، توکن معتبر است ولی کاربر مجوز آن عملیات را ندارد — نقش و دسترسی‌های کاربر را در CRM بررسی کنید.

مرجع رسمی API

این راهنما مفاهیم لازم برای شروع کار را پوشش می‌دهد. برای مرجع کامل و اندپوینت‌به‌اندپوینت — تمام پارامترها، تمام فیلدهای پاسخ و تمام ماژول‌ها — به مستندات رسمی API لویال‌اکسیس CRM مراجعه کنید:
> در تمام مثال‌های این راهنما، `yourdomain.com` را با دامنه واقعی سایت خود جایگزین کنید.