Digital-asset
payment infra
with zero friction.

halfin gives merchants one API for invoicing, hosted checkout, single & batched payouts, and machine-to-machine settlement. Multi-chain by default. Non-custodial. Sandbox access on signup.

payment rails
7 networks · 14 assets
BitcoinEthereumBaseArbitrumSolanaTronXRP
Instant sandbox accessNo-code & API-firstMulti-chain conversionM2M settlement
invoice 019df1eccreated · today
invoice · #019df1ec
Amount due
1,000.00 USDT
≈ $1,000.00 · TRC-20 · rate locked 14:32
Pay to
TXyZ8aR4nQqW9BeP2cLkN3vMjK7sH1u8tD
Status
Draft created0s
Payer activated4s
Detected on-chain12s
Paid · webhook fired38s
webhook fired · 200 ok
payment rails · 1 / 7scroll-as-time

One invoice.
Every rail that matters.

The payer picks the network. We resolve it. Same invoice, same ledger, automatic conversion.

same invoice#019df1ec
invoice · #019df1ec
Amount due
0.0247 BTC
≈ $0.0247 · BTC · rate locked 14:32
Pay to
TXyZ8aR4nQqW9BeP2cLkN3vMjK7sH1u8tD
Status
Draft created0s
Payer activated4s
Detected on-chain12s
Paid · webhook fired38s
rail progression1 / 7
Bitcoin
BTC · BTC · 6 conf · ~60 min
0.0247 BTC
Ethereum
ERC-20 · USDC · 12 conf · ~3 min
1,000.00 USDC
Base
BASE · USDC · 6 conf · ~12 sec
1,000.00 USDC
Arbitrum
ARB · USDT · 4 conf · ~8 sec
1,000.00 USDT
Solana
SPL · USDC · 32 slots · ~14 sec
1,000.00 USDC
Tron
TRC-20 · USDT · 19 conf · ~57 sec
1,000.00 USDT
XRP Ledger
XRP · XRP · 1 conf · ~4 sec
1,612.4 XRP
scroll progress
0%
scroll · 02 of viewstate 01 of 04 · draft
01
lifecycle

One invoice.
Four states.
Zero surprises.

01
Draft
Merchant creates an invoice via API or dashboard. No timer running yet.
02
Pending
Payer opens the link, picks a currency, locks the FX rate. 30-min countdown begins.
03
Confirming
Deposit detected on-chain. We watch for N confirmations per network.
04
Paid
Confirmations reached. Balance credited, webhook fired with idempotency key.
01 · Draft
02 · Pending
03 · Confirming
04 · Paid
POST /api/v1/invoices
1,000 USD
order_id: 12345 · expires: never
{
"event": "invoice.draft",
"id": "in_019df1ec",
"status": "draft"
}
scroll-driven progress
0%
productssee full product page →

Typed API,
lean integration.

Use hosted checkout with no code, or wire the same primitives directly. Invoices, payouts, and machine-to-machine settlement run on shared rails.

Explore all products →
01 / invoicing & checkout · core
most adopted

Invoicing

Manual invoice creation in the dashboard or via API. Customised hosted checkout, payment links, on-chain addresses. Customer picks the rail. We resolve it.

capabilities
Manual or API-driven invoices Customised checkout flow Multi-rail address generation FX rate lock · re-activation
#019df…
1,000 USDT
paid · settled
02 / single payouts

Single payouts

One-off vendor or affiliate payments via dashboard or API. Idempotent, reversible until broadcast.

Pick rail or auto-route 4-eyes approval optional Address book + tags
03 / batched payouts

Batch payouts

Mass payouts for affiliates, creators, contractors. CSV upload or API. One reconciliation, many destinations.

CSV · 10k rows Idempotent batches Per-row retries
04 / m2m settlement

Machine-to-machine

Programmatic settlement between services, agents and devices. Sub-cent units, signed instructions, multi-chain conversion routed by speed and depth.

Programmable spend limits Streaming settlement Auto-route by latency
05 / developers

Lean code, full control

Use the no-code checkout in 5 minutes, or wire the same primitives via REST and idempotent webhooks. SDKs for Node, Python, Go, Ruby.

POST /api/v1/invoices
$ curl https://stage.halfin.xyz/api/v1/invoices \
  -H "X-API-Key: sk_test_…" \
  -d '{"currency":"BTC","amount":"0.01000000"}'
← 201 Created · in_019df1ec
developersREST · idempotent · signed
built for shipping

REST API,
signed webhooks.

Use hosted checkout for the no-code path, or wire the same REST primitives. Webhooks are idempotent, retried with exponential backoff, and signed. Sandbox keys are available on signup.

import { createHalfin, createInvoice } from "@halfin/sdk-merchant";
const client = createHalfin({ apiKey: process.env.HALFIN_KEY });
const { data } = await createInvoice({
  client,
  body: {
    currency: "BTC",
    amount: "0.01000000",
    idempotency_key: "order-0001",
    metadata: { order_id: "order-0001"}
  },
});
webhook delivery200 ok · 142 ms
POSTapi.acme.co/hooks/halfin
attempt 1 / 7
X-Halfin-Event: invoice.paid
X-Halfin-Idempotency: idem_5dgf…7c2a
X-Halfin-Signature: v1=8c4a… ● verified
X-Halfin-Timestamp: 1747…832
{
"event": "invoice.paid",
"id": "in_019df1ec",
"amount": 1000.00,
"currency": "USDT",
"network": "tron-trc20",
"received_at": "2026-05-04T14:32:46Z"
}
retry schedule · exponentialdelivered first try
+1s
+2s
+4s
+8s
+30s
+120s
+360s
faqfive questions · no more
frequently asked

The questions
we answer
on every call.

These five come up first. The rest live in our docs and on the welcome call.

Browse all docs →
Sandbox keys are immediate. Production goes live after KYB, with a median review time of three business days. It is never auto-approved.
get startedone phrase · one button

One API.
Every rail.
Zero friction.

Get sandbox access →Talk to sales
Instant sandboxNo-code or APIProduction after KYB