Kite

The open-source crypto payment processor you run yourself. Payment links, checkout, webhooks and on-chain settlement, on your server, paid to your wallet.

No middleman in the middle

Customers pay your server. Each payment settles through its own contract into a wallet you hold . No hosted Kite.

A kite over Marina Barrage, Singapore, August 2026.
  1. One payment, one contract

    Transfer #f2f7c01aAwaiting deposit
    Customer pays
    0.2 WETH
    Value
    $490.00
    Pay-in address
    0x9Edb…F8E1
    Quote expires
    in 5:00

    First the address exists, before any contract does.

  2. Transfer #f2f7c01aDeposit received
    Customer pays
    0.2 WETH
    Received
    0.2 WETH
    From
    0x296c…a626
    Arrived
    4:50 AM

    Then the customer pays it, from a wallet or by sending.

  3. Transfer #f2f7c01aProcessing
    Swap
    WETH → USDC
    Route
    Uniswap V3
    Priced at
    10 min TWAP
    Slippage cap
    1%

    Then one transaction deploys, swaps and pays the fees.

  4. Transfer #f2f7c01aSettled
    Value
    $490.00
    Platform fee, 1%
    4.90 USDC
    You receive
    485.10 USDC
    Webhook
    Delivered

    Last, your webhook hears Settled, and you ship the order.

Everything a checkout owes you

Any token in, yours out

Swapped through Uniswap V3, priced from a 10-minute time-weighted average.

Agents pay too

Every link is an x402 resource. Agents sign and pay without gas.

Signed webhooks

HMAC-SHA256 on every delivery, retried until it lands.

Fees with conditions

Server fees for the apps you host, app fees for splits, with minimums and caps.

Checkout over your page

@kite-01/js, no dependencies.

Every request signed

Scoped API keys, single-use nonces.

Many apps, one server

Each merchant sees only its own data.

Refunds nobody blocks

After expiry, anyone can trigger one.

Kite checkout asking the customer how they would like to pay: connect a wallet or follow payment instructions.

The page they pay on

At /pay/<id> customers connect a wallet, gasless with x402 where the token allows it, or scan a QR code and send. Quotes hold for five minutes, and anything overpaid goes back.

Open rails, your own factory

Your KiteFactory

Deployed by you, operated by your server

Any EVM chain

Wherever a Uniswap V3 router runs

Uniswap V3

Swaps and TWAP pricing

x402

Gasless, agent-ready payments

Chainlink

Price feeds for EUR, GBP and more

QuickNode

Deposit notifier

Alchemy

Deposits and sponsored gas

OpenAPI 3.1

Interactive reference at /openapi

PostgreSQL

Every event and delivery kept

MIT

Every repository, every line

Six repositories, one product

  • serverBun, Elysia, Postgres

    The whole product: the API, the dashboard you run it from and the checkout customers pay on. Ships as one Docker image that migrates itself.

  • contractsSolidity 0.8.34

    KiteFactory predicts each payment's address, then deploys a clone there that swaps, pays fees, settles or refunds in one transaction.

  • @kite-01/sdkNode, Bun, Deno, edge

    A typed client generated from the server's OpenAPI spec. Signs every request with Web Crypto and verifies webhooks.

  • @kite-01/jsAbout 1 KB gzipped

    openCheckout() opens a payment link over your page and tells you how it ended, with onSuccess and onClose.

  • docsAstro Starlight

    Guides for running a server, taking payments, authentication and the packages. Every server also serves its own reference.

  • examplesCloudflare Workers

    Monkai, a pay-to-rank board where money is the only ranking signal. A bid only counts once Kite reports it settled.

Three calls to take a payment

Your backend creates a link tagged with your order id. Your page opens it. Kite tells your backend when it settles, signed, so you fulfil on Settled and nothing else.

See the integration guide
On your server
const { data: link } = await kite.paymentLinks.create({
  body: {
    title: "Pro plan",
    currency: "USD",
    amount: "49",
    usage: "OneTime",
    reference: order.id,
  },
});
On your page
const checkout = openCheckout({
  baseUrl: "https://pay.example.com",
  paymentLinkId,
  onSuccess: ({ transferId }) => showThankYou(),
});
On the webhook
const event = await verifyWebhook({ body, headers, secret });
if (event.current.status === "Settled") fulfil(order);

What people ask first

HostingIs there a hosted Kite I can sign up for?

No. Kite is a single server you run, with Postgres beside it. Build the Docker image, set five environment variables, and the API, dashboard and checkout all come up on one port. Your customers pay your server.

CustodyWho holds the money?

You do. Each payment settles from its own contract to the settlement address you set for the chain. The operator wallet only signs settlement and refund transactions, and a payment contract can't be driven by anyone but the factory.

TokensWhich tokens can customers pay with?

Native ETH and any ERC-20 you list, plus any token a customer pastes in, as long as it has a Uniswap V3 pool with your settlement token. Everything is swapped into the one token you settle in.

MistakesWhat if a customer pays too little, or too much?

Too little waits until the quote expires, then goes back. Too much settles and the excess is returned. A different token than quoted is sent back to the refund address automatically, and after expiry anyone can call refund.

ChainsWhich networks does it run on?

Any EVM network with a Uniswap V3 router. You deploy your own KiteFactory there with Hardhat Ignition, with your server's operator wallet as its operator, then add the chain and its factory address in the dashboard and it appears at checkout.

TestingCan I try it without real funds?

Run a second server with KITE_IS_TESTNET=true and its own database. It only offers testnets, so test tokens can never pay a real payment link.

Fly your own

Clone the server, point it at Postgres, add a chain. Your first payment link is ten minutes away, and every dollar of it goes where you say.

Open a transfer

Customer pays in
Customer pays
0.2 WETH
Fee
4.90 USDC
You receive
485.10 USDC
Pay-in address
computed from these terms

The same terms always give the same address. Change a cent and it moves. A sketch of KiteFactory.predictAddress against an example factory, hashed in your browser with keccak-256 at an illustrative 1 WETH = $2,450.

Install the server