API reference
Every endpoint of the Paylead API, with its parameters and what it returns.
Base URL https://paylead.app/api/v1. Every request needs Authorization: Bearer sk_live_… (see Authentication). Lists take ?page= and ?per_page= (up to 100).
| Endpoint | |
|---|---|
| Access | GET /access |
| Store | GET /store |
| Subscriptions | GET /subscriptions · GET /subscriptions/{id} · POST /subscriptions/{id}/cancel |
| Orders | GET /orders · GET /orders/{id} |
| Products | GET /products · GET /products/{id} |
| Customers | GET /customers · POST /customers · GET /customers/{id} · PATCH /customers/{id} |
| Payment links | GET /payment-links · POST /payment-links · GET PATCH DELETE /payment-links/{id} |
| Invoices | GET /invoices · POST /invoices · GET /invoices/{id} · POST /invoices/{id}/send · POST /invoices/{id}/cancel |
Access
GET /access?ref=USER_123 answers whether a user should be let in. Pass ref or email, and optionally product_id. See Checking access.
Store
GET /store returns the store the key belongs to.
{
"data": {
"id": 12,
"object": "store",
"name": "My App",
"description": null,
"currency": "GHS",
"logo_url": "https://…",
"url": "https://…",
"status": "active",
"verification_status": "verified",
"buyer_pays_charges": false,
"created_at": "2026-09-01T10:00:00+00:00"
}
}
Subscriptions
The subscription object
| Field | |
|---|---|
id |
sub_… |
status |
active, past_due, cancelled or expired (see statuses) |
has_access |
Whether to let them in now |
ref |
Your id for the user, or null |
customer |
{ id, name, email, phone } |
product |
{ id, name } |
amount, currency |
What they pay each period |
interval |
week, month, quarter or year |
started_at |
Their first payment |
current_period_start, current_period_end |
The paid period |
access_ends_at |
When access stops if they don't renew |
cancelled_at, ended_at |
When they cancelled, and when access ended |
payments_count, total_paid |
All their payments |
manage_url |
Their private page to renew or cancel |
metadata |
Extra data, {} if none |
List subscriptions
GET /subscriptions
| Parameter | |
|---|---|
status |
One status. By default every subscription that was ever paid |
ref |
Your id for the user |
email |
The subscriber's email |
product_id |
One product's subscriptions |
Get a subscription
GET /subscriptions/sub_8f2k1m0q9z
Cancel a subscription
POST /subscriptions/sub_8f2k1m0q9z/cancel
It won't renew, and the subscriber is told by email. They keep access until the end of the paid period; in the grace period, access ends now. Returns the subscription. Only active and past_due subscriptions can be cancelled (422 not_cancellable otherwise).
Orders
The order object
{
"id": 4210,
"object": "order",
"number": "K7Q2M9XA",
"short_number": "K7Q2M9XA",
"payment_status": "paid",
"order_status": "completed",
"fulfillment_status": "fulfilled",
"payment_method": "moolre",
"source": "embed",
"currency": "GHS",
"subtotal": 50,
"discount": 0,
"shipping_fee": 0,
"total": 50,
"fee": 3,
"net": 47,
"customer": { "id": 881, "name": "Ama Mensah", "email": "[email protected]", "phone": "0240000000" },
"items": [
{ "product_id": 31, "name": "Pro plan (Monthly)", "quantity": 1, "unit_price": 50, "total": 50 }
],
"payment_link_id": null,
"invoice_id": null,
"subscription_id": "sub_8f2k1m0q9z",
"receipt_url": "https://paylead.app/receipt/K7Q2M9XA",
"created_at": "2026-10-10T09:00:00+00:00",
"updated_at": "2026-10-10T09:01:12+00:00"
}
fee is Paylead's fee on the order and net is what you keep. source is where it came from: storefront, funnel, embed, payment_link, invoice or subscription, among others.
List orders
GET /orders
| Parameter | |
|---|---|
payment_status |
For example paid or pending |
email |
The customer's email |
product_id |
Orders containing this product |
source |
Where the order came from |
created_after, created_before |
Dates or ISO 8601 times |
Get an order
GET /orders/4210 or GET /orders/K7Q2M9XA: by id or by order number.
Products
The product object
| Field | |
|---|---|
id, name, short_description |
|
kind |
physical, digital, course, webinar, subscription, service, bookings or bundle |
status |
active, draft and so on |
price, sale_price, currency |
The base price in the store's currency |
image_url, url |
The main picture and the product page |
subscription |
For subscriptions: { interval, price, subscribe_url }. Otherwise null |
List products
GET /products?kind=subscription&status=active
Get a product
GET /products/31
Customers
Customers belong to your account, shared by all your stores.
The customer object
id, name, email, phone, company, country, city, address, status, source, lifetime_value, customer_since, accepts_marketing, created_at, updated_at.
List customers
GET /customers
| Parameter | |
|---|---|
email |
Exact email |
phone |
Exact phone number |
search |
Part of a name, email or phone |
Add or update a customer
POST /customers
{
"name": "Kofi Boateng",
"email": "[email protected]",
"phone": "0551112222",
"city": "Accra"
}
name is required, plus email or phone. Also takes company, country, city and address. If a customer with that email (or phone) exists, they're updated and you get 200; otherwise they're created and you get 201.
Change a customer
PATCH /customers/881 with any of name, email, phone, company, country, city, address.
Payment links
A payment link is a hosted page that takes a payment. See also Pay and donate.
The payment link object
id, title, description, amount_type (fixed or custom), amount, min_amount, currency, status (active, paused, expired or completed), is_active, is_reusable, max_payments, expires_at, collect_email, custom_question, thank_you_message, redirect_url, payments_count, total_collected, url, created_at, updated_at.
Create a payment link
POST /payment-links
{
"title": "Deposit for order #1042",
"amount": 120,
"is_reusable": false,
"redirect_url": "https://mysite.com/orders/1042/paid"
}
| Field | |
|---|---|
title |
Required |
amount_type |
fixed (default) or custom, where the payer types the amount |
amount |
Required for fixed amounts |
min_amount |
The lowest a payer can type, for custom amounts |
is_reusable |
true (default) for many payers; false for one payment |
max_payments |
For reusable links, stop after this many |
expires_at |
Stop taking payments at this time |
collect_email |
Require an email |
custom_question |
One question to ask the payer |
thank_you_message |
Shown after paying |
redirect_url |
Send the payer here after paying instead |
description |
Shown under the title |
Returns 201 with the link. Send people to its url, or open it over your site with Paylead.pay(slug).
Change, pause or delete a link
PATCH /payment-links/57with any field above, or{"is_active": false}to pause it.DELETE /payment-links/57. Payments already made stay in your orders.
Invoices
The invoice object
id, number (INV-0042), status (draft, sent, viewed, part_paid, paid, overdue, cancelled), customer { id, name, email, phone }, currency, items [{ description, quantity, unit_price }], subtotal, discount, tax_label, tax_rate, tax_amount, total, amount_paid, balance, allow_part_payment, min_part_payment, notes, issued_on, due_on, sent_at, paid_at, cancelled_at, url (the pay page), pdf_url, created_at, updated_at.
List invoices
GET /invoices?status=overdue or ?email=.
Create an invoice
POST /invoices
{
"customer_name": "Kofi Boateng",
"customer_email": "[email protected]",
"customer_phone": "0551112222",
"items": [
{ "description": "Logo design", "quantity": 1, "unit_price": 300 },
{ "description": "Business cards", "quantity": 2, "unit_price": 50 }
],
"due_on": "2026-10-20",
"send": ["email", "sms"]
}
| Field | |
|---|---|
customer_name |
Required |
customer_email, customer_phone, customer_id |
Who to send it to |
items |
Required. 1 to 50 lines of description, quantity, unit_price |
discount |
Taken off the subtotal |
tax_label, tax_rate |
For example VAT, 15 |
due_on |
The due date. Paylead reminds them on the day, 3 and 7 days after |
notes |
Shown on the invoice |
allow_part_payment, min_part_payment |
Let them pay in parts |
send |
["email"], ["sms"] or both to send it now. Without it, it's saved as a draft |
Send an invoice
POST /invoices/42/send with {"channels": ["email", "sms"]}. Returns 422 if the invoice is paid or cancelled, or if it couldn't go out on any channel.
Cancel an invoice
POST /invoices/42/cancel. Nobody can pay it afterwards. A paid invoice can't be cancelled.