Create and share a payment link
Sell without code: create a one-time link in the portal, share it by WhatsApp or QR, and confirm the payment — or create reusable product links with the API.
What you will do
A payment link opens the VEXPay hosted checkout for a fixed amount in USD. The buyer picks how to pay among the methods your account offers. Each portal link accepts one payment.
- A seller account (marketplace accounts do not have payment links; use checkout sessions instead, see Split payments).
- For live links: live mode approved (see Go live). Test links work at any time.
- Optional: your Business profile filled in, so buyers see your name and logo.
Steps
- Open Payment links
In the portal, pick Live or Test in the header, then open Payment links.
- Fill in the link
Amount in USD (up to 2 decimals), a description the buyer sees (up to 140 characters), and optionally a private reference and an expiry date in the future.
- Share it
Use Copy link, Share, or QR code. Below each active link the portal lists "Buyers can pay with: …", with a short reason for any method that is hidden.
- Get paid
When the buyer pays, the link turns Paid, the payment appears in Payments, and your
payment.*webhooks fire.
Reusable links for a product (API)
To sell the same item many times at a fixed unit price, create a product and a product link. Product links accept many payments and can let the buyer pick a quantity.
curl --request POST "${API_URL}/v1/products" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{ "name": "Monthly plan", "priceUsd": 12.00 }'
curl --request POST "${API_URL}/v1/products/PRODUCT_ID/links" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{ "allowQuantity": true, "maxQuantity": 10 }'Turn a product link off with PATCH /v1/payment-links/:id and { "status": "disabled" }. More: Products & links
Check that it worked
- Open the link in a private window: you see your business name, the description and the amount.
- After a test payment the link shows Paid and anyone opening it again sees that it was already paid.
- Your webhook endpoint received
payment.completed.
If something goes wrong
| Symptom | Likely cause | What to do |
|---|---|---|
| "This payment link is not available." | Live mode not approved or suspended, the account disabled, or the product link disabled | Check your live status, or enable the link again. |
| "This payment link has already been paid." | One-time link already paid | Create a new link. |
| "This payment link has expired." | The expiry passed | Create a new link. |
409 charge_in_progress | Another buyer is paying the same one-time link | Retry in a moment. |
| A method is missing | See the reason under the link | See Turn methods on or off. |
403 payment_links_unavailable | Marketplace account | Use checkout sessions from the API. |
Related: Payment links · Browser checkout