Qut Pay Сайт Кабинет База знаний Инструкции Документация API ҚАЗРУС
ГлавнаяБаза знаний → Справочник

Metadata и номер заказа

Обновлено: 2026-09-14 · Версия в Markdown

Коротко

При создании счёта есть два поля, в которые вы кладёте данные своей системы:

Правило одно на оба поля: не кладите туда секреты. metadata не шифруется, и её видит любой сотрудник, у которого есть доступ в кабинет.

externalOrderId

Это номер заказа в вашем магазине или CRM. В Kaspi он не уходит, покупатель его не видит.

{
  "amount": 12500,
  "description": "Заказ №4471",
  "externalOrderId": "4471"
}

Что он даёт:

ВозможностьКак работает
Возврат в вебхукеПриходит в поле invoice.externalOrderId — сразу понятно, какой заказ закрывать
ПоискGET /api/v1/invoices?externalOrderId=4471 вернёт счета по этому заказу
Видимость в кабинетеПоказывается в списке счетов и в карточке счёта
ЭкспортПопадает в колонку CSV — удобно сверять с бухгалтерией

На один заказ может приходиться несколько счетов: первый истёк, покупатель оплатил со второй попытки. Поэтому externalOrderId — не уникальный ключ. От дублей защищает отдельный заголовок Idempotency-Key: Идемпотентность.

Что писать: номер заказа, код брони, номер счёта-фактуры. Что не писать: телефон, ИИН, e-mail покупателя — для них есть поле customer.

metadata

metadata — произвольный JSON-объект. Мы в него не заглядываем и ничего в нём не проверяем: просто сохраняем и возвращаем обратно.

{
  "amount": 3000,
  "kind": "qr",
  "description": "Вода, 19 л",
  "externalOrderId": "4471",
  "metadata": {
    "machineId": "vnd-07",
    "slot": "A3",
    "branch": "almaty-abay",
    "courierId": 22,
    "source": "telegram-bot"
  }
}

Этот объект в неизменном виде:

Благодаря этому, получив уведомление об оплате, вам не нужно лезть в свою базу, чтобы понять, какую ячейку какого автомата открывать.

Что класть можно

ПримерЗачем
orderLineId, dealIdВнутренний идентификатор в CRM
machineId, slot, terminalIdВендинговый автомат, ячейка, устройство
courierId, routeIdКурьер и маршрут — оплата в момент доставки
branch, pointIdТочка, филиал — чтобы развести отчётность
source, campaignИсточник трафика, метка кампании
tableNo, waiterIdСтол и официант в ресторане
cartHash, attemptВнутренние технические пометки

Принцип: здесь должны лежать только технические метки вашей системы.

Что нельзя класть никогда

Не кладитеПочему
Пароли, токены, API-ключиИх увидит любой сотрудник с доступом в кабинет
Номер карты, CVV, банковские реквизитыУ нас нет оснований это хранить, а для вас это прямой риск
ИИН, БИН, номер документаЛишние персональные данные, которые не нужны для платежа
Адрес покупателя, диагноз, текст обращенияПерсональные и чувствительные данные
Всё содержимое корзины, длинные логиmetadata — не база данных; кладите идентификатор, а не дамп

Если нужны имя, телефон или e-mail покупателя — им место в отдельном поле customer, а не в metadata: только тогда корректно отработают чек и уведомление. Что именно хранится: Данные и конфиденциальность.

Размер

metadata должна оставаться компактной: несколько десятков полей, значения — короткие строки и числа. Если отправлять десятки килобайт JSON, создание счёта замедлится, а тело вебхука станет тяжёлым. Длинный текст держите у себя, а сюда кладите только его идентификатор.

Как это возвращается в вебхуке

{
  "event": "invoice.paid",
  "invoice": {
    "id": "inv_01J8…",
    "externalOrderId": "4471",
    "status": "paid",
    "amount": 3000,
    "metadata": { "machineId": "vnd-07", "slot": "A3" },
    "receiptUrl": "https://…"
  },
  "sentAt": "2026-09-14T09:12:04.000Z"
}

Пример обработки:

if (event === 'invoice.paid') {
  const { externalOrderId, metadata } = invoice;
  await markOrderPaid(externalOrderId);          // закрываем заказ
  if (metadata?.machineId) openSlot(metadata.machineId, metadata.slot);
}

Одно и то же событие может прийти дважды, поэтому обработчик должен быть идемпотентным — проверяйте по паре (invoice.id, status).

У счетов, выставленных по подписке, в metadata автоматически появляются поля subscriptionId и run. Не занимайте эти имена своими данными.

Что выбрать

ВопросОтвет
Хочу искать из кабинетаexternalOrderId
Должно попасть в выгрузку CSVexternalOrderId
Хочу, чтобы увидел покупательНи то, ни другое — пишите в description
Достаточно, чтобы вернулось в вебхукеmetadata
Нужно несколько значенийmetadata

Вопросы и ответы

Можно ли искать по metadata? Нет. Поиск работает по externalOrderId. Значение, по которому нужно искать, выносите туда.

Можно ли изменить metadata позже? Нет, она фиксируется в момент создания счёта. Новые данные храните у себя.

Видит ли покупатель metadata? Нет. Ни на странице оплаты, ни в приложении Kaspi, ни в чеке. Покупатель видит текст description, сумму и продавца.

Должен ли externalOrderId быть уникальным? Нет. Несколько счетов на один заказ — нормальная ситуация. От дублей защищает Idempotency-Key.

Можно ли положить в metadata массив или вложенный объект? Да, любой валидный JSON. Но обработку сильно упрощает плоский короткий объект.

Связанные статьи

Создание счёта: все поляПолный справочник по POST /api/v1/invoices — тип и ограничение каждого поля, все поля ответа, примеры на curl и Node, разница между qr и phone и список частых ошибок с решениями.Идемпотентность: защита от дублейКак работает заголовок Idempotency-Key, как правильно составить ключ, какова роль externalOrderId, и как защититься от повторов при обработке вебхуков и при возвратах.Настройка вебхуковКак добавить адрес вебхука в кабинете, выбрать события и сохранить секрет, какие приходят заголовки и тело, как устроены 11 повторов, как читать журнал, протестировать адрес и что с редиректами.Данные и конфиденциальность — что хранится и кто это видитКакие данные счетов, покупателей и кассира Qut Pay хранит, а какие не хранит вовсе, кто имеет к ним доступ и как долго они живут. Что нельзя писать в описание счёта и в metadata.Экспорт CSV и отчётность: как выгрузить счетаВыгрузка счетов из кабинета и через API, смысл фильтров и колонок, кодировка UTF-8, иероглифы в Excel и сверка с отчётом в кабинете Kaspi Pay — почему суммы могут не совпасть точно.

Остались вопросы? WhatsApp +77788813333 · kazprose@gmail.com
Написать можно и из кабинета: Поддержка.

Qut Pay — независимый сервис, не аффилирован с АО «Kaspi Bank». Kaspi и Kaspi Pay — товарные знаки их правообладателя.