POST/payment-intents
Declare what you are expecting — invoice, payer, amount, accepted assets, expiry. Returns the instructions to send your customer.
A design document rather than live documentation — no public keys or sandbox yet. Published early because the people who would embed a receiving account in their own billing system are the ones who can tell us what is wrong with the shape.
The shape follows the model: an account is a persistent identity, an intent says what a payment is for, and a payment is what actually arrived against it.
Declare what you are expecting — invoice, payer, amount, accepted assets, expiry. Returns the instructions to send your customer.
Whether it is still awaiting payment, matched, or expired.
The lifecycle of a real arrival, then the final record with every cost line and the reference rate with its source.
The account, its status and its verified settlement destination.
Quotes are indicative unless the underlying provider guarantees execution. A locked rate needs somebody to carry FX risk between quote and execution, which needs pre-funded balances we do not have.
The accepted list is dynamic. It reflects what is genuinely supported and available at that moment, so a payment page never offers a rail that would fail. There is no "any" value, and there never will be.
Partner identities are not returned. Custody, liquidity and conversion partners carry opaque ids. You get the economics, the route class and the timing, not the name of the company executing.
An arrival is reconciled against its intent before anything converts, including when it lands short.
Named states, and two of them matter more than the rest.
UNKNOWN never auto-retries. If a provider times out after we send an execution instruction, we do not know whether it executed. Re-sending a $500,000 conversion sends it twice. We query the provider, reconcile, and retry only once the original is definitively confirmed not to have happened.
Signed, at-least-once, replayable. A missed event is never a lost payment.
Choices being made now because they are painful to retrofit later.
Every external operation takes a key derived from payment, operation and attempt. No conversion or settlement request is ever retried blindly.
No floats anywhere. Currency precision differs and rounding errors in money are unforgivable.
There is no bare "USDT" in this API. An asset without its network is not an asset, and an API that lets you omit it invites the exact mistake the account exists to prevent.
Returned with every payment, not hidden in a boolean. Reorgs are handled rather than assumed away.
Never a simple balance field as the source of truth. Every economic event writes ledger entries.
Request and response to each node, liquidity venue and provider, retained. Without that, reconciliation is guesswork and disputes are unwinnable.
If you would embed a receiving account in your own billing system, say which part of the shape above would annoy you in production. That is worth more to us right now than a signup.