---
title: "thru documentation"
description: "Integration documentation for thru: stablecoin acquiring, hosted checkout, webhooks and settlement. Every page is also available as raw markdown."
source: https://docs.thru.la/index.md
html: https://docs.thru.la/index
index: https://docs.thru.la/llms.txt
---
# thru documentation

Integration documentation for thru: stablecoin acquiring, hosted checkout, webhooks and settlement. Every page is also available as raw markdown.

Base URL: `https://api.thru.la/v1` · Console: https://thru.la

**Every page on this site is also a markdown file.** Append `.md` to any path:
`https://docs.thru.la/payments` → `https://docs.thru.la/payments.md`. Machine-readable index at
[https://docs.thru.la/llms.txt](https://docs.thru.la/llms.txt); release feed at
[https://docs.thru.la/changelog.json](https://docs.thru.la/changelog.json).

The same content is served by the API itself, one topic at a time, at `GET https://api.thru.la/v1/docs` and
`GET https://api.thru.la/v1/docs/:topic` — the topic keys below are those keys.

## Topics

| Topic | Key | What it covers |
| --- | --- | --- |
| [Start here](https://docs.thru.la/start-here.md) | `start-here` | What thru is, the five facts every integration needs, and a table for choosing between checkout sessions, direct payments, payment links, invoices and agent payments |
| [Quickstart: your first testnet payment](https://docs.thru.la/quickstart.md) | `quickstart` | Create a key, register a webhook, create a 1 USDC payment on Arc testnet, pay it, and receive a signed payment.confirmed event, all with curl |
| [API keys, workspaces and environments](https://docs.thru.la/auth.md) | `auth` | The x-api-key header, creating and revoking keys in the console, what a key can do, testnet vs mainnet with one key, and the endpoints that need no key |
| [Hosted checkout with checkout sessions](https://docs.thru.la/checkout-sessions.md) | `checkout-sessions` | Send a buyer to a thru-hosted page for one of your products, at its fixed price or at an amount your server locks per session; signed return, checkout.session.* and payment.* webhooks, the one-session-one-payment rule, statuses and reconciliation |
| [Recipe: sell prepaid credit (top-ups)](https://docs.thru.la/credit-topups.md) | `credit-topups` | Let users top up a balance with any amount on the thru-hosted page: one custom_amount product, a checkout session per top-up with the amount locked, credit on payment.* from receivedAmount; table, handler, idempotent credit step, reconciliation; plus the direct-payments variant for your own screen |
| [Payments API (direct payments)](https://docs.thru.la/payments.md) | `payments` | POST /v1/payments field by field, the response, reads, the status lifecycle, confirmations, the seven-day late-transfer watch window, how a missed transfer is recovered and when its payout is manual, the single-use address, idempotency and common mistakes |
| [Webhooks](https://docs.thru.la/webhooks.md) | `webhooks` | Register endpoints and filters, which event family to listen to (and how not to count a sale twice), payload shapes, signature verification code, dedupe, retries, test sends and replay |
| [Chains and tokens](https://docs.thru.la/supported-chains.md) | `supported-chains` | READ BEFORE OFFERING A CHAIN: which chain/network/token combinations confirm on api.thru.la today, contract addresses and decimals, and the ones the API accepts but never confirms |
| [Products and payment links](https://docs.thru.la/products.md) | `products` | Catalogue items in two pricing modes: fixed (a plan or SKU with a price) and custom_amount (credit or quantity, the amount named per checkout within your min/max); per-chain rails, the server-generated slug, the anonymous /pay/:slug payment link, and the product lifecycle |
| [Invoices](https://docs.thru.la/invoices.md) | `invoices` | Bill a named customer with line items: create, edit while draft, send, void, the hosted page at /i/:publicId, and how to tell when an invoice is paid (there is no invoice webhook) |
| [Refunds and settlement](https://docs.thru.la/refunds-and-settlement.md) | `refunds-and-settlement` | Refund a payment (full or partial, and what fires), and how received funds are forwarded to your settlement addresses, with per-product routing and the change cool-down |
| [API conventions, errors and limits](https://docs.thru.la/api-conventions.md) | `api-conventions` | Request and response conventions (decimal strings, ids, timestamps), the error body and every status code, list limits and pagination, idempotency, rate limits and time limits |
| [npm packages](https://docs.thru.la/sdks.md) | `sdks` | @thru-payment/server (checkout sessions, return and webhook verification), checkout-core (headless, React or plain JS), pay-sdk (React components) and x402; what each covers and what it does not |
| [Go-live checklist](https://docs.thru.la/going-live.md) | `going-live` | What to check before you accept real money: keys, network checks, chains, webhooks, idempotency, settlement and reconciliation |
| [Agent payments (x402 / MPP): not enabled yet](https://docs.thru.la/facilitator-x402.md) | `facilitator-x402` | NOT ENABLED on api.thru.la (the /v1/facilitator/* endpoints return 404). Per-request HTTP 402 payments by AI agents: how the flow works, the @thru-payment/x402 middleware, chains and schemes |

## Releases

| Page | What it is |
| --- | --- |
| [Changelog](https://docs.thru.la/changelog.md) | Every change to a public surface, newest first. |
| [changelog.json](https://docs.thru.la/changelog.json) | The same list, machine readable. Poll it instead of re-reading the docs. |
| [From flow.* to payment.flow.*](https://docs.thru.la/migrations/flow-wildcard-to-payment-flow.md) | The webhook filter `flow.*` is now a 400. Replace it with `payment.flow.*`. No event delivery changes, because `flow.*` never matched anything. |
| [From Direct Pay subscriptions to checkout sessions](https://docs.thru.la/migrations/direct-pay-to-checkout-sessions.md) | Direct Pay is removed. Sell the period as a checkout item, keep the expiry clock in your own application, and issue the next link when it runs down. There is no replacement endpoint, because there is no replacement object. |
