نویسنده: امیررضا رحیمی
با API وردست میتوانید محصولات دستیار خود را بدون ورود دستی به پنل، بهصورت خودکار لیست، اضافه، ویرایش و حذف کنید. در این آموزش این کار را با n8n انجام میدهیم؛ همین منطق با هر ابزار دیگری (یا کد) هم کار میکند.
مفاهیم پایه
- هر دستیار دقیقاً یک پایگاه دانش (Knowledge Base) دارد که خودکار هنگام ساخت دستیار ساخته میشود.
- «محصول» یک موجودیت جدا نیست؛ یک سند در همان پایگاه دانش با نوع
Productاست. - محصولات با هدر
Vardast-Tenant-IDبه پایگاه دانش وصل میشوند و مقدار این هدر همانkb_idدستیار است. - زنجیرهٔ دسترسی اینطور است:
API key ← دستیار ← kb_id ← Vardast-Tenant-ID ← محصولات
دو مقدار ثابتی که لازم دارید
BASE_URLبرابر است باhttps://apigw.vardast.chatAPI_KEYهمان کلید API شماست.
همهٔ درخواستها با هدر X-API-Key احراز هویت میشوند.
قدم ۰ — ساخت کلید API (وبسرویس)
اگر هنوز کلید API ندارید، اول باید یک کانال وبسرویس بسازید:
- در پنل وردست وارد بخش اتصال اکانت / ساخت کانال جدید شوید.
- از میان کانالها گزینهٔ وبسرویس (API) را انتخاب کنید (اتصال وردست به سیستم یا اپلیکیشن اختصاصی شما).
- کانال را بسازید.
- سپس به تنظیمات اکانت بروید و از همانجا توکن دسترسی (همان API key) را بردارید.
همین توکن، مقداری است که در قدم بعد بهعنوان X-API-Key در n8n استفاده میکنید. آن را محرمانه نگه دارید؛ این کلید به دادههای اکانت شما دسترسی دارد.
قدم ۱ — ساخت Credential در n8n (یکبار)
در n8n مسیر Credentials را باز کنید و یک Header Auth جدید بسازید:
- مقدار Name را
X-API-Keyبگذارید. - مقدار Value را کلید API خودتان بگذارید.
آن را با نامی مثل «Vardast API Key» ذخیره کنید. از این پس در هر HTTP Request از همین Credential استفاده میکنید.
قدم ۲ — پیدا کردن kb_id دستیار (فقط یکبار)
kb_id دستیار شما ثابت است و تغییر نمیکند؛ پس فقط یکبار آن را میگیرید و ذخیره میکنید. یک HTTP Request بسازید:
- روش (Method):
GET - آدرس:
{BASE_URL}/uaa/public/messenger/api/assistants/ - احراز هویت: همان Header Auth بالا
در خروجی، دستیار خود را پیدا کنید و مقدار kb_id آن را کپی کنید. نمونهٔ خروجی:
{
"assistant_name": "نام دستیار شما",
"kb_id": "00000000-0000-0000-0000-000000000000"
}
این kb_id را در متغیرهای پروژهٔ n8n ذخیره کنید تا در همهٔ درخواستهای بعدی از آن استفاده کنید. دیگر لازم نیست هر بار این درخواست را بزنید.
قدم ۳ — گرفتن لیست محصولات
یک HTTP Request با این مشخصات بسازید:
- روش:
GET - آدرس:
{BASE_URL}/documents/knowledge/list - هدر اضافه:
Vardast-Tenant-IDبرابر باkb_id - پارامترهای Query:
typeبا مقدارProduct(اجباری)pageشمارهٔ صفحه (پیشفرض ۱)page_sizeتعداد در هر صفحه (پیشفرض ۱۰)titleبرای جستجو در نام محصول (اختیاری)
نمونهٔ پاسخ:
{
"items": [
{
"id": "doc-uuid-123",
"title": "کفش دو آبی",
"value": "{...payload کامل محصول...}",
"content": "{...متنهای قابل جستجو...}"
}
],
"total": 142,
"pages": 15,
"page": 1
}
نکتههای مهم:
- فیلد
valueخودش یک رشتهٔ JSON است؛ برای دیدن فیلدهای محصول آن را Parse کنید. - فیلد
idهمان شناسهٔ سند است که در ویرایش و حذف لازم میشود. آن را باidentifier(کد محصول) اشتباه نگیرید. - endpoint گرفتن «یک محصول تکی» وجود ندارد؛ یا با
titleجستجو کنید یا از رویidدر n8n فیلتر کنید.
قدم ۴ — افزودن محصول
بدنهٔ درخواست چهار فیلد دارد. دقت کنید که content و value خودشان رشتهٔ JSON هستند، نه شیء.
typeهمیشه برابرProducttitleنام محصولcontentمتنهای قابل جستجو (چیزی که دستیار میبیند): شاملname،description،short_descriptionvalueاطلاعات کامل محصول (چیزی که پنل نمایش میدهد)
فیلدهای داخل value:
identifierکد یا شناسهٔ محصول — اجباری، بعد از ساخت تغییرش ندهیدnameنام محصول — اجباریstockموجودیshort_descriptionتوضیح کوتاه (حداکثر ۵۰۰ کاراکتر)descriptionتوضیح کامل (حداکثر ۵۰۰ کاراکتر)priceقیمت بهصورت رشتهpermalinkلینک محصول (اگر داده شود باید HTTPS معتبر باشد)default_imageآدرس تصویر (جدا آپلود میشود)
درخواست ساخت:
- روش:
POST - آدرس:
{BASE_URL}/documents/knowledge/ - هدرها:
X-API-KeyوVardast-Tenant-IDوContent-Type: application/json
نمونهٔ بدنه:
{
"type": "Product",
"title": "کفش دو آبی",
"content": "{\"name\":\"کفش دو آبی\",\"description\":\"مناسب دویدن روزانه\",\"short_description\":\"سبک و راحت\"}",
"value": "{\"identifier\":\"1001\",\"name\":\"کفش دو آبی\",\"stock\":\"25\",\"price\":\"890000\",\"permalink\":\"\",\"default_image\":\"\"}"
}
قاعدهٔ طلایی:
contentوvalueهر دو نام و توضیحات را تکرار میکنند. همیشه هر دو را با هم و از یک منبع بسازید؛ وگرنه دادهٔ نمایشی و دادهٔ جستجوی دستیار از هم جدا میشوند و ممکن است دستیار قیمت قدیمی را به مشتری بگوید در حالیکه پنل قیمت جدید را نشان میدهد.
پاسخ موفق، شیء محصولِ ساختهشده را همراه با id برمیگرداند. این id را برای ویرایش و حذف نگه دارید.
قدم ۵ — ویرایش محصول
ویرایش از نوع جایگزینی کامل است؛ یعنی باید هر چهار فیلد را دوباره و کامل بفرستید، وگرنه داده از دست میرود. بهترین کار این است که اول محصول را با لیست بگیرید، فیلدها را تغییر دهید و کامل ارسال کنید.
- روش:
PUT - آدرس:
{BASE_URL}/documents/knowledge/{documentId} - هدرها: مثل قبل
در آدرس، {documentId} همان id محصول از خروجی لیست است. مقدار identifier را داخل value تغییر ندهید.
قدم ۶ — حذف محصول
برای حذف یک محصول:
- روش:
DELETE - آدرس:
{BASE_URL}/documents/knowledge/{documentId} - هدرها:
X-API-KeyوVardast-Tenant-ID
یک آدرس دیگر هم برای حذف همهٔ محصولات یک پایگاه دانش وجود دارد:
DELETE {BASE_URL}/documents/knowledge/all?types=Product. این کل محصولات را پاک میکند؛ با احتیاط و ترجیحاً پشت یک مرحلهٔ تأیید دستی استفاده کنید.
آپلود تصویر محصول
اگر میخواهید برای محصول تصویر بگذارید، اول تصویر را جدا آپلود کنید و سپس آدرس برگشتی را در default_image بگذارید. این تنها درخواستی است که هدر Vardast-Tenant-ID نمیخواهد:
- روش:
POST - آدرس:
{BASE_URL}/file-server/upload - بدنه: از نوع فایل (
multipart/form-data) با فیلدfile— فقط jpg یا png
در پاسخ، فیلد file_url را بردارید و در default_image داخل value محصول قرار دهید.
فایل آمادهٔ n8n (کپی و import کنید)
برای اینکه لازم نباشد نودها را از صفر بسازید، فلوی کامل CRUD زیر را آماده کردهایم. کل متن JSON را کپی کنید و در n8n، روی صفحهٔ خالی workflow آن را Paste کنید (Ctrl+V یا Cmd+V)؛ همهٔ نودها ساخته میشوند. سپس فقط نود Config را باز کنید و سه مقدار API_KEY، KB_ID و در صورت نیاز BASE_URL را پر کنید.
این فلو یک چرخهٔ کامل را نشان میدهد: لیست میگیرد، یک محصول میسازد، همان را ویرایش میکند و در پایان حذف میکند. برای کار واقعی، هر نود را جدا استفاده کنید و در ویرایش و حذف، بهجای شناسهٔ محصولِ تازهساخته، documentId محصول واقعی خود را بگذارید (نودها note راهنما دارند).
{
"name": "Vardast Products - CRUD",
"nodes": [
{
"parameters": {},
"id": "11111111-1111-1111-1111-111111111111",
"name": "Start",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [-400, 300]
},
{
"parameters": {
"assignments": {
"assignments": [
{ "id": "a1", "name": "BASE_URL", "value": "https://apigw.vardast.chat", "type": "string" },
{ "id": "a2", "name": "API_KEY", "value": "YOUR_API_KEY_HERE", "type": "string" },
{ "id": "a3", "name": "KB_ID", "value": "YOUR_KB_ID_HERE", "type": "string" }
]
},
"options": {}
},
"id": "22222222-2222-2222-2222-222222222222",
"name": "Config",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [-180, 300]
},
{
"parameters": {
"url": "={{ $json.BASE_URL }}/documents/knowledge/list",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-Key", "value": "={{ $json.API_KEY }}" },
{ "name": "Vardast-Tenant-ID", "value": "={{ $json.KB_ID }}" }
]
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{ "name": "type", "value": "Product" },
{ "name": "page", "value": "1" },
{ "name": "page_size", "value": "10" }
]
},
"options": {}
},
"id": "33333333-3333-3333-3333-333333333333",
"name": "List Products",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [140, 100]
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Config').item.json.BASE_URL }}/documents/knowledge/",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-Key", "value": "={{ $('Config').item.json.API_KEY }}" },
{ "name": "Vardast-Tenant-ID", "value": "={{ $('Config').item.json.KB_ID }}" },
{ "name": "Content-Type", "value": "application/json" }
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"type\": \"Product\",\n \"title\": \"PRODUCT_NAME\",\n \"content\": \"{\\\"name\\\":\\\"PRODUCT_NAME\\\",\\\"description\\\":\\\"DESCRIPTION\\\",\\\"short_description\\\":\\\"SHORT_DESCRIPTION\\\"}\",\n \"value\": \"{\\\"identifier\\\":\\\"SKU_CODE\\\",\\\"name\\\":\\\"PRODUCT_NAME\\\",\\\"stock\\\":\\\"0\\\",\\\"short_description\\\":\\\"SHORT_DESCRIPTION\\\",\\\"description\\\":\\\"DESCRIPTION\\\",\\\"price\\\":\\\"0\\\",\\\"permalink\\\":\\\"\\\",\\\"default_image\\\":\\\"\\\"}\"\n}",
"options": {}
},
"id": "44444444-4444-4444-4444-444444444444",
"name": "Create Product",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [140, 300]
},
{
"parameters": {
"method": "PUT",
"url": "={{ $('Config').item.json.BASE_URL }}/documents/knowledge/{{ $('Create Product').item.json.id }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-Key", "value": "={{ $('Config').item.json.API_KEY }}" },
{ "name": "Vardast-Tenant-ID", "value": "={{ $('Config').item.json.KB_ID }}" },
{ "name": "Content-Type", "value": "application/json" }
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"type\": \"Product\",\n \"title\": \"PRODUCT_NAME\",\n \"content\": \"{\\\"name\\\":\\\"PRODUCT_NAME\\\",\\\"description\\\":\\\"NEW_DESCRIPTION\\\",\\\"short_description\\\":\\\"SHORT_DESCRIPTION\\\"}\",\n \"value\": \"{\\\"identifier\\\":\\\"SKU_CODE\\\",\\\"name\\\":\\\"PRODUCT_NAME\\\",\\\"stock\\\":\\\"0\\\",\\\"short_description\\\":\\\"SHORT_DESCRIPTION\\\",\\\"description\\\":\\\"NEW_DESCRIPTION\\\",\\\"price\\\":\\\"0\\\",\\\"permalink\\\":\\\"\\\",\\\"default_image\\\":\\\"\\\"}\"\n}",
"options": {}
},
"id": "55555555-5555-5555-5555-555555555555",
"name": "Update Product",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [420, 300]
},
{
"parameters": {
"method": "DELETE",
"url": "={{ $('Config').item.json.BASE_URL }}/documents/knowledge/{{ $('Create Product').item.json.id }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-Key", "value": "={{ $('Config').item.json.API_KEY }}" },
{ "name": "Vardast-Tenant-ID", "value": "={{ $('Config').item.json.KB_ID }}" }
]
},
"options": {}
},
"id": "66666666-6666-6666-6666-666666666666",
"name": "Delete Product",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [700, 300]
}
],
"connections": {
"Start": { "main": [[{ "node": "Config", "type": "main", "index": 0 }]] },
"Config": { "main": [[
{ "node": "List Products", "type": "main", "index": 0 },
{ "node": "Create Product", "type": "main", "index": 0 }
]] },
"Create Product": { "main": [[{ "node": "Update Product", "type": "main", "index": 0 }]] },
"Update Product": { "main": [[{ "node": "Delete Product", "type": "main", "index": 0 }]] }
},
"settings": { "executionOrder": "v1" }
}
سه شناسهای که نباید اشتباه گرفته شوند
kb_idشناسهٔ پایگاه دانش است و مقدار هدرVardast-Tenant-IDرا میسازد.id(یا documentId) شناسهٔ سند محصول است و در آدرس ویرایش و حذف میآید.identifierکد تجاری محصول (SKU) است، داخلvalueقرار دارد و ثابت میماند.
جمعبندی جدول آدرسها
- لیست دستیارها برای گرفتن kb_id:
GET /uaa/public/messenger/api/assistants/ - لیست و جستجوی محصولات:
GET /documents/knowledge/list?type=Product - ساخت محصول:
POST /documents/knowledge/ - ویرایش محصول:
PUT /documents/knowledge/{documentId} - حذف یک محصول:
DELETE /documents/knowledge/{documentId} - حذف همهٔ محصولات:
DELETE /documents/knowledge/all?types=Product - آپلود تصویر:
POST /file-server/upload
با همین چند درخواست میتوانید در n8n یک فلوی کامل بسازید که محصولات فروشگاه شما را با دستیار وردست همگام نگه دارد.