Skip to content

Dynamic PayID

Create and manage temporary, auto-expiring checkout PayIDs. Dynamic PayIDs are ideal for one-time payments, invoices, or payment links.

Required permission: virtual_payid

Create Dynamic PayID

POST /v1/checkout/dynamic-payid

Authentication

Requires a secret key (sk_*).

Request body

ParameterTypeRequiredDescription
amountnumberNoExpected payment amount in naira (e.g., 5000). If omitted, any amount is accepted
amount_validationstringNoHow to validate incoming amounts. Default: "A4". See amount validation rules
allow_multiple_paymentsbooleanNoAccept more than one payment. Default: false
expires_in_minutesintegerNoExpiry time in minutes. Default: 1440 (24h). Max: 4320 (72h)
namestringNoDisplay name (max 255 chars). Auto-generated from your account name if omitted
metadataobjectNoCustom key-value data stored with the PayID

Settlement

Payments received on this PayID are settled to your API key's configured settlement ledger. To change where payments are settled, update your API key's settlement configuration in the dashboard.

Example request

bash
curl -X POST https://api.zevpaycheckout.com/v1/checkout/dynamic-payid \
  -H "Content-Type: application/json" \
  -H "x-api-key: sk_test_your_secret_key" \
  -d '{
    "amount": 5000,
    "amount_validation": "A0",
    "name": "Invoice #1234",
    "expires_in_minutes": 1440,
    "metadata": {
      "invoice_id": "INV-1234"
    }
  }'
javascript
const response = await fetch(
  "https://api.zevpaycheckout.com/v1/checkout/dynamic-payid",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": "sk_test_your_secret_key",
    },
    body: JSON.stringify({
      amount: 5000,
      amount_validation: "A0",
      name: "Invoice #1234",
      expires_in_minutes: 1440,
      metadata: { invoice_id: "INV-1234" },
    }),
  }
);
const data = await response.json();

Response

json
{
  "success": true,
  "data": {
    "id": "a1b2c3d4-...",
    "slug": "a4b7",
    "suffix": ".dypid",
    "full_pay_id": "a4b7.dypid",
    "settlement_pay_id_id": "s1t2u3v4-...",
    "creator_pay_id_id": "c1d2e3f4-...",
    "creator_type": "business",
    "business_id": "b1c2d3e4-...",
    "name": "Invoice #1234",
    "amount": "5000.00",
    "amount_validation": "A0",
    "allow_multiple_payments": false,
    "status": "active",
    "source": "api",
    "expires_at": "2026-03-09T12:00:00.000Z",
    "deactivated_at": null,
    "completed_at": null,
    "created_at": "2026-03-08T12:00:00.000Z"
  }
}

List Dynamic PayIDs

GET /v1/checkout/dynamic-payid

Query parameters

ParameterTypeDefaultDescription
pageinteger1Page number
page_sizeinteger20Items per page (max 100)
statusstringFilter: "active", "completed", "expired", "deactivated"
searchstringSearch by slug, name, or PayID

Example request

bash
curl "https://api.zevpaycheckout.com/v1/checkout/dynamic-payid?status=active&page_size=10" \
  -H "x-api-key: sk_test_your_secret_key"

Response

json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "a1b2c3d4-...",
        "full_pay_id": "a4b7.dypid",
        "name": "Invoice #1234",
        "amount": "5000.00",
        "status": "active",
        "expires_at": "2026-03-09T12:00:00.000Z",
        "created_at": "2026-03-08T12:00:00.000Z"
      }
    ],
    "total": 1,
    "page": 1,
    "page_size": 10,
    "total_pages": 1
  }
}

Get Dynamic PayID

GET /v1/checkout/dynamic-payid/:id

Path parameters

ParameterTypeDescription
idstringDynamic PayID UUID

Example request

bash
curl https://api.zevpaycheckout.com/v1/checkout/dynamic-payid/a1b2c3d4-... \
  -H "x-api-key: sk_test_your_secret_key"

Deactivate Dynamic PayID

Deactivate a dynamic PayID before its natural expiry.

DELETE /v1/checkout/dynamic-payid/:id

Example request

bash
curl -X DELETE https://api.zevpaycheckout.com/v1/checkout/dynamic-payid/a1b2c3d4-... \
  -H "x-api-key: sk_test_your_secret_key"

Response

json
{
  "success": true,
  "data": {
    "success": true,
    "message": "Dynamic PayID deactivated."
  }
}

Amount Validation Rules

Control how incoming payment amounts are validated against the configured amount:

RuleDescription
A0Exact match — payment must equal the amount exactly
A1Less than — payment must be less than the amount
A2Greater than — payment must be greater than the amount
A3At most — payment must be equal to or less than the amount
A4At least — payment must be equal to or greater than the amount (default)
A5Any amount — no validation applied

If amount is not set, all incoming payments are accepted regardless of the validation rule.


Response fields

FieldTypeDescription
idstringUnique identifier (UUID)
slugstringShort auto-generated slug
suffixstringAlways ".dypid"
full_pay_idstringComplete PayID (e.g., "a4b7.dypid")
settlement_pay_id_idstringPayID where payments are settled
creator_pay_id_idstringCreator's PayID UUID
creator_typestring"personal" or "business"
business_idstring|nullBusiness UUID (if created by a business)
namestringDisplay name
amountstring|nullConfigured amount (naira, e.g., "5000.00")
amount_validationstringValidation rule (A0A5)
allow_multiple_paymentsbooleanWhether multiple payments are accepted
statusstring"active", "completed", "expired", or "deactivated"
sourcestringCreation source ("api", "dashboard", etc.)
expires_atstringISO 8601 expiry timestamp
deactivated_atstring|nullWhen deactivated (if applicable)
completed_atstring|nullWhen a payment was received (if applicable)
created_atstringISO 8601 creation timestamp

Try it — Create Dynamic PayID

API Playground
POSThttps://api.zevpaycheckout.com/v1/checkout/dynamic-payid

Try it — List Dynamic PayIDs

API Playground
GEThttps://api.zevpaycheckout.com/v1/checkout/dynamic-payid

ZevPay Checkout Developer Documentation