Skip to content

Создание счёта ​

POST /v1/cashier/invoices ставит в очередь один счёт плательщику. Запрос идемпотентен.

Метод и путь: POST {ELEVENPAY_BASE_URL}/v1/cashier/invoices (базовый адрес вам выдают при подключении — Окружения).

Машиночитаемый контракт: /openapi.json.

Заголовки ​

ЗаголовокОбязателенЗначение
AuthorizationдаBearer <API_KEY> — ключ окружения live с возможностью cashier.invoice.create
Idempotency-Keyда1–255 печатаемых ASCII-символов без пробелов; один ключ на одну логическую команду
Content-Typeдаapplication/json

Тело ​

Дополнительные поля запрещены.

ПолеТипПравила
amountstringточно два знака после точки, целое число тенге: "1500.00". JSON-число отклоняется
currencystringтолько "KZT" (по умолчанию KZT)
merchant_order_idstring1–100 символов A-Za-z0-9_.:-; ваш идентификатор заказа
customer_phonestringтолько цифры, 10–15
json
{
  "amount": "1500.00",
  "currency": "KZT",
  "merchant_order_id": "order_demo_1001",
  "customer_phone": "77001234567"
}

Ответ ​

201 Created — счёт поставлен в очередь; 200 OK — безопасный повтор (тот же Idempotency-Key и тот же запрос). Заголовок Idempotency-Replayed: true|false показывает, был ли это повтор.

json
{
  "reference": "ep1_7t4k2m8q9x3v6b1n5c0d2f4a8h",
  "merchant_order_id": "order_demo_1001",
  "status": "pending",
  "amount": "1500.00",
  "currency": "KZT",
  "environment": "live",
  "created_at": "2024-09-05T11:59:30Z",
  "invoice_state": "queued",
  "payer_action": null,
  "settled": false
}
ПолеЗначение
referenceпубличный идентификатор (ep1_…) для GET
statusсостояние платежа (pending → succeeded); см. Статусы
invoice_stateгде находится счёт: queued, sending, sent, not_sent, unknown
payer_actionnull или "approve_in_kaspi_app": задано только пока счёт дошёл до приложения и платёж ещё открыт
settledtrue только когда расчёт подтверждён

Телефон плательщика в ответах и вебхуках не возвращается.

Не говорите плательщику «откройте приложение» раньше времени

Показывайте инструкцию «подтвердите платёж в приложении» только когда payer_action равен "approve_in_kaspi_app". Пока invoice_state — queued или sending, показывайте «отправляем запрос…». Любое неизвестное значение трактуйте как «неизвестно», а не как «оплачено».

Идемпотентность и стабильный заказ ​

  • Храните Idempotency-Key вместе с заказом до первого запроса и используйте тот же ключ при каждом повторе (потеря ответа, таймаут, перезапуск процесса). Повтор вернёт исходный счёт.
  • Тот же ключ с другим запросом (другая сумма, телефон, заказ) → 409 idempotency_conflict.
  • Для одного merchant_order_id существует один счёт: новый ключ для того же заказа → 409 cashier_order_not_unique. Если счёт «потерян» или unknown, не создавайте второй: повторите исходный запрос с исходным ключом или заведите новый заказ осознанно.

Подробнее — Идемпотентность.

Ошибки создания ​

Формат: {"error": {"code": "...", "message": "..."}}. Ориентируйтесь на code.

HTTPcodeЧто делать
400idempotency_key_required, idempotency_key_invalidдобавьте/исправьте заголовок
401invalid_api_keyпроверьте ключ
403forbiddenу ключа нет cashier.invoice.create
403organization_unavailableорганизация недоступна; обратитесь в поддержку
409idempotency_conflictключ уже использован для другого запроса
409cashier_order_not_uniqueсчёт для этого merchant_order_id уже есть
409cashier_environment_unsupportedнужен ключ окружения live
409cashier_live_disabled, cashier_pilot_stopped, cashier_merchant_disabled, cashier_not_authorized, cashier_authorization_expiredприём счетов не включён/остановлен/не разрешён для организации; не повторяйте вслепую
409cashier_limit_exceededпревышен лимит; см. условия подключения
409cashier_operation_unsupported, cashier_amount_invalidоперация или сумма недопустимы
409cashier_not_connected, cashier_session_not_activeподключение канала оплаты отсутствует или требует переподключения — сообщите в поддержку
409ambiguous_create_blockedпредыдущее создание не разрешено однозначно и не будет повторено; не создавайте второй счёт
422payment_amount_invalid, amount_not_whole_tenge, customer_phone_invalidисправьте поле
422(формат FastAPI detail)неверная форма тела; см. Ошибки
429rate_limitedслишком много запросов; учитывайте Retry-After
429payer_rate_limitedплательщику недавно уже отправили слишком много счетов (Retry-After: 3600)
500internal_errorповторите с тем же ключом позже
503service_unavailableповторите с тем же ключом позже

Пример: curl ​

bash
curl -X POST "$ELEVENPAY_BASE_URL/v1/cashier/invoices" \
  -H "Authorization: Bearer $ELEVENPAY_API_KEY" \
  -H "Idempotency-Key: $(cat order-1001.idempotency-key)" \
  -H "Content-Type: application/json" \
  -d '{"amount":"1500.00","currency":"KZT","merchant_order_id":"order_demo_1001","customer_phone":"77001234567"}'

Готовые клиенты на Python и Node.js уже реализуют стабильный ключ, безопасные повторы и опрос.