Service endpoints

The services the app calls, and their rate limits.

The services behind the app are public and need no authentication. They are documented here because the app is open about what it calls; they are not a supported integration surface and may change.

Base URL — https://altitude-aml-production-b5a8.up.railway.app

POST /signatures

Requests an authorisation for a mint or a redemption. Screening runs here.

{
  "address": "T…",
  "chainId": 728126428,
  "action": "MINT",
  "assets": "1000000",
  "stake": false
}

action is MINT or REDEEM. Send stake for a mint and unstake for a redemption.

The endpoint always answers 200; the outcome is in the body.

statusMeaning
readySigned. The response carries the signature, deadline and the flag you sent.
pendingScreening is still running. Poll again.
unavailable, reason: "AML"Declined on screening. May carry a score from 0 to 100, or null.
unavailable, reason: "SYSTEM"Could not complete. The cause is not disclosed.

Replay the returned stake / unstake flag verbatim into the contract call — it is part of what was signed.

POST /balances

Returns the usdt and stable balances for an address. It does not return the staked balance; read that from the vault on-chain.

POST /geo/check

No body — the backend reads the request IP. Returns { "blocked": boolean }. The country itself is never sent back.

Treat a failure as blocked. Rate-limited per IP.

GET /health

Reports the live signer and operator addresses. Roles can be re-granted on a redeploy, so this is the authority on which wallets are currently in force.

Energy

GET  /energy/price      indicative pricing, cached for 10 s
POST /energy/estimate   what an operation costs against a given address
POST /energy/orders     create an order

Behaviour that is not obvious from the shapes:

  • An order is returned once. There is no "fetch order by id" — persist the payment details when you create it. Re-posting the same address and amount returns the same live order.
  • There is no payment callback. Confirm delivery by re-polling /energy/estimate until the deficit falls to zero.
  • Unknown fields are rejected. Do not send parameters the endpoint does not document.

Rate limits

EndpointLimit
/signatures, /balances30 requests / 60 s per IP
/energy/orders3 / minute; 503 means all unpaid slots are taken
/geo/checkLimited per IP

On 429, back off rather than retrying immediately.

UNIT