PayMeNow

Support & changelog

How to reach support, and the revision history of this documentation set.

Generated from public-api.mdVersion 1.2.0Last updated 2026-09-20

#Support

For technical support, contact your account manager or the support channel issued with your credentials. For the current production brand:

  • Telegram: @paymenow_support_bot
  • Help centre: https://help.paymenow.asia

Quote the trace_id from the error details (or the X-Request-ID response header) when reporting a failed request.

There is no public status page today; GET /health reports API gateway liveness only.

#Changelog

#v1.2.0 (2026-09-20)

Full audit of this document against the shipped code. Corrections:

  • Brand/hosts: replaced gateway.i-pay.one / pay.i-pay.one / docs.i-pay.one / [email protected] with <domain> placeholders plus the current production values (api.paymenow.asia, sandbox-api.paymenow.asia).
  • Sandbox is selected by host, not by merchant type alone — production and sandbox are different base URLs, and the previous claim that they share one URL was wrong.
  • Authentication: documented that PATH excludes the query string, that the trailing | is omitted for empty bodies, the real key formats (pk_prod_/pk_demo_ 40 chars, sk_prod_/sk_demo_ 72 chars — not "64 characters"), the 5-minute credential cache, and the 403 IP_NOT_WHITELISTED behaviour.
  • New endpoints documented: GET /v1/payments/get-balance, POST /v1/payments/{id}/upload-slip (with its file-hash signature variant), /v1/merchant-reports/*, /health, and the /sandbox/* helpers.
  • Deposit: added paid_amount (the unique-satang amount the customer must actually transfer); default expiry corrected from 15 to 10 minutes; documented the 50 THB floor and merchant min/max; noted reference_id is not an idempotency key.
  • payment_url: this entry used to say the field was never populated and that no hosted checkout page existed. Both stopped being true in September 2026 — the page ships, the field carries its link, and the field table and example above show it.
  • Withdraw: documented the 100 THB floor, the 5-minute duplicate-payout hold, that the creation status is pending/processing, and that bank_code: "PROMPTPAY" is rejected by validation (the PromptPay proxy is not reachable through this API).
  • Get Payment: corrected — it never returns qr_code, qr_code_image or paid_amount.
  • Cancel: corrected — a cancelled payment reports status: "failed", not cancelled.
  • Statuses: full list (pending, processing, pending_approval, completed, failed, expired, refunded, cancelled) with the real transition rules. Expiry produces expired, not failed — reversing the incorrect v1.1.0 claim.
  • Webhooks: added paidAmount and failureReason; refunded / transaction.refunded documented; expired is current, not legacy; exact signature formula (timestamp + "|" + raw_body, signed with the API secret key, not the webhook-config secret); the X-Webhook-Event and X-Transaction-ID headers; the 10-second delivery timeout; the flat 1-minute retry interval; the report-event envelope; and the at-least-once duplicate caveat for transaction webhooks.
  • Errors: replaced the invented code list with the codes actually emitted, each with its HTTP status; noted that PAYMENT_NOT_FOUND, PAYMENT_ERROR, DUPLICATE_REFERENCE and INVALID_BANK_CODE are not emitted; documented details.reason / details.trace_id and X-Request-ID.
  • Rate limits: corrected from the fictional 100/30/20 per-endpoint table to the real single 60/min per-merchant bucket for /v1/payments/*, a separate 60/min bucket for /v1/merchant-reports/*, and the 300/min per-IP sandbox helper limit.
  • Sandbox: corrected the test-amount table (888.88 is not a timeout trigger), separated deposit and withdraw outcomes, and documented the timeout/invalid_account scenarios accurately.
  • Bank codes: added 032, 039, 045, 052; clarified that codes are length-validated only and that the table is the set resolved to a bank name.
  • Support: replaced the non-existent email/docs/status URLs with the real Telegram and help-centre channels.

#v1.1.0 (2025-12-24)

  • Updated webhook payload format to flat structure
  • Added qr_code_image field in deposit response (Base64 PNG)
  • Added deposit fields: bank_code, bank_account_no, bank_account_name
  • Added more bank codes
  • Added rate limit documentation
  • Added transaction expiry documentation
  • (This release also claimed expiry sets status to failed; that was incorrect and is corrected in v1.2.0.)

#v1.0.0 (2024-12-12)

  • Initial release
  • Deposit payments with PromptPay QR
  • Withdrawal/payout to bank accounts
  • HMAC-SHA256 authentication
  • Webhook notifications
  • Sandbox/Production merchant type routing