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.
status | Meaning |
|---|---|
ready | Signed. The response carries the signature, deadline and the flag you sent. |
pending | Screening 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/estimateuntil the deficit falls to zero. - Unknown fields are rejected. Do not send parameters the endpoint does not document.
Rate limits
| Endpoint | Limit |
|---|---|
/signatures, /balances | 30 requests / 60 s per IP |
/energy/orders | 3 / minute; 503 means all unpaid slots are taken |
/geo/check | Limited per IP |
On 429, back off rather than retrying immediately.