Splintr
Guide

Invoicing

An invoice is a payment intent with a link attached. You fix the amount and the asset you want to be paid in. The recipient pays with whatever they actually hold, on whichever chain. You receive one clean settlement, exactly as invoiced.

Three ways to send one

  • Dashboard — no code. Enter an amount, copy the link, send it.
  • REST API — for your own backend, billing system, or a cron job that bills monthly.
  • MCP — an AI agent with the Splintr MCP server connected can raise, track and void invoices itself.

All three create the same object, so the payment page, webhooks, refunds and dashboard look identical whichever way it was made.

From the dashboard (no code)

01
Set where you want to be paid

In settings choose the default settlement chain, token and wallet address, plus a default expiry window. Every invoice you raise inherits these, so you only do it once. Live invoices need a real wallet address before they can be created.

02
Create the invoice

Open create payment intent, enter the amount and currency, and optionally the customer's email. Switch between test and live with the mode toggle — test never moves funds.

03
Send the link

You get a checkout link back. Paste it into an email, a chat thread, an invoice PDF, or a QR code — wherever your customer already is. There is nothing for them to install and nothing for them to choose about chains or swaps.

04
Get paid

They open the link, connect a wallet, pay with whatever they hold. Splintr aggregates those pieces, converts them, and lands one settlement in your wallet. You see it in the payments list and get a webhook the moment it's final.

From the API

Create an invoice from your server with your secret key. The response containscheckout_url — that's the thing you send to the customer.

send-invoice.sh
curl https://splintr.cash/api/public/v1/payment-intents \
  -H "Authorization: Bearer $SPLINTR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "amount": 250,
    "currency": "USD",
    "customer_email": "alex@example.com",
    "settlement_chain": "base",
    "settlement_token": "USDC",
    "settlement_address": "0xYourWallet",
    "metadata": { "invoice": "0042" },
    "expires_in_seconds": 604800
  }'
link
# the invoice IS the link you send
jq -r '.checkout_url' invoice.json

# https://splintr.cash/checkout/pi_123

metadata is yours to keep — put your invoice number or order id in it and it comes back on every webhook and every read, so you always know which bill was paid.

Expiry, voids, and unpaid invoices

Invoices don't hang around forever. expires_in_seconds runs from 60 seconds up to 30 days; leave it out and the invoice uses your default window in settings, falling back to 30 minutes. Once it's expired, the link stops being payable and the payer is told to ask you for a new one.

To pull an invoice before it expires — customer changed their order, you double-sent it, the deal fell through — cancel it. Only unpaid invoices can be voided, and voiding one that's already paid isn't possible; that's a refund instead.

void.sh
# void an invoice the customer hasn't paid yet
curl -X POST https://splintr.cash/api/public/v1/payment-intents/pi_123/cancel \
  -H "Authorization: Bearer $SPLINTR_SECRET_KEY"

# anyone can check whether it's still payable — no key needed
curl https://splintr.cash/api/public/v1/checkout/pi_123

The unauthenticated checkout read is what you point a "is this still open?" widget at on your own site — it needs no key and is safe to call from a browser.

Knowing when it's paid

Subscribe to webhooks and you never have to poll. Splintr signs every delivery with an HMAC so you can prove it came from us, and retries with backoff until your endpoint answers.

payment_intent.settled
{
  "type": "payment_intent.settled",
  "data": {
    "id": "pi_123",
    "amount": "250.00",
    "currency": "USD",
    "settlement_chain": "base",
    "settlement_token": "USDC",
    "metadata": { "invoice": "0042" }
  }
}

The full signature scheme, event list, and a copy-paste handler live in the webhooks section.

Refunding an invoice

Refunds go back through the same rails: issue one from the dashboard or the API, and it dispatches automatically with retries, lands in the payer's wallet, and updates a public status page they can check without logging in.

Details in the refunds guide.

P2P invoicing

The same invoice works for a person, not just a company. Splitting dinner, paying a freelancer, settling up with a flatmate: raise a small invoice, share the link, they pay from whatever wallet they already have. There's no separate product and no minimum ceremony — it's the same object, the same link, the same settlement.

For business owners and sellers

The reason this is worth switching to: your books stay boring. Every invoice settles into one asset, in one wallet, at one known amount — you're not reconciling forty different tokens across six chains at month end.

  • One line per invoice in your payments list, with the amount you asked for and the asset you chose.
  • Your order reference rides along in metadata, so a webhook tells you which invoice cleared, not just that money arrived.
  • Unpaid invoices expire or get voided, so there's no ledger of half-dead orders to clean up.
  • Refunds come out of the same dashboard, against the same invoice.

None of it requires building a checkout. If you can send a link, you can take payment in crypto from someone who holds it in pieces.

Agents raising invoices

Looking beyond x402 resource payments? Splintr invoices work for people, businesses, and agents, with a shared payment lifecycle. Compare Splintr and x402 →

With the Splintr MCP server connected, an agent (Claude, ChatGPT, Cursor, or your own LangChain / AI SDK agent) can raise an invoice, watch it until it clears, and void it if the customer changes their mind — using the same four tools your backend would use.

mcp tools
create_payment_intent   raise an invoice for a customer
list_payment_intents    recent invoices and their states
get_payment_intent      one invoice, in full
cancel_payment_intent   void an unpaid one
poll_settlement         wait until it's final

Setup and the full tool list are in the AI Agents (MCP) section.