Verify Pay API Documentation

Verify Pay provides a REST API that allows you to accept and automatically verify mobile payments from bKash, Nagad, Rocket, and Upay in Bangladesh.

๐Ÿ“Œ Base URL: https://fllbpnbosmitytxxqutk.supabase.co/functions/v1

All API endpoints use HTTPS. Requests must include your API key in the x-api-key header.

๐Ÿ” Authentication

Every API request must include your API key. You can find your keys in the Dashboard โ†’ API Keys section.

Headers

HeaderValueRequired
x-api-keyYour live or test API keyRequired
Content-Typeapplication/jsonRequired
x-idempotency-keyUnique key to prevent duplicatesOptional

โš ๏ธ Live keys (vp_live_*) process real payments. Test keys (vp_test_*) use the sandbox environment.

๐Ÿš€ Quick Start

Get started in 3 steps:

  1. Sign up at verifypay.eu.cc and get your API key
  2. Install the Android app on the phone that receives payments
  3. Create a payment using the API below
Create Payment โ€” CURL
curl -X POST "https://fllbpnbosmitytxxqutk.supabase.co/functions/v1/create-payment" \
  -H "Content-Type: application/json" \
  -H "x-api-key: vp_live_YOUR_API_KEY" \
  -d '{
    "amount": 500,
    "method": "bkash",
    "sender_number": "01712345678",
    "external_id": "order_123"
  }'

๐Ÿ’ณ Create Payment

POST/functions/v1/create-payment

Creates a new payment request. The payment will be in pending status until matched with a notification from the Android app.

Request Body

ParameterTypeDescription
amountnumberPayment amount in BDT Required
methodstringbkash, nagad, rocket, upay Optional
sender_numberstringExpected sender phone number Optional
external_idstringYour order/reference ID Optional
metadataobjectCustom metadata Optional

Response

Success Response (200)
{
  "success": true,
  "payment": {
    "id": "uuid-here",
    "amount": 500,
    "method": "bkash",
    "status": "pending",
    "payment_page_url": "https://verifypay.eu.cc/pay/uuid",
    "expires_at": "2026-03-29T13:00:00Z",
    "created_at": "2026-03-29T12:30:00Z"
  }
}

๐Ÿ“Š Payment Status

GET/functions/v1/payment-status?payment_id=UUID

Check the current status of a payment.

Check Status โ€” CURL
curl "https://fllbpnbosmitytxxqutk.supabase.co/functions/v1/payment-status?payment_id=UUID" \
  -H "x-api-key: vp_live_YOUR_API_KEY"

Payment Statuses

pendingโ†’matchedโ†’verifiedor โ†’failed/ expired

โœ… Manual Verify

POST/functions/v1/manual-verify

Manually verify a payment that is in matched or pending status. Useful for payments that scored below the auto-approve threshold.

ParameterTypeDescription
payment_idstringPayment UUID Required
actionstring"verify" or "reject" Required

๐Ÿ”” Webhook Events

Verify Pay sends webhooks to your configured URL when payment events occur. Configure your webhook URL in the Dashboard.

Event Types

EventDescription
payment.verifiedPayment has been automatically verified
payment.matchedPayment matched but requires manual review
payment.failedPayment verification failed
payment.expiredPayment expired without verification

Webhook Payload

payment.verified
{
  "event": "payment.verified",
  "payment_id": "uuid-here",
  "external_id": "order_123",
  "amount": 500,
  "method": "bkash",
  "confidence": 95,
  "verified_at": "2026-03-29T12:30:15Z"
}

๐Ÿ›ก๏ธ Webhook Security (HMAC)

Every webhook includes an X-Verify Pay-Signature header containing an HMAC-SHA256 signature. Always verify this signature to ensure the webhook came from Verify Pay.

Verify Webhook โ€” CURL
# Webhook payload sent to your URL:
# Headers:
#   X-Verify Pay-Signature: sha256=HMAC_HASH
#   X-Verify Pay-Event: payment.verified
#   X-Verify Pay-Timestamp: 2026-03-29T12:00:00Z

๐Ÿ“ฆ JavaScript SDK

Install
npm install @Verify Pay/sdk
Usage
import { Verify Pay } from '@Verify Pay/sdk';

const vp = new Verify Pay('vp_live_YOUR_API_KEY');

const payment = await vp.createPayment({
  amount: 500,
  method: 'bkash',
  sender_number: '01712345678',
  external_id: 'order_123',
});

console.log(payment.id, payment.payment_page_url);

๐Ÿ“ฆ PHP SDK

Install
composer require Verify Pay/Verify Pay-php
Usage
<?php
use Verify Pay\Verify PayClient;

$vp = new Verify PayClient('vp_live_YOUR_API_KEY');

$payment = $vp->createPayment([
    'amount' => 500,
    'method' => 'bkash',
    'sender_number' => '01712345678',
    'external_id' => 'order_123',
]);

echo $payment['id'];

๐Ÿ“ฆ Node.js SDK

Install
npm install @Verify Pay/node
Usage
const { Verify Pay } = require('@Verify Pay/node');

const vp = new Verify Pay('vp_live_YOUR_API_KEY');

const payment = await vp.createPayment({
  amount: 500,
  method: 'bkash',
  senderNumber: '01712345678',
  externalId: 'order_123',
});

console.log(payment.id);

๐Ÿ“ฆ Python SDK

Install
pip install Verify Pay
Usage
from Verify Pay import Verify Pay

vp = Verify Pay(api_key="vp_live_YOUR_API_KEY")

payment = vp.create_payment(
    amount=500,
    method="bkash",
    sender_number="01712345678",
    external_id="order_123",
)

print(payment["id"])

๐Ÿงช Sandbox Mode

Use test API keys (vp_test_*) to simulate the full payment flow without real transactions. Generate your test keys from the Dashboard โ†’ Sandbox page.

Sandbox Endpoints

ActionEndpointDescription
Create Payment?action=create-paymentCreate a fake payment
Simulate Notify?action=simulate-notifySimulate notification & match
List Payments?action=listList sandbox payments
Reset?action=resetClear all sandbox data

โŒ Error Codes

StatusCodeDescription
400invalid_requestMissing or invalid parameters
401unauthorizedInvalid or missing API key
403forbiddenInsufficient permissions
404not_foundPayment or resource not found
409conflictIdempotency conflict
429rate_limitedToo many requests
500server_errorInternal server error

โฑ๏ธ Rate Limits

PlanRequests/HourVerifications/Day
Free10010
Pro5,0001,000
Enterprise100,000Unlimited

Rate limit info is returned in response headers: X-RateLimit-Remaining, Retry-After.

๐Ÿ”„ Payment Flow

This is the complete lifecycle of a payment verification:

  1. Create Payment โ€” Your server calls create-payment API
  2. Show Payment Page โ€” Customer sees bKash/Nagad number to pay
  3. Customer Pays โ€” Sends money via their mobile banking app
  4. Notification Captured โ€” Android app captures the payment notification
  5. Matching Engine โ€” System matches notification to your payment request
  6. Verification โ€” Score โ‰ฅ90 โ†’ Auto-verified, 60-89 โ†’ Manual review
  7. Webhook โ€” Your server receives the payment.verified event
  8. Done โ€” Fulfill the order!