Kite

Payment links

What a customer pays, in which currency, and how you match it to your order.

A payment link is something to pay for: a title and an amount in a currency. Customers pay it at /pay/<id> on your server: share the link, or send customers to it from your site.

The Payment links page

Fields

FieldDescription
titleShown at checkout. Up to 200 characters.
currencyUSD, or any currency you've added a price feed for.
amountA decimal string, such as "49" or "12.50".
usageOneTime (default) or Reusable. A OneTime link can be paid once; further payments are rejected. A Reusable link accepts unlimited payments.
lineItemsOptional. Each has a name, price, quantity and optional image. They must add up to amount exactly.
referenceOptional. Your own ID for it, such as an order ID. Unique within the app, so creating a second link with the same reference fails with 409.
metaOptional JSON for your own use.

reference and meta are never shown to customers. They come back on the link, and on every transfer webhook for a payment made through it.

Creating one

In the dashboard, under Payment links:

Creating a payment link: title, currency, amount and optional line items

From your backend, with the SDK:

const { data: link } = await kite.paymentLinks.create({
  body: {
    title: "Pro plan",
    currency: "USD",
    amount: "49",
    usage: "OneTime", // or "Reusable"
    reference: order.id,
  },
});

const url = `https://pay.example.com/pay/${link.id}`;

Find it again later by reference:

const { data } = await kite.paymentLinks.list({
  query: { reference: order.id },
});

A link's usage field controls how many times it can be paid:

  • OneTime (default): The link can be paid once. After a successful payment, further attempts are rejected. Use this for order-specific links where each order gets its own link with the order ID as reference.
  • Reusable: The link accepts unlimited payments. Use this for donation pages, fixed-price products, or invoices sent by hand.
// One link per order (one-time)
const { data: link } = await kite.paymentLinks.create({
  body: {
    title: "Order #1234",
    currency: "USD",
    amount: "49",
    usage: "OneTime",
    reference: "order-1234",
  },
});

// One reusable link for a product
const { data: link } = await kite.paymentLinks.create({
  body: {
    title: "Pro subscription",
    currency: "USD",
    amount: "49",
    usage: "Reusable",
  },
});

Changing a link's amount affects payments that haven't been quoted yet, not ones already open.

On this page