SDK لـNode.js

عميل مُنمَّط للقراءة العامة والعمليات الموثقة في TypeScript وJavaScript.

عمليات بصلاحيات محددة · ESM · الإصدار 0.2.0 على npm

@inboxychat/sdk
npm i @inboxychat/sdk@0.2.0
في هذه الصفحة

لمن هذا

المطورون الذين يبنون تكاملاً أو تقريراً أو أداة داخلية بـNode.js فوق Inboxy.

ماذا يستطيع

  • نسخة المصدر هذه تضيف 80 عملية موثقة عبر SDK وCLI وMCP. تحقق بشكل منفصل من إصدار npm المثبت وتفعيل الخدمة المستضافة.
  • دالة مُنمَّطة لكل مسار في الواجهة العامة v1 ‏(19 دالة): الشركة والاستهلاك وجهات الاتصال والمحادثات والرسائل والطلبات والمنتجات.
  • الدالة collectPages() تتنقل بين صفحات المؤشرات نيابة عنك حتى حد معيّن.
  • أخطاء مُنمَّطة (InboxyError.kind) برسائل مُخفاة البيانات الحساسة، مع مهلة ودعم AbortSignal.
  • الدالة resolveCredentials() تقرأ المفتاح نفسه الذي يستخدمه CLI: INBOXY_API_KEY ثم سلسلة مفاتيح النظام ثم ملف الإعداد 0600.

التثبيت

العمليات الموثقة وحدود التغطية الفعلية

نسخة المصدر هذه تضيف 80 عملية موثقة عبر SDK وCLI وMCP. تحقق بشكل منفصل من إصدار npm المثبت وتفعيل الخدمة المستضافة.

التغطية: جهات الاتصال والمهام والتذاكر؛ إسناد وحالة وتصنيفات وملاحظات المحادثات وإرسال نص بإجراء مستقل؛ مسودات وإعداد ومعرفة نصية وقنوات واختبارات وتفعيل موظفي الذكاء الاصطناعي؛ الطلبات اليدوية وحالتها ودفعها وتنفيذها؛ المنتجات والتصنيفات؛ وحالة جهات الاتصال ومراحلها وإسنادها وتاجاتها وحقولها؛ وقراءة الأتمتة ومسوداتها ومحاكاتها وإيقافها وتفعيل نسختها المعتمدة؛ ومعاينة الحملات ومسوداتها وإيقافها وإلغائها وإرسالها واستئنافها وجدولتها بموافقة دقيقة. دليل 553 مسارًا هو بيانات اكتشاف وليس تغطية تنفيذية كاملة للوحة التحكم.

SDK: استخدم describeOperations() ثم prepareOperation(id, input, idempotencyKey) وexecuteOperation(id, input, { idempotencyKey, confirmation }). CLI: أوامر operations list/inspect/preview/run مع --input و--idempotency-key و--confirm. MCP: أدوات operations_list وoperation_inspect وoperation_preview وoperation_execute؛ الرسائل تستخدم message_send والتفعيل يستخدم lifecycle_activate؛ والحملات تستخدم campaign_send أو campaign_schedule. في CLI استخدم messages send بعد معاينة inbox.message.send.

اعرض المعاينة الدقيقة واحصل على موافقة المستخدم الصريحة قبل التعديل. بصمة التأكيد تربط الإدخال والمفتاح لكنها ليست إثباتًا للموافقة البشرية. احتفظ بنفس مفتاح منع التكرار عند استعادة الطلب. لا توجد إعادة محاولة تلقائية. تستمر قيود الشركة والدور والصلاحية والباقة. صلاحيات OAuth للكتابة تحتاج موافقة صريحة جديدة وتبدأ غير محددة؛ المنح القديمة لا تكتسب صلاحيات.

اختبارات ومعالجة معرفة الذكاء الاصطناعي قد تستهلك الرصيد. التفعيل وإسناد القنوات قد يؤثران على الردود الحية. الإرسال يحتاج موافقة على contactId وchannelId ونوع القناة والنص الكامل؛ والخادم يعيد التحقق من الوجهة. لا إرسال وسائط أو قوالب عبر المحادثات ولا حذف كيانات أو HTTP حر أو فوترة أو إدارة منصة. إرسال قوالب الحملات وجدولتها يتطلبان إجراء مستقل وموافقة على لقطة ثابتة للجمهور والمحتوى والمرسل والتوقيت. تعديل الطلبات والتاجات قد يشغّل الأتمتة؛ والحقول المخصصة تستبدل الخريطة كاملة؛ تحديث الدفع لا يخصم من مزود الدفع. استرداد وإلغاء الطلبات والتغطية الكاملة للحملات والأتمتة ما زالت مستثناة.

يحتاج Node.js ‏>= 20.3. الحزمة بصيغة ESM فقط (استخدم import وليس require) وتتضمن أنواع TypeScript.

npm
npm i @inboxychat/sdk
pnpm
pnpm add @inboxychat/sdk

المصادقة

  1. سجّل الدخول إلى Inboxy بحساب مدير الشركة وافتح المطورون ← API keys في لوحة التحكم ‏(/developer-center/keys).
  2. اختر "أنشئ مفتاح API" وسمِّ المفتاح باسم تعرفه لاحقاً (مثل "Claude على جهازي").
  3. اختر الصلاحيات التي تحتاجها فقط. لا توجد صلاحيات افتراضية، ولا يمكن إنشاء مفتاح بلا صلاحيات. أدوات القراءة تحتاج صلاحيات ":read" ‏(contacts:read وorders:read ...).
  4. اختر مدة الصلاحية: 30 أو 90 (الافتراضي) أو 180 أو 365 يوماً أو بلا انتهاء. الافتراضي 90 يوماً.
  5. انسخ المفتاح عند ظهوره، وهو يبدأ بـ"inboxy_". احفظه في مدير أسرار أو في سلسلة مفاتيح النظام، ولا تضعه أبداً في مستودع كود.

مرّر المفتاح إلى العميل بنفسك من متغير بيئة أو مخزن أسرار. وعلى جهاز المطور، تستطيع resolveCredentials() أيضاً قراءة مفتاح حُفظ عبر inboxy auth login.

المفتاح نفسه الخاص بـCLI
import { InboxyClient, resolveCredentials } from '@inboxychat/sdk';

const creds = await resolveCredentials();
if (!creds.apiKey) throw new Error('Run inboxy auth login or set INBOXY_API_KEY');
const inboxy = new InboxyClient({ apiKey: creds.apiKey, baseUrl: creds.apiUrl });

البدء السريع

الشركة وأحدث الطلبات
import { InboxyClient } from '@inboxychat/sdk';

const inboxy = new InboxyClient({ apiKey: process.env.INBOXY_API_KEY! });

const { data: me } = await inboxy.getCompany();
console.log(me.company.name, me.token.scopes);

const orders = await inboxy.listOrders({ status: 'pending', limit: 5 });
for (const order of orders.data) console.log(order.orderNumber);

أدلة الاستخدام

قراءة كل الصفحات

collectPages
import { InboxyClient, collectPages } from '@inboxychat/sdk';

const inboxy = new InboxyClient({ apiKey: process.env.INBOXY_API_KEY! });
const { items, meta } = await collectPages(
  (q) => inboxy.listContacts(q),
  { lifecycleStage: 'customer', limit: 100 },
  20 // max pages
);
console.log(items.length, meta.hasMore ? 'more remain' : 'done');

معالجة الأخطاء

InboxyError
import { InboxyError } from '@inboxychat/sdk';

try {
  await inboxy.getOrder('ord_123');
} catch (err) {
  if (err instanceof InboxyError) {
    if (err.kind === 'rate_limited') console.log('retry after', err.retryAfterSeconds, 's');
    else if (err.kind === 'forbidden') console.log('missing scope', err.details.requiredScope);
    else console.log(err.kind, err.code, err.message);
  } else throw err;
}

إلغاء الطلب أو تحديد مهلته

AbortSignal وtimeoutMs
const inboxy = new InboxyClient({ apiKey: process.env.INBOXY_API_KEY!, timeoutMs: 5000 });
const controller = new AbortController();
setTimeout(() => controller.abort(), 1000);
await inboxy.listConversations({ status: 'open' }, { signal: controller.signal });

المرجع

new InboxyClient(options)

الخيارالمعنى
apiKeyمطلوب. مفتاح inboxy_….
baseUrlأصل الواجهة (الافتراضي https://api.inboxy.chat).
timeoutMsمهلة كل طلب (الافتراضي 20000، من 100 إلى 120000).
fetchدالة fetch مخصصة (للاختبارات).
userAgentترويسة User-Agent.

الدوال

كل دالة تعيد صيغة الواجهة ({ success, data, meta? }) وتقبل { signal } كآخر وسيط.

الدالةالمسارالصلاحية
getCompany(options?)GET /api/v1/public/company—
getUsage(options?)GET /api/v1/public/usageanalytics:read
listContacts(query?, options?)GET /api/v1/public/contactscontacts:read
getContact(id, options?)GET /api/v1/public/contacts/:idcontacts:read
listConversations(query?, options?)GET /api/v1/public/conversationsconversations:read
getConversation(id, options?)GET /api/v1/public/conversations/:idconversations:read
listMessages(conversationId, query?, options?)GET /api/v1/public/conversations/:id/messagesmessages:read
listOrders(query?, options?)GET /api/v1/public/ordersorders:read
getOrder(id, options?)GET /api/v1/public/orders/:idorders:read
listProducts(query?, options?)GET /api/v1/public/productsproducts:read
getProduct(id, options?)GET /api/v1/public/products/:idproducts:read
listTickets(query?, options?)GET /api/v1/public/ticketstickets:read
getTicket(id, options?)GET /api/v1/public/tickets/:idtickets:read
listTasks(query?, options?)GET /api/v1/public/taskstasks:read
getTask(id, options?)GET /api/v1/public/tasks/:idtasks:read
listCampaigns(query?, options?)GET /api/v1/public/campaignscampaigns:read
getCampaign(id, options?)GET /api/v1/public/campaigns/:idcampaigns:read
listTemplates(query?, options?)GET /api/v1/public/templatestemplates:read
listAppointments(query?, options?)GET /api/v1/public/appointmentsmeetings:read

أنواع الأخطاء

يحمل InboxyError الحقول kind وstatus وcode وdetails وretryAfterSeconds. وقيمة kind واحدة من: auth، forbidden، not_found، rate_limited، invalid_request، server، timeout، cancelled، network، invalid_response، config.

الحدود والأمان

  • التعديلات تستخدم العمليات الموثقة بموافقة صريحة ومنع التكرار. إرسال النصوص والحملات يتطلب موافقة مستقلة وصريحة على المستلم والمحتوى.
  • للخادم فقط. لا ترسل المفتاح أبداً إلى المتصفح.
  • HTTPS فقط (وhttp لـlocalhost)؛ تُرفض إعادة التوجيه؛ وتُتحقق المعرّفات وتُرمَّز كجزء واحد من المسار.
  • تنطبق حدود طلبات واجهة REST؛ والرمز 429 يصبح النوع "rate_limited" مع retryAfterSeconds.

حل المشكلات

  • ERR_REQUIRE_ESM: الحزمة بصيغة ESM. استخدم import أو import() الديناميكي من CommonJS.
  • AbortSignal.any is not a function: حدّث Node.js إلى 20.3 أو أحدث.
  • النوع "config" مع INSECURE_API_URL: يجب أن يبدأ baseUrl بـhttps://‏ (http مقبول لـlocalhost فقط).
  • النوع "auth" أو "forbidden": نفّذ inboxy doctor بالمفتاح نفسه لمعرفة الناقص.

أنشئ مفتاح API

ينشئ مدير الشركة المفاتيح من صفحة المطورين في لوحة التحكم.