Developer API

Read our books, programmatically

Every number on this site is available as JSON. The transparency endpoints are read-only by design — no API key, no rate-limit tier, CORS open to any origin. Minting and redemption are never exposed as a public write API, because an endpoint that can mint is an endpoint that can be abused.

The cash-out API is a separate, authenticated set of endpoints for partner wallets. It requires an API key created by a registered member and scopes every order to the key that created it.

Transparency

GET/api/public/reserves
Current reserves

Latest signed attestation: total reserves, TSD circulating supply, collateralization, cold/hot split, and breakdowns by chain, token and address group. Falls back to a live scan before the first attestation exists.

Try it
GET/api/public/reserves/history?range=24h | 7d | 30d | 90d | all
Attestation history

The append-only signed series behind the charts on /reserves. Each point carries its payload hash and signature so you can prove a historical value was never edited.

Try it
GET/api/public/supply
Supply

Aggregator-shaped supply data: symbol, chain, Omni property id, circulating supply, backing assets, reserves and collateralization.

Try it
GET/api/public/status
System status

Peg health, fee/limit configuration, instant redemption capacity per chain, redemption queue depth, and background job heartbeats.

Try it

Partner cash-out

Use this to let your users convert TSD back to USDC without leaving your app. Get a key from the account page and send it as the x-api-key header (or Authorization: Bearer). /orders accepts a chain of ethereum, base, or bsc.

GET/api/public/v1/cashout/settingsx-api-key
Cash-out settings

Live flag, minimum/maximum order sizes, the global redemption fee in basis points, and an `account` block for the member behind your key: their permanent TEXITcoin deposit address, permanent EVM address, saved cash-out address, and their effective (possibly discounted or zero) fee.

GET/api/public/v1/cashout/deposit-addressx-api-key
Permanent deposit address

The reusable TEXITcoin deposit address for the member behind your key (safe to cache and display as “your TSD address”), plus their permanent EVM address, saved cash-out address, and effective fee. All fee fields are numbers: redeemFeeBps, defaultRedeemFeeBps, feePercent.

GET/api/public/v1/cashout/payout-addressx-api-key
Read saved cash-out address

The USDC payout address saved on the member’s account, plus their permanent TEXITcoin deposit address and effective fee. Use this to auto-fill both sides of a cash-out without asking the user to look anything up.

POST/api/public/v1/cashout/payout-addressx-api-key
Set cash-out address

Save the USDC destination for this member once; afterwards every order may omit payoutAddress. An explicit payoutAddress on an order still overrides it for that order.

{"payoutAddress":"0x…"}
POST/api/public/v1/cashout/couponx-api-key
Validate coupon

Check whether a coupon code is valid and see the fee it would apply. Never consumes a use.

{"code":"EARLYBIRD"}
POST/api/public/v1/cashout/ordersx-api-key
Create cash-out order

Start a TSD → USDC redemption on behalf of your user. The response tells you exactly where the user must send TSD: depositAddress (also returned as address, txcDepositAddress and sendTo — same value), with asset: "TSD", network: TEXITcoin Omni property 39, and memo: null (Omni has no memo/tag). Show that address, not the account-level one. payoutAddress and refundAddress are optional — we fall back to the cash-out address and permanent TEXITcoin address on your account, and an explicit payoutAddress always overrides the account default. The member’s negotiated fee is applied automatically (a coupon can only lower it).

{"amount":100,"payoutAddress":"0x…","refundAddress":"TXC…","chain":"ethereum","couponCode":"EARLYBIRD","source":"HME Wallet"}
GET/api/public/v1/cashout/orders/:idx-api-key
Poll cash-out order

Read the current status, the deposit address to send TSD to (depositAddress / address / sendTo), amount received, payout amount, and settlement txids. Only the API key that created the order can read it.

TEXITcoin address format (legacy only)

TSD is an Omni Layer property on the TEXITcoin blockchain. Omni reference outputs only recognise legacy base58check addresses — the ones that start with a capital T. A bech32 txc1… address will be silently ignored by Omni and the tokens will never arrive, so every endpoint that accepts a TEXITcoin address rejects bech32 before it ever touches the chain.

  • Starts with a capital T, 26–35 characters, base58 (no 0, O, I or l).
  • Version byte 0x42 (P2PKH) or 0x32 (P2SH) — both are accepted.
  • Full base58check checksum is verified, so a single mistyped character is rejected.
  • txc1… bech32 is rejected with a message pointing the user to the legacy T… address in their wallet (Receive → Tokens tab).
  • No memo, tag or destination tag is required — Omni property 39 has no such field. Any address you send us refundAddress for must be a valid legacy address.

The same validation runs on every path: the API, the member dashboard, and the admin console share one checkTxcAddress routine. If an address passes there, it passes everywhere.

Status callbacks (skip the polling)

Each API key can carry an https callback URL, set on your account page under API keys. Every milestone of an order created with that key — deposit seen, deposit confirmed, burn, payout sent, and any failure — is POSTed to that URL as JSON:

{
  "type": "payout_sent",
  "message": "Sent 99 USDC on ethereum",
  "amount": 99,
  "chain": "ethereum",
  "txid": "0x…",
  "occurredAt": "2026-08-06T11:00:00.000Z",
  "order": { "id": "…", "status": "released", "payoutAmount": 99, … }
}
  • x-tsd-timestamp holds unix seconds; x-tsd-event repeats the event type.
  • x-tsd-signature is sha256= followed by the hex HMAC-SHA256 of timestamp + "." + rawBody, keyed with the signing secret shown next to your key. Compare it with a timing-safe compare and reject timestamps older than a few minutes.
  • Respond 2xx quickly. Deliveries are best-effort and not retried, so treat them as a fast path and keep the poll endpoint as your source of truth for reconciliation.

Verifying an attestation

Each attestation is canonicalized before it is hashed, so anyone can recompute the hash from the published fields. The rule is fixed and public:

  • Object keys are sorted alphabetically at every level.
  • All numbers are rounded to 6 decimal places; non-finite values become null.
  • payload_hash = sha256(json), hex encoded.
  • signature = hmac_sha256(secret, payload_hash) — the key is held by the issuer, so the signature proves the row was written by us and never edited afterwards.

Attestations are append-only: rows are never updated or deleted. Recompute the hash for any historical point and compare it with the published payload_hash. If they differ, the number changed and we are caught.

Cadence commitment

We commit to recording a reserve attestation at least once per hour, continuously. The current cadence and the timestamp of the last attestation are both published on /status. A gap in the series is itself evidence — we would rather you see a gap than a fabricated number.

Fair use

Responses are cached for 15–120 seconds. Please poll no more than once per minute; the underlying data does not change faster than that. If you are building something that needs more, get in touch and we will work out a push feed.