Payments API
Create, list, refresh and cancel hosted payment links and read receivables figures.
Payments lets your workspace collect money from your own customers through a payment provider you have connected (Razorpay). This API creates and tracks hosted payment links. Connecting the provider account itself (its keys) is done in the app, and the keys are never returned by the API.
This is separate from your AxisIQ subscription: here your workspace charges its customers with your provider account.
If the Invoices & Payments app is switched off in Settings › Apps, these routes answer 404 NOT_FOUND.
Endpoints
| Method | Path | Permission | What it does |
|---|---|---|---|
GET |
/orgs/{orgId}/payments/connections |
payments:read |
List connected provider accounts |
GET |
/orgs/{orgId}/payments/links |
payments:read |
List payment links |
POST |
/orgs/{orgId}/payments/links |
payments:collect |
Create a payment link |
GET |
/orgs/{orgId}/payments/links/{linkId} |
payments:read |
Get a link |
POST |
/orgs/{orgId}/payments/links/{linkId}/cancel |
payments:collect |
Cancel an unpaid link |
POST |
/orgs/{orgId}/payments/links/{linkId}/refresh |
payments:collect |
Re-check the status with the provider |
GET |
/orgs/{orgId}/payments/overview |
payments:read |
Receivables and collections summary |
Connections can also be created, edited, tested and deleted (payments:manage), but that involves provider secrets, so use the app. GET …/connections returns a plain array. GET …/links/{linkId} answers 404 NOT_FOUND for an unknown link.
Connections
{
"id": "0190f300-…",
"provider": "razorpay",
"name": "Main account",
"mode": "live",
"redirect_url": "https://example.com/thanks",
"status": "ok",
"last_checked_at": "2026-10-04T09:00:00Z",
"created_at": "2026-10-01T08:00:00Z"
}
id is the connection_id you pass when creating a link. redirect_url is where a payer is sent after paying, unless a link sets its own. last_error appears when the last check failed. Secrets are never included.
The link object
{
"id": "0190f301-…",
"connection_id": "0190f300-…",
"provider": "razorpay",
"short_url": "https://pay.example.com/AbC123",
"amount": "12500.00",
"currency": "INR",
"status": "created",
"description": "Invoice INV-1001",
"invoice_id": "0190f0aa-…",
"customer_name": "Asha Rao",
"customer_email": "asha@example.com",
"customer_contact": "+919876543210",
"created_at": "2026-10-04T09:30:00Z"
}
status is created (waiting to be paid), paid, cancelled or expired. When it is paid, paid_at and payment_record_id appear. The payment record is an ordinary payments record you can read through the Records API.
short_url is the page you send to the customer.
POST /orgs/{orgId}/payments/links
Permission: payments:collect.
| Field | Type | Required | Notes |
|---|---|---|---|
connection_id |
string | Yes | A connection id |
amount |
string | Yes, unless invoice_id is given |
A positive decimal such as "12500.00" |
currency |
string | No | ISO 4217 code. Default: the invoice's currency, else the workspace default currency |
description |
string | No | Shown to the payer |
invoice_id |
string | No | An invoice record. Fills the amount and currency when you leave them out. You must be able to read that invoice |
redirect_url |
string | No | Where the payer goes afterwards. Overrides the connection's |
customer_name, customer_email, customer_contact |
string | No | Pre-fill the payer's details |
curl -s -X POST https://axisiq.co/api/v1/orgs/$ORG/payments/links \
-H "Authorization: Bearer $AXIS_KEY" -H "Content-Type: application/json" \
-d '{"connection_id": "0190f300-…", "invoice_id": "0190f0aa-…", "customer_email": "asha@example.com"}'
Response 201 with the link object.
Errors
| Status | Code | When |
|---|---|---|
| 400 | VALIDATION_ERROR |
Missing or invalid amount, bad connection or invoice id, an invoice that does not exist or that your role cannot read ("invoice not found or not accessible"), a redirect_url that is not an absolute http(s) address |
| 403 | FORBIDDEN |
The role lacks payments:collect |
| 404 | NOT_FOUND |
No such connection |
GET /orgs/{orgId}/payments/links
Cursor paging, newest first. limit (default 50, maximum 100) and cursor. The response is an array of link objects; to get the next page pass the id of the last link as cursor.
How a link becomes paid
When the customer pays, your provider notifies AxisIQ and the link turns paid. AxisIQ then creates a payments record. The invoice is not closed automatically; someone (or a flow) closes it.
To receive that notification, open Invoices & Payments › Connections, edit the connection, and paste the webhook address shown there into your provider's dashboard. If a notification is ever missed, call POST …/links/{linkId}/refresh. It re-checks the provider and updates the link, which is safe to repeat.
POST /orgs/{orgId}/payments/links/{linkId}/cancel
Cancels a link that has not been paid. Response 200 with the link.
GET /orgs/{orgId}/payments/overview
The app's home figures: open and overdue receivables by currency, aging buckets (current, 1 to 30, 31 to 60, 61 to 90, 90+ days), top debtors, the oldest overdue invoices, payments collected per month and link counts per status. Invoice and payment figures only include what your role may read.
Related
- Accounting
- Records
- In the product: Invoices and payments