xaxumessageAPI
Справочник

TypeScript-клиент

Готовый клиент для Node.js 18+ и Next.js без зависимостей: все методы API с типами, загрузка файлов потоком, листание и проверка подписи вебхуков.

Файлы клиента

Два файла — скачайте их в папку xaxumessage/ своего проекта: index.ts (клиент и типы) и webhook.ts (проверка подписи). Используйте клиент только на сервере: API-ключ не должен попасть в браузер.

Подключение

import { XaxuMessage, XaxuError } from './xaxumessage';

const xm = new XaxuMessage({
  baseUrl: 'https://msg.xaxu.am',
  apiKey: process.env.XM_API_KEY!,
  // timeoutMs: 30_000,            // таймаут запроса (загрузка файлов — 10 минут)
});

Примеры

// номера
const accounts = await xm.accounts.list();
const wa = await xm.accounts.create({ channel: 'whatsapp', label: 'Отдел продаж', clientId: 'org-42-wa-1' });
const { message: qrPng } = await xm.accounts.qr(wa.id);

// отправка
await xm.messages.sendText(wa.id, { to: { phone: '+79991234567' }, text: 'Здравствуйте!', clientId: 'order-1001' });

const file = await xm.attachments.upload(await fs.openAsBlob('price.pdf'), { fileName: 'price.pdf' });
await xm.messages.sendFile(wa.id, { to: { chatId: '79991234567@c.us' }, attachmentId: file.id, caption: 'Прайс' });

// чтение: все сообщения чата, страница за страницей
for await (const m of xm.chats.iterateMessages(chatId)) console.log(m.direction, m.text);

// события
await xm.webhook.set('https://example.ru/api/xaxumessage/events');
for await (const ev of xm.events.iterate(lastSeenId)) handle(ev);

Приём вебхука в Next.js

import { readVerifiedEvent } from './xaxumessage/webhook';

export async function POST(req: Request) {
  const event = await readVerifiedEvent(req, process.env.XM_WEBHOOK_SECRET!);
  if (!event) return new Response('bad signature', { status: 401 });
  // event.id — для дедупликации, event.type, event.data
  return new Response('ok');
}

Ошибки

try {
  await xm.messages.sendText(id, { to: { phone }, text });
} catch (e) {
  if (e instanceof XaxuError) {
    // e.status — HTTP-статус (0 — сеть/таймаут), e.code — error.code, e.details
    if (e.status === 402) { /* номер не оплачен */ }
    if (e.code === 'account_not_ready') { /* номер не привязан */ }
  }
  throw e;
}
Раздел клиентаМетоды
xm.accountslist, get, create, update, remove, refresh, setBilling, extend, qr, startPhoneAuth, submitCode, submitPassword, logout, backfill, check
xm.messagessendText, sendFile, sendLocation, sendContact, sendPoll, forward, get, history, edit, delete
xm.chatslist, get, markRead, typing, archive, iterateMessages
xm.attachmentsupload, get, download
xm.storiescreateText, createMedia, createVoice, list, sync, refreshViews, delete
xm.paymentscreate, get, list
xm.eventslist, iterate — забрать события списком
xm.webhookme — профиль и лимиты, set — адрес для событий
xm.pricing()цены на номера
xm.request()низкоуровневый вызов любого метода