راهنمای کامل برای توسعهدهندگانی که میخواهند به 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=25json
{
"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` را با دامنه واقعی سایت خود جایگزین کنید.