Swagger

Accounts

8 endpoints.

8 endpoints

Accounts

POST/account/createResolve account (derive + cache)

Resolve an owner's account address on a network and cache it. Under the EIP-7702 account model the resolved address IS the owner EOA, so nothing is derived and nothing is deployed. Idempotent — re-resolving refreshes the cached details and keeps a stable id. Returns 429 Too Many Requests if the rate limit is exceeded (check the Retry-After response header).

Authentication: X-API-Key

Input — request body

ownerAddress string required
Owner EOA address
networkId string required
Chain id (e.g. 43114)

Input — example request

{
  "ownerAddress": "0x0a1758ad202a2059e8c2970b562597ca45d863c4",
  "networkId": "43114"
}

Output — example response (201)

{
  "id": "ugtp_account_R4LJbmiFqDsJ",
  "address": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
  "networkId": "43114",
  "networkKind": "evm",
  "details": {
    "schemaVersion": 1,
    "networkKind": "evm",
    "evm": {
      "ownerAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
    }
  },
  "createdAt": "2026-06-18T12:00:00.000Z",
  "updatedAt": "2026-06-18T12:00:00.000Z"
}

Output — every status this endpoint answers with

StatusWhen
201Account
401Missing or invalid credentials
429Rate limit exceeded — retry after the number of seconds in the `Retry-After` response header
500Internal server error
Open in Swagger
POST/account/resolve-singleSingle network-independent resolve

Resolve one owner EOA to its account address. Under the EIP-7702 account model that address is the owner EOA itself, so the answer is the address you sent — the call exists so an integration can resolve uniformly without special-casing the account model. Network-independent, so no networkId is needed. Stateless: it creates no account row. For many owners prefer /account/resolve-batch. Returns 429 Too Many Requests if the rate limit is exceeded (check the Retry-After response header).

Authentication: X-API-Key

Input — request body

ownerAddress string required
Owner EOA address

Input — example request

{
  "ownerAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
}

Output — example response (200)

{
  "address": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
}

Output — every status this endpoint answers with

StatusWhen
200{ address }
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
Open in Swagger
POST/account/infoResolve address (preview)

Stateless preview of an owner's account address plus its on-chain activation flag, without persisting an account row. Under the EIP-7702 account model the address is the owner EOA and isDeployed reports whether that EOA has already adopted the UGTP delegate on this network. Returns 429 Too Many Requests if the rate limit is exceeded (check the Retry-After response header).

Authentication: X-API-Key

Input — request body

ownerAddress string required
Owner EOA address
networkId string required
Chain id

Input — example request

{
  "ownerAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
  "networkId": "137"
}

Output — example response (200)

{
  "ownerAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
  "address": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
  "networkId": "137",
  "isDeployed": false
}

Output — every status this endpoint answers with

StatusWhen
200Address info
401Missing or invalid credentials
429Rate limit exceeded — retry after the number of seconds in the `Retry-After` response header
500Internal server error
Open in Swagger
GET/account/is-deployedCheck activation on one network

Whether the address is active on the given network. Under the EIP-7702 account model that means the EOA carries the delegation designator pointing at the UGTP delegate: a bare EOA, and one delegated to somebody else's contract, both report false. A network without chain-level EIP-7702 is refused with a coded 4xx rather than answered, so use GET /account/delegation-status when you want every network in one read. Returns 429 Too Many Requests if the rate limit is exceeded (check the Retry-After response header).

Authentication: X-API-Key

Input — query and path parameters

address string required
Account address (the owner EOA)
networkId string required
Chain id

Output — example response (200)

{
  "isDeployed": true
}

Output — every status this endpoint answers with

StatusWhen
200{ isDeployed }
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
Open in Swagger
GET/account/delegation-statusEIP-7702 delegation status

Whether an owner EOA has adopted the UGTP EIP-7702 delegate, network by network, read from chain state alone — no operation is built and nothing is written. There is no networkId parameter by design: an authorization is signed per chain, so the cross-network picture IS the answer.

  • activated — the EOA carries the delegation designator pointing at the UGTP delegate, the address echoed in delegate.
  • not_activated — a bare EOA, so a first operation still needs a client-signed authorization.
  • foreign_delegate — delegated to some other contract, which is named in delegatedTo. It is the only status that carries that field.
  • contract_code — the address has ordinary bytecode and is not an EOA at all.
  • unsupported — that chain has no chain-level EIP-7702 (Avalanche C-Chain today), so no delegation can exist there.
  • unavailable — that network's read failed. Deliberately never collapsed into not_activated, which would make an activated account look like it needs an authorization.
  • Failures are contained per network: one unreachable network degrades its own entry only, never the whole response. Every network the engine serves is reported, keyed by chain id.
  • A malformed address is rejected with 400. 429 when the rate limit is exceeded; check the Retry-After response header.

Authentication: X-API-Key

Input — query and path parameters

address string required
Owner EOA address (0x-prefixed 20 bytes)

Output — example response (200)

{
  "address": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
  "delegate": "0xa46cc63eBF4Bd77888AA327837d20b23A63a56B5",
  "networks": {
    "1": {
      "status": "not_activated"
    },
    "56": {
      "status": "not_activated"
    },
    "137": {
      "status": "activated"
    },
    "8453": {
      "status": "not_activated"
    },
    "42161": {
      "status": "activated"
    },
    "43114": {
      "status": "unsupported"
    },
    "11155111": {
      "status": "activated"
    }
  }
}

Output — every status this endpoint answers with

StatusWhen
200{ address, delegate, networks }
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
Open in Swagger
GET/account/seriesAccount-creation series (admin chart)

Account-creation time series for the admin dashboard's Accounts chart: zero-filled per-bucket NEW account counts (UTC-aligned buckets) plus a pre-window baseline per network so the client can derive a cumulative curve (cumulative = baseline + running sum). networks is ordered by in-window count, descending. Omitting bucket picks a granularity from the window length (≤31d day, ≤~6mo week, else month). Platform staff see all accounts; clients are scoped to accounts attributed (via operations) to their projects.

Authentication: Bearer JWT

Input — query and path parameters

period string required
day | week | month | sixMonths | year | custom
bucket string
day | week | month (default derived from window length)
from string
Window start ISO date (required when period=custom)
to string
Window end ISO date (default now)
networkId string
Filter to one chain id
address string
Exact account address (case-insensitive)
activeWithin string
day | week | month | sixMonths | year — only accounts with an operation in this trailing window
projectId string
Filter to accounts attributed to one project
includeTestnets string
Boolean-as-string, default false. Testnet networks are excluded from results unless true; an explicit networkId filter takes precedence.

Output — example response (200)

{
  "period": "month",
  "from": "2026-06-10T00:00:00.000Z",
  "to": "2026-07-10T00:00:00.000Z",
  "bucket": "day",
  "networks": [
    {
      "networkId": "137",
      "name": "Polygon PoS"
    },
    {
      "networkId": "42161",
      "name": "Arbitrum One"
    }
  ],
  "baseline": {
    "total": 7,
    "byNetwork": {
      "137": 5,
      "42161": 2
    }
  },
  "series": [
    {
      "bucket": "2026-06-10T00:00:00.000Z",
      "total": 0,
      "byNetwork": {}
    },
    {
      "bucket": "2026-06-11T00:00:00.000Z",
      "total": 3,
      "byNetwork": {
        "137": 2,
        "42161": 1
      }
    }
  ],
  "total": 3
}

Output — every status this endpoint answers with

StatusWhen
200{ period, from, to, bucket, networks[{networkId,name}], baseline{total,byNetwork}, series[{bucket,total,byNetwork}], total }
400Invalid request body or query parameters
401Missing or invalid credentials
Open in Swagger
POST/account/resolve-batchBatch-resolve owners

Resolve many owner EOAs to their account addresses in one call. Network-independent, so only owner addresses are needed, and stateless: it creates no accounts. Under the EIP-7702 account model each smartAccountAddress equals its ownerAddress. Default cap: 1,000 owners per request — paginate for larger sets. Returns 429 Too Many Requests if the rate limit is exceeded (check the Retry-After response header).

Authentication: X-API-Key

Input — request body

ownerAddresses string[] required
Owner EOA addresses (1–1000 by default)

Input — example request

{
  "ownerAddresses": [
    "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
  ]
}

Output — example response (200)

{
  "results": [
    {
      "ownerAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
      "smartAccountAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
    }
  ],
  "count": 1
}

Output — every status this endpoint answers with

StatusWhen
200{ results: [{ ownerAddress, smartAccountAddress }], count }
400Invalid request body or query parameters
401Missing or invalid credentials
500Internal server error
Open in Swagger
GET/account/listAccount list (admin table)

Control plane. One page of accounts, newest first, matching the filters. The page period bounds the list to accounts created in that window — the same window the account-creation series uses — so omit it for every matching account. Platform staff see all accounts; a client is scoped to accounts attributed, via their operations, to its own projects.

Authentication: Bearer JWT

Input — query and path parameters

period string
day | week | month | sixMonths | year | custom (from is required when custom)
from string
Window start (required when period=custom)
to string
Window end (defaults to now)
networkId string
Filter to one chain id
address string
Partial account address (case-insensitive)
activeWithin string
day | week | month | sixMonths | year — only accounts with an operation in this trailing window
projectId string
Filter to accounts attributed to one project
includeTestnets string
Boolean-as-string, default false. Testnet networks are excluded unless true; an explicit networkId filter takes precedence.
limit number
Results per page
offset number
Pagination offset

Output — example response (200)

{
  "accounts": [
    {
      "id": "ugtp_account_R4LJbmiFqDsJ",
      "address": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
      "networkId": "137",
      "networkKind": "evm",
      "details": {
        "schemaVersion": 1,
        "networkKind": "evm",
        "evm": {
          "ownerAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
        }
      },
      "createdAt": "2026-06-18T12:00:00.000Z",
      "updatedAt": "2026-06-18T12:00:00.000Z"
    }
  ],
  "total": 1
}

Output — every status this endpoint answers with

StatusWhen
200{ accounts[{id,address,networkId,networkKind,details,createdAt,updatedAt}], total }
400Invalid request body or query parameters
401Missing or invalid credentials
Open in Swagger