Payment Page
When the buyer opens the link, they see the payment page Lunixi hosts on pay.lunixi.com. You do not host the page and you write no front-end code: the link's fields decide its content and your organization's brand settings decide its look. The payment step is the same Lunixi payment form as in the Checkout Form integration.
Address
https://pay.lunixi.com/7KQ2M9XAPT- The code is 10 characters: digits and upper-case letters except
I,L,OandU. - Case, dashes and spaces do not matter; the letters
IandLare read as1andOas0. That is why reading the code aloud on the phone or typing it by hand does not change the result:7kq2-m9xa-ptopens the same link. - After the payment, the buyer returns to the result page at
https://pay.lunixi.com/<CODE>/sonuc/<attempt-id>.
Page states
| State | What the buyer sees | HTTP |
|---|---|---|
ACTIVE | The payment page | 200 |
ACTIVE, startsAt not reached yet | The page and the start time; a payment cannot be started | 200 |
PAUSED | The page; payments are not being taken right now | 200 |
| Unavailable | An unbranded page saying the link is unavailable right now — your account cannot take payments at the moment | 200 |
COMPLETED, EXPIRED, DEACTIVATED | A page saying the link is no longer valid, with your organization's name and support contact details | 410 |
TAKEN_DOWN | A page saying the link was taken down; your organization's name and brand are not shown | 410 |
| Unknown code | A page saying the link was not found | 404 |
Two further conditions are shown on an open link: sold out when a multi-use link has reached its capacity, and another payment in progress when another buyer is paying a single-use link right now.
The buyer's steps
Opens the page
Your organization's legal name and brand, the link title and description, the amount or amount options, and the event date and tax note (taxNote) if set.
Enters the amount and details
On an OPEN link they enter an amount within your limits or pick a suggested amount; on a FIXED link they pick a quantity, on an ITEMIZED link item quantities. They then fill in the buyer details and custom fields you ask for and accept the legal documents if required.
Pay
Pressing the button first runs a bot check (Cloudflare Turnstile). Lunixi validates the amount and fields on the server, reserves stock if needed and opens the payment. If the link cannot take a payment right now (sold out, another payment in progress, paused), the buyer sees it at this step.
Pays on the payment form
The Lunixi payment form opens: card, installments and the other methods enabled in your form settings. If 3D Secure is required, the buyer goes to their bank's authentication screen and returns to the result page from there.
Sees the outcome
The result page reads the payment's status from the Lunixi server. On success the buyer can download the receipt; on failure, they can try again if the link can still take a payment.
Payment form
- The form settings in your dashboard (payment methods, installments tab, identity and fraud checks) apply to link payments too. A link can only narrow them:
checkout.paymentMethodslimits the methods shown to a subset of your form settings, andcheckout.requireThreeDsmakes 3D Secure required. - On
OPEN-amount andMULTI_USElinks, 3D Secure is always required. - Link payments go through the same payment-time fraud checks as your other payments.
- SplitPay (multi-card) is not available on link payments, and saved cards are not offered to the buyer.
- Once opened, the payment form is valid for about 15 minutes. If it expires or the card is declined, the buyer starts a new attempt from the page; every attempt is recorded separately (see Payment attempts).
Branding and look
The page's look comes from your organization-level brand settings. You edit them in the dashboard, in the Brand and Payment Page section of your payment form settings; they cannot be changed with an API key.
| Organization level | Link level |
|---|---|
| Logo, cover image | Title (title), description (description) |
| Primary color, accent color, theme (light / dark / automatic) | Pay button label (buttonLabelKey) |
| Display name, support email and phone | Legal document acceptance (requireTermsAcceptance) |
| Footer links: distance sales contract, refunds, privacy, KVKK, terms of use | Success message (successMessage), tax note (taxNote) |
| Default pay button label |
Rules:
- The logo and cover must be PNG, JPEG or WebP; SVG is not accepted. Logo up to 1 MiB, cover up to 2 MiB, both up to 4096×4096 pixels.
- Colors must have at least 3:1 contrast against the theme background; a color that does not is not saved. The button text color (black or white) is chosen automatically for the color you pick.
- At the top of the page, in the share preview, and in emails and SMS messages Lunixi sends, the primary identity is your organization's legal name; your display name is shown as secondary.
- In the dashboard you see a preview of the page before saving a change; no payment can be made in the preview.
Share preview
When the link is shared in apps such as WhatsApp, iMessage or Telegram, the preview card shows your organization's legal name, your logo and the link title. The amount and buyer details never appear in the preview.
TEST banner
A link in the TEST environment carries a fixed TEST banner at the top of the page stating that no payment is taken; the same marking is added to the page title and the share preview. The TEST page does not show the "secure payment with Lunixi" statement.
Report this link
Every page has a Report this link option that lets the buyer report a suspicious link to Lunixi. A report does not change the link's state by itself; Lunixi reviews it and takes the link down (TAKEN_DOWN) if needed.
Details collected from the buyer
- Standard fields — with
buyerFieldsyou choose hidden, optional or required for each: full name, email, phone, billing address, national ID number. Default: full name and email required, phone optional, address and national ID number hidden. - Custom fields — up to 20 fields: text, number, email, phone, date, select list, checkbox, TCKN, VKN. TCKN and VKN are validated algorithmically.
- Legal acceptance — with
requireTermsAcceptance: true, the buyer cannot pay without accepting the legal documents in your footer links. - Prefilled details — the details you pass in
prefillare written to the payment record on the server and take precedence; values the buyer types only fill fields that are still empty.
Details the buyer enters are stored encrypted and returned to you in the clear through payment attempts and the dashboard. The data sent to the payment page contains no reference, tags, metadata, merchantNotifyEmails, attribution fields or prefill.
Personal links and access verification
On a link with recipient set, the page shows the buyer's name and contact details masked only (A*** Y***, a***@example.com). The details you pass in prefill are not sent to the browser.
If you want the buyer to see these details in the form, add access verification to the link: "verification": { "required": true, "channel": "EMAIL" } (recipient.email is required).
The buyer requests a code
They request the code on the page; the 6-digit code is sent only to the recipient.email stored on the link. The buyer cannot specify another address; the page shows the target address masked.
Enters the code
The code is valid for up to 10 minutes and can be used once. With the right code, this browser session is verified for this link; the buyer sees the details you prefilled in the form (except the national ID number) and continues to payment.
- On a link that requires verification, a payment cannot be started before verification is complete.
- Up to 5 codes are sent per link; a new code can be requested after 60 seconds.
- After 5 wrong codes in total (requesting a new code does not reset this counter), or once the 5-code sending allowance is used up, verification locks and the link shows
verificationLocked: true. You unlock it by sending the link again withPOST /:id/send, which resets both counters. - This version supports the email channel only. In the TEST environment, the code goes only to the email addresses of your organization's verified members.
Result page and receipt
- The result page reads the payment's status (pending, succeeded, failed, expired) from the Lunixi server and refreshes itself at regular intervals. It opens only in the browser that started the payment; knowing the address alone does not reveal the result.
- On success, your
successMessageis shown; if you setsuccessRedirectUrl, the buyer is redirected there. - The buyer can download the receipt as a PDF. The receipt number is
PL-<YYYYMMDD>-<CODE>on a single-use link andPL-<YYYYMMDD>-<CODE>-<sequence>on a multi-use link (date in Istanbul time). The download link in the receipt email is valid for 30 days. This receipt is not an e-invoice. - When a payment is taken, a notification email is sent to the
merchantNotifyEmailsaddresses; in the TEST environment, only to your organization's verified members.
The result page and the redirect are not proof of payment. The buyer may close the tab, or the redirect may never happen. Close the order on the payment.captured webhook, not on a visit to your successRedirectUrl — see Webhooks.
Buyer-flow endpoints
You do not need to call these endpoints; the payment page calls them. They carry no credentials; browsers may make cookie-carrying (CORS) calls to them only from the pay.lunixi.com origin, and starting a payment, requesting a code and reporting require the bot check (Turnstile). An attempt is tied to a short-lived (2 hours) session cookie in the buyer's browser that only the server can read.
| Method | Path | What it does |
|---|---|---|
GET | /api/public/v1/pay/:code | The page view — 200, 404 or 410 |
POST | /api/public/v1/pay/:code/attempts | Starts a payment attempt and opens the payment form |
GET | /api/public/v1/pay/attempts/:attemptId/status | Attempt status (only the browser that started the attempt) |
GET | /api/public/v1/pay/attempts/:attemptId/receipt | The receipt PDF |
POST | /api/public/v1/pay/:code/verification | Requests an access verification code |
POST | /api/public/v1/pay/:code/verification/confirm | Verifies the code |
POST | /api/public/v1/pay/:code/report | "Report this link" |
GET / POST | /api/public/v1/pay/return/:code/:attemptId | Redirects the return from the bank to the result page (303); does not change the payment's status |
Next steps
- Creating Links — the
buyerFields,customFields,recipient,prefillandverificationfields - Webhooks — closing orders on
payment.captured - Checkout Form — the form used at the payment step