Base URL: /v1/payment-links
Auth: Authorization: Bearer <secret_key>
Create payment link
POST /v1/payment-links
Body:
{
"currency": "NGN",
"title": "January dues",
"description": "Membership dues",
"amount": 5000,
"slug": "jan-dues",
"type": "fixed",
"quantity_limit": 1,
"expires_at": "2026-12-31T23:59:59Z",
"success_url": "https://example.com/success",
"cancel_url": "https://example.com/cancel",
"fields": ["First Name", "Last Name", "Email", "Phone"]
}Notes:
- payment-link slugs are globally unique because the public payment URL is slug-based
- if the requested slug already exists, the API automatically appends a numeric suffix such as
-2or-3
Example response:
{
"data": {
"id": "plink_1234567890",
"title": "January dues",
"description": "Membership dues",
"type": "fixed",
"amount": 5000,
"currency": "NGN",
"status": "pending",
"slug": "jan-dues",
"url": "https://pay.example.com/jan-dues",
"quantity_limit": 1,
"expires_at": "2026-12-31T23:59:59Z",
"success_url": "https://example.com/success",
"cancel_url": "https://example.com/cancel",
"metadata": {
"fields": ["First Name", "Last Name", "Email", "Phone"]
},
"created_at": "2026-05-18T10:00:00Z",
"updated_at": "2026-05-18T10:00:00Z"
}
}List payment links
GET /v1/payment-links
Query:
idstatusslugdate_fromdate_topagelimit
Notes:
- when
idis provided, the endpoint returns a single payment link - without
id, the endpoint returns a paginated list in latest-first order - date-only filters are normalized as:
date_from=YYYY-MM-DD=>YYYY-MM-DD 00:00:00date_to=YYYY-MM-DD=>YYYY-MM-DD 23:59:59
Single-item example:
GET /v1/payment-links?id=plink_1234567890Single-item response:
{
"data": {
"id": "plink_1234567890",
"title": "January dues",
"description": "Membership dues",
"type": "fixed",
"amount": 5000,
"currency": "NGN",
"status": "active",
"slug": "jan-dues",
"url": "https://pay.example.com/jan-dues",
"quantity_limit": 1,
"expires_at": "2026-12-31T23:59:59Z",
"success_url": "https://example.com/success",
"cancel_url": "https://example.com/cancel",
"metadata": {
"fields": ["First Name", "Last Name", "Email", "Phone"]
},
"created_at": "2026-05-18T10:00:00Z",
"updated_at": "2026-05-18T10:30:00Z"
}
}List example:
GET /v1/payment-links?status=active&date_from=2026-05-01&date_to=2026-05-18&page=1&limit=25List response:
{
"data": [
{
"id": "plink_1234567890",
"title": "January dues",
"description": "Membership dues",
"type": "fixed",
"amount": 5000,
"currency": "NGN",
"status": "active",
"slug": "jan-dues",
"url": "https://pay.example.com/jan-dues",
"quantity_limit": 1,
"expires_at": "2026-12-31T23:59:59Z",
"success_url": "https://example.com/success",
"cancel_url": "https://example.com/cancel",
"metadata": {
"fields": ["First Name", "Last Name", "Email", "Phone"]
},
"created_at": "2026-05-18T10:00:00Z",
"updated_at": "2026-05-18T10:30:00Z"
}
],
"meta": {
"page": 1,
"limit": 25,
"total": 1,
"total_pages": 1
}
}Payment link transactions
GET /v1/payment-links/transactions
Query:
uid(payment link uid)trx_idreferencestatuscustomer_emaildate_fromdate_topagelimit
Notes:
- when
trx_idorreferenceis provided, the endpoint returns a single transaction - otherwise it returns a paginated list of transactions linked to payment links
- date-only filters are normalized as:
date_from=YYYY-MM-DD=>YYYY-MM-DD 00:00:00date_to=YYYY-MM-DD=>YYYY-MM-DD 23:59:59
Single-item example:
GET /v1/payment-links/transactions?reference=trx-ref-001Single-item response:
{
"data": {
"id": 1001,
"trx_id": "trx_001",
"reference": "trx-ref-001",
"status": "success",
"amount": 5000,
"currency": "NGN",
"customer_email": "[email protected]",
"payment_link_uid": "plink_1234567890",
"created_at": "2026-05-18T10:15:00Z",
"updated_at": "2026-05-18T10:20:00Z"
}
}List example:
GET /v1/payment-links/transactions?uid=plink_1234567890&status=success&page=1&limit=20List response:
{
"data": [
{
"id": 1001,
"trx_id": "trx_001",
"reference": "trx-ref-001",
"status": "success",
"amount": 5000,
"currency": "NGN",
"customer_email": "[email protected]",
"payment_link_uid": "plink_1234567890",
"created_at": "2026-05-18T10:15:00Z",
"updated_at": "2026-05-18T10:20:00Z"
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 1,
"total_pages": 1
}
}Update payment link status
POST /v1/payment-links/status
Body:
{
"uid": "plink_123",
"status": "active"
}Allowed statuses:
pendingactiveinactiveexpired
Response:
{
"data": {
"id": "plink_123",
"title": "January dues",
"description": "Membership dues",
"type": "fixed",
"amount": 5000,
"currency": "NGN",
"status": "active",
"slug": "jan-dues",
"url": "https://pay.example.com/jan-dues",
"quantity_limit": 1,
"expires_at": "2026-12-31T23:59:59Z",
"success_url": "https://example.com/success",
"cancel_url": "https://example.com/cancel",
"metadata": {
"fields": ["First Name", "Last Name", "Email", "Phone"]
},
"created_at": "2026-05-18T10:00:00Z",
"updated_at": "2026-05-18T10:45:00Z"
}
}