Разработчикам / Публичный API

Публичный API для безопасных платежных интеграций.

Используйте VPOS.am как server-side интеграционный слой для платежных сессий, hosted checkout, проверки статуса и подписанных событий жизненного цикла. На этой странице описаны только публичные merchant-контракты: без console/admin API, внутренних provider credentials и операторских процессов.

Публичный scope

Что описано

Создание merchant payment sessions, проверка статуса платежа, non-secret health status, webhooks и идемпотентные retries.

Что не описано здесь

Console/admin endpoints, operator tokens, provider credentials, банковские secrets, payout-данные и внутренние reconciliation controls.

Production access

Production credentials выдаются только после onboarding merchant, проверки домена, callback security и тестового платежного сценария.

Не вызывайте merchant endpoints из browser code или мобильных приложений с embedded secrets. Bearer tokens и webhook secrets должны храниться только на доверенном backend.

Быстрый старт

Минимальная интеграция состоит из трех server-side частей: создать платежную сессию, перенаправить покупателя на hosted checkout, затем подтвердить финальный статус через status lookup или подписанный webhook.

curl -X POST https://api.vpos.am/v1/payment-sessions \
  -H "Authorization: Bearer <merchant_api_token>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1001-pay-attempt-1" \
  -d '{
    "merchantOrderId": "order-1001",
    "amountMinor": 15000,
    "currency": "AMD",
    "provider": "manual",
    "returnUrl": "https://merchant.example/payments/return",
    "customer": {
      "email": "buyer@example.com",
      "phone": "+37400000000",
      "name": "Test Buyer"
    },
    "metadata": {
      "source": "custom-backend"
    }
  }'

Browser return URL не является доказательством оплаты. Это только UI-событие. Выдача товара или изменение заказа должны ждать server-side verification или подписанного webhook event.

Endpoints

GET /api/health

Возвращает non-secret runtime status для monitoring и integration checks. Readiness blockers могут присутствовать в JSON, но клиентам не стоит считать их стабильным контрактом.

СтатусЗначение
200Сервис доступен. Readiness возвращается в JSON body.
405HTTP method не поддерживается.
GET /v1/capabilities

Возвращает консервативную provider capability matrix. Используйте ее, чтобы включать PayLink, QR, refunds, fiscalization и tokenization в UI только после готовности route.

ПолеПравила
providers[].capabilitiesBoolean support/enabled flags для каждого provider route.
payment_links, qr_presentationВключаются только когда выбранный route может создавать payment sessions.
refund, capture, void, tokenization, subscriptionsПубличные контракты guarded; выполнение остается disabled до provider capabilities, idempotency и sandbox tests.
POST /v1/payment-links

Создает идемпотентную payment link на базе payment session. QR payload является только URL presentation layer; финальный статус оплаты приходит через webhook или reconciliation.

ПолеПравила
Idempotency-KeyОбязательный header. Повторно используйте его при retries, чтобы не создать duplicate link.
amount, currencyСумма в major units и валюта AMD/USD/EUR. Для AMD только целое значение.
descriptionОбязательное customer-facing описание платежа.
expiresAtОпциональная будущая ISO date/time. Expiry не доказывает результат платежа.
providerRouteОпциональный provider route. Unsupported или not-ready route отклоняется.
POST /v1/payment-sessions

Создает нормализованную платежную сессию и возвращает hosted checkout URL, если выбранный provider может инициировать checkout.

ПолеПравила
merchantOrderIdОбязательный merchant-side order reference. Используйте стабильное значение для сверки.
amountMinorОбязательная целая сумма в minor currency units.
currencyПублично поддерживаемые значения: AMD, USD, EUR.
returnUrlАбсолютный HTTPS URL, куда покупатель возвращается после checkout.
customerОпциональные email, phone и name. Храните только то, что нужно бизнес-процессу.
POST /v1/payments/{id}/refunds · /capture · /void

Защищенные контракты операций для refunds, capture, void, fiscal retry, tokenization и subscriptions. Они требуют Idempotency-Key и не выполняют операцию, пока provider capabilities не включены и не протестированы.

ПолеПравила
Idempotency-KeyОбязателен для каждой money-moving или lifecycle operation.
refundТребует verified paid/partially_refunded payment, amountMinor, совпадающую currency и reason.
capture, voidТребуют authorized payment. Browser return не используется как proof.
tokenizationRaw card data отклоняется; нужен provider-hosted token lifecycle и consent.
subscriptionsТребуют provider token и tested failed-renewal behavior до включения выполнения.
GET /v1/payments?paymentId=<id>

Возвращает текущий нормализованный payment state для ранее созданной сессии.

СтатусРекомендованная обработка
created, pending_*, authorizedНе выполнять fulfillment. Продолжайте polling или ждите webhook.
paidFulfillment возможен после совпадения amount, currency и order reference.
failed, cancelled, expiredПокажите отказ или создайте новую payment attempt.
refunded, partially_refunded, reversed, disputedСинхронизируйте accounting, CRM и support workflows.

Webhooks

Webhook delivery настраивается для каждого merchant при onboarding. Ваш endpoint должен проверить HMAC signature, сохранить event id, быстро ответить и перенести бизнес-эффекты в очередь.

{
  "id": "evt_01hxxexample",
  "type": "payment.status_changed",
  "createdAt": "2026-05-25T08:00:00.000Z",
  "payment": {
    "id": "pay_01hxxexample",
    "merchantOrderId": "order-1001",
    "amountMinor": 15000,
    "currency": "AMD",
    "status": "paid"
  }
}

Формат signature header: X-VPOS-Signature: sha256=<hex_hmac_sha256>. HMAC считается по raw request body с merchant webhook secret.

Идемпотентность

Используйте Idempotency-Key для retryable operations, например создания payment session. Храните ключ вместе с order и payment attempt. Network retry не должен создавать второй payable order или invoice.

  • Используйте deterministic key для каждой order payment attempt, а не новый random key на каждый retry.
  • Для разных user-initiated attempts используйте разные ключи.
  • Логируйте VPOS payment id, merchant order id, amount и currency вместе.

Ошибки

HTTP statusЗначениеДействие интегратора
401Merchant bearer token отсутствует или неверный.Не retry вслепую. Проверьте или перевыпустите credentials.
403Request origin не является trusted.Используйте server-to-server requests или зарегистрируйте backend origin.
422Validation failed.Исправьте request data перед retry.
429Rate limited.Сделайте backoff и retry с jitter.
503Provider, storage или auth dependency не готовы.Повторите позже или обратитесь в support, если это блокирует production.

Правила безопасности

  • Никогда не раскрывайте merchant bearer tokens, webhook secrets или provider credentials во frontend code.
  • Используйте только HTTPS и проверяйте server certificates в backend clients.
  • Считайте платеж финальным только после server-side confirmation.
  • Проверяйте amount, currency и merchant order id перед изменением order, CRM или ERP state.
  • Сохраняйте webhook event ids и не допускайте повторных side effects.
  • Логируйте failed signature checks и неожиданные status transitions без лишних персональных данных.

Эта публичная страница намеренно не содержит production tokens, internal console routes, private provider callbacks, database details или bank credentials.

Запрос доступа

Для pilot или production access отправьте company name, website, integration type, expected provider, currencies, callback URL и contact person на info@vpos.am.

Перед production VPOS.am проверяет merchant identity, domain ownership, callback security, test payment results, refund/reconciliation process и support ownership.