Introduction
Auto-generated reference for every XPay endpoint.
Create a checkout session POST
Creates a new checkout session for hosted or embedded checkout. Returns a session with a URL to redirect customers for payment.
Retrieve a checkout session GET
Retrieves an existing checkout session by ID. Returns full session data including clientSecret.
Update a checkout session PATCH
Updates an open checkout session. Immutable fields (mode, uiMode, submitType, currency, expiresAfterMinutes) cannot be changed after creation.
Expire a checkout session POST
Expires an open checkout session. Expired sessions cannot be used for payment.
List customers GET
Lists customers with search and pagination. Returns only essential fields: id, createdAt, name, phone, email, and latestPaymentMethod. Search supports customer ID, name, email, or phone (supports comma-separated terms).
Create a customer POST
Creates a new customer record.
At least one contact method (email or phone) is required.
Customers are environment-specific (test vs live database).
Get customer by ID GET
Retrieves customer lifecycle information (id, type, name, email, phone, address, metadata). Response shape is identical to the `customer.*` webhook payload. For transaction counts + payment methods, call `GET /customers/:id/stats`.
List payment links GET
Lists payment links with advanced filtering, pagination, and search.
Features:
- Filter by active status
- Search by product name, description, or unitLabel
- Filter by amount (equal, between, greater, less)
- Filter by date (last period, equal, between, after, before)
- Pagination support
Create a payment link POST
Creates a new payment link - a shareable link that merchants can send to customers.
Features:
- Supports multiple line items with adjustable quantities
- Custom fields for collecting additional customer information
- After completion settings (redirect or hosted confirmation)
- Automatic amount calculation from line items
- Validates currency consistency across line items
Get a payment link by ID GET
Retrieves a payment link with all related data including:
- Line items with prices and products
- Custom fields with dropdown options
- After completion settings
Update a payment link PATCH
Partially updates an existing payment link. Only provided fields will be updated.
Features:
- Partial updates: Only send fields you want to update
- Updates line items with adjustable quantities (if provided, replaces all existing line items)
- Updates custom fields (if provided, replaces all existing custom fields)
- Updates after completion settings (if provided, replaces existing settings)
- Recalculates amount from line items when line items are updated
- Validates currency consistency across line items when line items are updated
Note:
- If lineItems is provided, all existing line items are replaced
- If customFields is provided, all existing custom fields are replaced
- If customFields is an empty array, all custom fields are removed
- expiresAt can be set to null to remove expiration
Get product by ID GET
Retrieves product information including all associated prices. Response shape is identical to the `product.*` webhook payload. For per-price usage counts, call `GET /products/:id/stats`.
Update product PATCH
Updates product information.
Can update product data fields, default price, and image.
- The defaultPrice field should be the ID of the Price object that is the default price for this product
- The image field should be a URL string (use the /upload-url endpoint to get a one-time upload URL first)
Delete product DELETE
Deletes a product and cascade-deletes all of its prices in one transaction. Fails if any of the product's prices have ever been referenced by a line item — in that case the product must be archived instead.
List products GET
Lists products with search and filters.
Supports:
- Active filter (active=true/false)
- Metadata filter (JSON string)
- Search in name, description, and unitLabel fields
- Pagination
Create a product POST
Creates a new product.
Optionally includes:
- An image URL (use the /upload-url endpoint to get a one-time upload URL first)
- A default price object which will be set as the default price for this product
Create a price POST
Creates a new Price for an existing Product.
Update a price PATCH
Updates the specified price by setting the values of the parameters passed.
Any parameters not provided are left unchanged.
Delete a price DELETE
Deletes a price. Only prices that have never been referenced by a line item can be deleted — once a price has been used in any checkout session or payment link, archive it instead.
If the price is set as the default price for a product, the default price reference will be cleared.
List refunds GET
Lists refunds with optional filters for charge and pagination.
Create a refund POST
Creates a full or partial refund for a successful charge.
Target: provide EXACTLY ONE of `chargeId` or `paymentIntentId`.
When `paymentIntentId` is supplied the server resolves it to the unique
succeeded charge under that intent; the request is rejected if the intent
has zero or multiple succeeded charges.
Features:
- Full or partial refunds
- Ledger reversal (double-entry bookkeeping)
- Balance updates (debits available funds)
- Updates charge.amountRefunded
- Updates paymentIntent.amountRefunded
Refunds:
- Hit available balance immediately (no hold period)
- Create negative balance transactions
- Reverse the original charge's ledger entries
- Platform keeps fees (business decision)
Get refund by ID GET
Retrieves a refund with all details including ledger info.
Balance Transaction
A Balance Transaction records every movement of money in or out of your xpay balance: successful charges, refunds, payouts, processing fees, and adjustments. Each Balance Transaction links back to its `source` (the Charge, Refund, or Payout that produced it) and breaks down `gross`, `fee`, and `net` amounts. Use Balance Transactions to reconcile what was paid into your account against what was settled to your bank.
Charge
A Charge represents a single attempt to move money from a customer's payment method to your account. It records what was paid, by whom, through which processor, and the final outcome: `succeeded`, `failed`, or `refunded`. A single PaymentIntent may produce multiple Charges if earlier attempts fail; only the most recent successful Charge actually moves funds, and any subsequent Refunds reference it directly.
Checkout Session
A Checkout Session represents your customer's session as they pay on an xpay-hosted checkout page. Create a new Session each time a customer begins a checkout: attach line items, customer details, or a PaymentIntent, then redirect the customer to the Session's `url` to begin payment. As the customer progresses, the Session's `status` and `paymentStatus` update; once payment succeeds, the Session contains references to the resulting Customer and PaymentIntent. Sessions expire 24 hours after creation if not completed.
Coupon
A Coupon defines a reusable discount you can apply to Checkout Sessions and PaymentIntents. Coupons can grant either a percentage off (`percentOff`) or a fixed amount off (`amountOff`), and can apply once, forever, or repeating for a number of billing cycles. You can also cap how many times a Coupon may be redeemed and when it expires. Coupons are the reusable template. Each concrete application of a Coupon to a customer's purchase is recorded as a Discount.
Customer
A Customer represents a buyer you do business with. Use Customers to save payment methods for reuse, track lifetime spend, attach metadata for your CRM, and group related Charges, Refunds, and Checkout Sessions under a single record. You can identify a Customer by their email or by a stable external ID from your own system and reference them on any future payment.
Discount
A Discount records a single application of a Coupon to a specific Checkout Session, PaymentIntent, or Customer. Where a Coupon is the reusable template, a Discount captures the concrete redemption: which Coupon was applied, when it became active, when it expires, and (when applicable) which Promotion Code the customer entered to claim it.
Payment Intent
A PaymentIntent tracks the full lifecycle of collecting one payment from your customer: from creation, through authorization and 3-D Secure, to capture and final outcome. We recommend creating one PaymentIntent per order: you can inspect its history of Charge attempts, watch its `status` as it transitions, and reference the successful Charge it ultimately produces. PaymentIntents are the object that the hosted Checkout and xpay.js drive on the client to complete a payment.
Price
A Price defines what a Product costs: the unit amount, currency, and (for subscriptions) billing interval. A single Product can have many Prices, letting you offer the same item in multiple currencies, tiers, or billing models without duplicating your catalog. Reference a Price by ID when creating Checkout Sessions, Payment Links, or line items, and the customer is charged according to what the Price defines.
Product
A Product represents a good or service you sell. Products carry only descriptive information (name, description, images), while their pricing is described separately by Price objects. A single Product can have many Prices: for example, the same digital course offered in EGP and USD, or at different tiers. Use Products to model your catalog and Prices to model how each is sold.
Refund
A Refund returns funds from a successful Charge back to the customer's original payment method. Refunds can be full or partial, and a single Charge can be refunded multiple times up to its original amount. The Refund's `status` reflects the processor's progress as the money makes its way back: `pending` while in flight, `succeeded` once the funds have been returned, or `failed` if the processor rejected the request.