Quickstart
Make the first authenticated call, then build the same prepare–sign–submit loop for every operation.
Quickstart
Make your first authenticated request
Keep secrets server-side, verify your environment, then build the same prepare–sign–submit loop for every operation.
- 01
Authenticate
Use a session JWT for onboarding and a project X-API-Key for data-plane requests.
Read the guide → - 02
Prepare and sign
Prepare the operation, read its rail, and sign what that rail returned client-side.
Read the guide → - 03
Submit and track
Submit the signature and poll the returned operation id until terminal status.
Read the guide →
curl "https://api.ugtp.io/v1/network/list" \
-H "X-API-Key: $UGTP_API_KEY"Worked example
Your first three calls
One unauthenticated read to prove the host, one authenticated read to prove the key, one price check. Nothing is created and nothing is spent.
- 01
Reach the API
GET /healthNo credential needed. It also returns the networks this deployment serves, which is the shortest confirmation that you are pointed at the right host.
Input — the request
curl -X GET "https://api.ugtp.io/v1/health"Output — 200 response
{ "status": "ok", "timestamp": "2026-06-18T12:00:00Z", "version": "1.0.0" }Every status this call can answer with
Status When 200Service healthy - 02
Prove the project key works
GET /network/listThe same list, behind the data-plane credential. If this succeeds every operation endpoint will accept the key too — the header is identical on all of them.
Input — the request
curl -X GET "https://api.ugtp.io/v1/network/list" \ -H "X-API-Key: $UGTP_API_KEY"Output — 200 response
{ "networks": [ { "name": "Avalanche C-Chain", "networkId": "43114", "explorerUrl": "https://snowtrace.io", "nativeCoin": "AVAX", "wrappedNative": "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7" } ] }Every status this call can answer with
Status When 200Networks 401Missing or invalid credentials 429Rate limit exceeded — retry after the number of seconds in the `Retry-After` response header 500Internal server error - 03
Price something before you build it
POST /fee/estimateThe last read-only step. Reserve against estimatedFee and show expectedFee; that split is what keeps a Max button from submitting an operation that cannot pay for itself.
Input — the request
curl -X POST "https://api.ugtp.io/v1/fee/estimate" \ -H "X-API-Key: $UGTP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "networkId": "137", "senderAddress": "0xCa9d43184Cc3179609f77D38433D363833C73c60", "calls": [ { "to": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "value": "0x0", "data": "0x..." } ], "transferredAssets": [ { "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "amount": "0xf4240" } ], "feeToken": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" }'Output — 200 response
{ "estimatedFee": "0.0512", "estimatedFeeRaw": "0xc7f8", "expectedFee": "0.0410", "expectedFeeRaw": "0xa028", "gasFee": "0.0400", "gasFeeRaw": "0x9c40", "serviceFee": "0.0010", "serviceFeeRaw": "0x3e8", "symbol": "USDT" }Every status this call can answer with
Status When 200Fee estimate 400Invalid request body or query parameters 401Missing or invalid credentials 429Rate limit exceeded — retry after the number of seconds in the `Retry-After` response header 500Internal server error