DevelopersAPIAPI reference
API

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.

A payment link is a hosted page that takes a payment. See also Pay and donate.

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.

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).

  • PATCH /payment-links/57 with 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.