No Fianto fee during the beta. Any fee comes with at least 30 days notice. See pricing
Product7 min read

Payment link or checkout API: pick by who starts the checkout.

Use a payment link when one fixed price is the whole offer and you do not want to run a server; use the checkout API when the sale starts inside your own site or app and you need your order IDs, your metadata or an amount decided per order. On Fianto both end on the same hosted checkout, with the same fees and the same wallet-to-wallet payment. What differs is who creates the checkout session, which application owns the sale, and what your code can read afterwards.

On this page
What is the difference between a payment link and a checkout session?Payment link vs checkout API, feature by featureWhen should you use a payment link?When do you need the checkout API?What stays the same whichever way you sell?Can you start with a payment link and move to the API later?How do Fianto links compare with card processors' payment links?SourcesQuestions
TL;DR
  • A payment link is created in the dashboard and sells one catalog price; each press of its button opens a fresh 30-minute checkout. No code, no API access.
  • The checkout API is POST /v1/checkout-sessions from your server: your own order_id, up to 20 metadata keys, a price_id or an amount, and an expiry from 5 minutes to 24 hours.
  • Link sales belong to the hidden Shop application, so no API key can read or cancel them. Moving to the API later does not move the subscribers you already have.

What is the difference between a payment link and a checkout session?

A Fianto payment link and an API checkout differ in who creates the checkout session: the payer, by pressing the link's button, or your server, by calling the API. A checkout session is one checkout page for one order, open for a limited time, and every Fianto payment runs through one. The hosted checkout the payer lands on is identical either way.

A payment link, at checkout.fianto.xyz/l/ plus 16 random characters, is a standing offer: one price, many payers, made in the dashboard and shared anywhere. The full how-to is in USDC payment links. The API makes one session per order, when your code decides a sale is happening, and returns its URL once.

Payment link vs checkout API, feature by feature

Every row below is how Fianto works on 15 October 2026.

Payment linkCheckout API
Who creates the sessionThe payer, on each press of Pay or ApproveYour server: POST /v1/checkout-sessions
Code you runNoneA route that creates sessions, plus a webhook route
What it chargesOne catalog price, fixed for the link's lifeA price_id, or an amount with a description
Order IDplink_ plus a random UUID, made by FiantoYours, up to 128 characters
MetadataFixed: source and the link codeUp to 20 keys of your own
Who the payer isWallet, plus an email if you ask (never verified)customer_reference and customer_email from your records
Checkout expiryAlways 30 minutes5 minutes to 24 hours, 30 by default
Sales limitsEnd date, and "Ends when full" from 1 to 10,000 paid paymentsWhatever your code enforces
Webhooks go toThe hidden Shop application's endpointYour application's endpoint
Read or cancel through v1NoYes: read sessions, orders, payments and subscriptions; cancel sessions and subscriptions
Retries safe from double chargesNot needed: no API callIdempotency-Key required on every POST, kept 24 hours

Both need an approved merchant account, both accept a discount code typed on the checkout page, and both sell one-time or recurring prices.

Use a payment link when you can describe the sale in one sentence with one price in it and nothing in your own system has to change when someone pays. Typical cases:

  • A fixed-price consultation, workshop seat or ticket posted in a bio, a chat or an email footer.
  • A single monthly plan, where a person can check the Subscriptions list for new members. A recurring payment link covers that case end to end.
  • A first test of demand before anyone writes code. A link can go live minutes after approval.
  • A limited run: 50 seats, or sales until a date, which the link counts for you.

The trade-off is control. You cannot pass your own order number, you cannot change the amount per buyer, and the only thing tying a payment to a person is their wallet and whatever email they typed.

When do you need the checkout API?

You need the checkout API when the payment must match a record in your system: a cart total, a booking reference, a user account that gets upgraded. Your server sends exactly one of price_id or amount (a string from "0.01" to "1000000" with at most 6 decimals), your order_id, and https success_url and cancel_url. A subscription uses mode: 'subscription' with a recurring price_id. Shortened from the docs' example, with your user ID attached:

lib/checkout.ts
import { Fianto } from '@fianto/sdk';

const fianto = new Fianto(); // reads FIANTO_APP_ID and FIANTO_APP_SECRET

export async function startSubscription(userId: string, priceId: string) {
  const session = await fianto.checkoutSessions.create({
    mode: 'subscription',
    order_id: `signup_${userId}`,
    price_id: priceId,
    customer_reference: userId,
    success_url: 'https://example.com/welcome',
    cancel_url: 'https://example.com/pricing',
  });
  return session.url; // send the payer here
}

The API also handles the cases a link cannot: reissuing a checkout URL for an order that already has an open session, cancelling a session, choosing a popup instead of a redirect, and reading every order and subscription back. Fulfil from the webhook, never from the browser: a one-time order sends order.paid once the payment is finalized, and a subscription sends subscription.created, because a subscription creates no order. The checkout sessions docs list every field and error code, and the developers page covers the SDKs for Next.js, Express and Hono, and adding USDC checkout with an AI coding agent shows how a coding agent can write the integration for you.

Create checkout sessions from your server, verify signed webhooks, and test with a test event. No Fianto fee during the beta.

See the API

What stays the same whichever way you sell?

The payment itself does not change with the route. The payer connects a Solana wallet, signs one transaction, and the USDC goes straight to your wallet; Fianto never holds it. You pay nothing. The payer pays a Solana transaction fee under $0.01, no Fianto fee during the beta (after it, about 0.1 to 0.5% on top of your price), and, on a subscription, a network fee of 0.01 USDC with each charge today plus account rent in SOL. Solana's fee documentation puts the base fee at "5,000 lamports per signature".

Sales from both routes appear in the same dashboard lists, the Overview figures and the CSV exports, so your books do not care which one a payment came through. Refunds work the same way too: there is no refund API, and you send USDC back from your own wallet.

Can you start with a payment link and move to the API later?

Yes, and the price you created for the link can be sold through the API from the same day, but the sales already made through the link stay where they are. Three things to plan for:

  1. Two webhook endpoints. Link sales belong to the hidden application named "Shop", which appears under Developers after the first press of a link's button. Your API sales belong to your own application. Set a webhook URL on both, and tell link events apart by metadata.source equal to "payment_link" or the plink_ order prefix. The payment link sales docs show the payload.
  2. No API control over link subscribers. Every v1 subscription route is scoped to the application that made the sale, and the Shop application cannot hold a secret, so your API key cannot list or cancel a subscription bought through a link. Cancel those in the dashboard.
  3. Matching people. A link subscriber has no customer_reference. To attach them to accounts in your app, match on the email they typed or the paying wallet, or ask them to subscribe again through your site after their current period ends.

When the API route is live, close the old link so new buyers come through your site. Closing stops new payments and leaves existing link subscribers renewing.

How do Fianto links compare with card processors' payment links?

Fianto payment links do less than Stripe's: they have no API, no QR code and no custom domain. Stripe, as of 15 October 2026, documents payment links that can be created through its API, shown as a QR code, used for subscriptions, and sent with automatic receipts, and its page is headed "Accept payments online without writing code". Fianto links do one job: they open a USDC checkout for one price, and they send the payer no email.

If you need links generated per customer by code, Fianto's answer is the API itself: a checkout session is already a link, made for one order, and its url can go into an email or a chat like any other.

Sources
Questions

Questions about payment links and the checkout API.

Is there an API for Fianto payment links?

No. Payment links are created and managed in the dashboard only. Their sales reach your server as webhooks to the hidden Shop application.

Do payment links and API checkouts cost the same?

Yes. The merchant pays nothing either way, and the payer pays the same fees on the same hosted checkout.

Can I pass my own order ID through a payment link?

No. Fianto gives each link checkout an order ID starting with plink_. Use the checkout API to send your own order_id.

Can I charge a different amount to each customer?

Not with a link, which sells one fixed price. The checkout API accepts an amount per session, from 0.01 to 1,000,000 USDC with a description.

Can my API key cancel a subscription that came from a payment link?

No. Link subscriptions belong to the Shop application, which cannot hold a secret, so v1 cannot read or cancel them. Cancel them in the dashboard.

Read next.

ProductGuides9 min read

USDC payment links: how to create, share and manage one

A Fianto payment link is a reusable address, checkout.fianto.xyz/l/ plus 16 random characters, that sells one price of one product in USDC on Solana. You create it in the dashboard, share it anywhere, and every payer who opens it pays on the hosted checkout: once for a one-time price, or as a subscription for a monthly or yearly one. This is the step-by-step version.

ProductGuides9 min read

A recurring payment link: sell a monthly USDC plan from one URL

Point a Fianto payment link at a monthly or yearly price and every payer who presses its button starts a USDC subscription: they approve once in their Solana wallet, pay the first period on the spot, and are charged again every 30 or 365 days without signing anything. Closing the link stops new sign-ups only; ending the price is what cancels the people already subscribed. This post follows one subscriber through a link, from the first press to the last renewal.

DevelopersGuides8 min read

Add a "Pay with USDC" button to your website

You need three pieces for a Pay with USDC button: a server route that creates a Fianto checkout session with your app secret, a button from @fianto/js or @fianto/react that opens that session in a popup, and a webhook route that marks the order paid when order.paid arrives. The browser never sees a key, and nothing the browser reports counts as proof of payment.

Start with the route you can ship today.

A link for one price this afternoon; the API when your app needs to know who paid.

New posts are announced on X and Discord.