نسخه آزمایشی

API چت

وب‌سایت، اپلیکیشن یا نرم‌افزار خودتان را به یکی از کارمندان مجازی‌تان وصل کنید. سرور شما پیام بازدیدکننده را می‌فرستد و پاسخ کارمند را به‌صورت متن ساده دریافت می‌کند تا آن را در ویجت چت خودتان نشان دهید.

شروع کار

  1. یک کارمند دارای قابلیت چت را از صفحه‌ی کارمندان استخدام کنید.
  2. در تنظیمات همان کارمند، بخش «پرامپت اختصاصی این کارمند» را پر کنید: درباره‌ی چه چیزی صحبت کند و چه اطلاعاتی (خدمات، قیمت‌ها، ساعت کاری، آدرس صفحات) را در اختیار بازدیدکننده بگذارد. بعد از تأیید پرامپت اعمال می‌شود.
  3. در همان صفحه، بخش «کلیدهای API»، یک کلید بسازید و همان لحظه کپی کنید؛ فقط یک بار نمایش داده می‌شود.
  4. از سرور خودتان با این کلید اندپوینت زیر را صدا بزنید. همین.

کلید را محرمانه نگه دارید

هر کسی کلید را داشته باشد می‌تواند به‌جای کارمند شما چت کند و از سهمیه‌ی شما مصرف کند. API را از سرور (بک‌اند) خودتان صدا بزنید، نه از جاوااسکریپتی که در مرورگر بازدیدکننده اجرا می‌شود، و کلید را در متغیر محیطی نگه دارید. اگر کلید لو رفت، در تنظیمات کارمند آن را ابطال و کلید جدیدی بسازید؛ کلید ابطال‌شده بلافاصله از کار می‌افتد.

درخواست

POST https://virtualemployees.nl/api/v1/external/chat
Authorization: Bearer ve_live_...
Content-Type: application/json

{
  "message": "string",    // required, up to 2000 characters
  "sessionId": "string",  // optional, up to 128 characters
  "locale": "en"          // optional language hint
}
message
پیام بازدیدکننده. الزامی، حداکثر ۲۰۰۰ کاراکتر.
sessionId
شناسه‌ی دلخواه شما برای گفتگوی یک بازدیدکننده (مثلاً یک شناسه‌ی تصادفی که در نشست او نگه می‌دارید). اگر دوباره همان sessionId را بفرستید، کارمند پیام‌های قبلی ۲۴ ساعت اخیر را به یاد دارد و شما فقط جدیدترین پیام را می‌فرستید. برای سوال‌های تک‌باره حذفش کنید.
locale
زبان وب‌سایت شما، مثلاً "en" یا "nl". کارمند به زبانی که بازدیدکننده می‌نویسد جواب می‌دهد و در غیر این صورت از همین زبان استفاده می‌کند.

پاسخ

200 OK
{ "reply": "We're open Monday to Friday, 9:00 to 17:00." }

نمونه‌ها

cURL

curl -X POST https://virtualemployees.nl/api/v1/external/chat \
  -H "Authorization: Bearer $VE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "message": "What are your opening hours?", "sessionId": "visitor-8f3a21", "locale": "en" }'

JavaScript (Node.js)

// Node.js 18+ (server side)
const response = await fetch("https://virtualemployees.nl/api/v1/external/chat", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VE_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    message: "What are your opening hours?",
    sessionId: "visitor-8f3a21",
    locale: "en",
  }),
});

if (!response.ok) {
  const problem = await response.json(); // { title: "external_chat.invalid_key", detail: "..." }
  throw new Error(problem.title ?? `HTTP ${response.status}`);
}

const { reply } = await response.json();

Python

import os, requests

response = requests.post(
    "https://virtualemployees.nl/api/v1/external/chat",
    headers={"Authorization": f"Bearer {os.environ['VE_API_KEY']}"},
    json={"message": "What are your opening hours?", "sessionId": "visitor-8f3a21", "locale": "en"},
    timeout=60,
)
response.raise_for_status()
reply = response.json()["reply"]

PHP

<?php
$ch = curl_init("https://virtualemployees.nl/api/v1/external/chat");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 60,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("VE_API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "message" => "What are your opening hours?",
        "sessionId" => "visitor-8f3a21",
        "locale" => "en",
    ]),
]);
$reply = json_decode(curl_exec($ch), true)["reply"];

C# (.NET)

// .NET 8+ (server side)
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };
http.DefaultRequestHeaders.Authorization =
    new("Bearer", Environment.GetEnvironmentVariable("VE_API_KEY"));

var response = await http.PostAsJsonAsync("https://virtualemployees.nl/api/v1/external/chat",
    new { message = "What are your opening hours?", sessionId = "visitor-8f3a21", locale = "en" });

response.EnsureSuccessStatusCode();
var reply = (await response.Content.ReadFromJsonAsync<ChatReply>())!.Reply;

record ChatReply(string Reply);

خطاها

در صورت خطا یک شیء JSON برمی‌گردد: فیلد title کد خطای ثابتی دارد که می‌توانید روی آن شرط بگذارید و detail توضیح قابل‌خواندن است. پاسخ ممکن است چند ثانیه طول بکشد، پس timeout حدود ۶۰ ثانیه بگذارید.

401 Unauthorized
{ "title": "external_chat.invalid_key", "detail": "The API key is missing, invalid or revoked.", "status": 401 }
HTTPtitleمعنی
400(validation)بدنه‌ی درخواست نامعتبر است، مثلاً پیام خالی یا بیش از حد طولانی.
401external_chat.invalid_keyکلید ارسال نشده، اشتباه است یا ابطال شده.
403external_chat.unavailableاین کارمند فعلاً برای چت در دسترس نیست (مثلاً حساب معلق شده یا همکاری پایان یافته).
409external_chat.not_configuredاین کارمند هنوز برای چت تنظیم نشده است.
429(rate limit)درخواست‌های این کلید بیش از حد مجاز است. کمی صبر کنید و دوباره تلاش کنید.
5xx(server)مشکل موقتی در سمت ما. به بازدیدکننده یک پیام جایگزین مناسب نشان دهید و بعداً دوباره تلاش کنید.

تلگرام

علاوه بر API، یک کارمند دارای قابلیت چت می‌تواند در تلگرام هم پاسخ بدهد. دو روش دارد و هر دو در تنظیمات کارمند، بخش «تلگرام» انجام می‌شوند.

خودتان با کارمند گفتگو کنید

یک کد اتصال بسازید و آن را به ربات تلگرام خود کارمند بفرستید (یا لینکی که نشان می‌دهیم را باز کنید). آن چت به استخدام شما وصل می‌شود. می‌توانید چند چت، مثلاً اعضای تیم، را وصل کنید و از پنل یا با فرستادن /unlink به ربات قطعشان کنید. کد یک بار کار می‌کند و بعد از ۱۰ دقیقه منقضی می‌شود.

ربات اختصاصی خودتان برای مشتریانتان

با @BotFather یک ربات بسازید و توکنش را در تنظیمات کارمند بگذارید. هر کسی به ربات شما پیام بدهد با کارمند گفتگو می‌کند، بدون کد. تعداد پیام هر نفر در ساعت محدود است و برای کل ربات هم سقفی هست. توکن رمزنگاری‌شده ذخیره می‌شود. مطمئن شوید برای ربات webhook تنظیم نشده، چون پیام‌های آن را با polling دریافت می‌کنیم.

نکات مهم

  • هر کلید به یک کارمند وصل است، پس نام کارمند را در درخواست نمی‌آورید. برای هر وب‌سایت یا اپلیکیشن یک کلید جدا بسازید تا بتوانید جدا ابطال کنید.
  • کارمند فقط درباره‌ی چیزی صحبت می‌کند که در پرامپتش نوشته‌اید. اگر به سوالی جواب نمی‌دهد، آن اطلاعات را به پرامپت اضافه کنید.
  • آدرس صفحات سایتتان را در پرامپت بنویسید (مثلاً «برای قیمت‌ها به /pricing ارجاع بده») تا کارمند آن‌ها را در متن پاسخ بیاورد.
  • تعداد درخواست‌ها به‌ازای هر کلید محدود است. اگر ترافیک زیادی انتظار دارید با ما تماس بگیرید.