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.accounts | list, get, create, update, remove, refresh, setBilling, extend, qr, startPhoneAuth, submitCode, submitPassword, logout, backfill, check |
xm.messages | sendText, sendFile, sendLocation, sendContact, sendPoll, forward, get, history, edit, delete |
xm.chats | list, get, markRead, typing, archive, iterateMessages |
xm.attachments | upload, get, download |
xm.stories | createText, createMedia, createVoice, list, sync, refreshViews, delete |
xm.payments | create, get, list |
xm.events | list, iterate — забрать события списком |
xm.webhook | me — профиль и лимиты, set — адрес для событий |
xm.pricing() | цены на номера |
xm.request() | низкоуровневый вызов любого метода |