Skip to main content
Maestro’s developer API retires on September 18, 2026, per their announcement of August 18, 2026: every endpoint is retired and keys stop working on that date. This page maps the Maestro Cardano surface to its Nexus equivalent, path by path. The base URL becomes https://nexus.gerowallet.io (Maestro’s Cardano services sit under https://mainnet.gomaestro-api.org/v1, with preprod and preview hosts alongside it), and the credential becomes an X-Api-Key: nxs_... header in place of Maestro’s api-key. See Authentication for how keys are issued and scoped.
If your code already speaks a Blockfrost SDK, you have a shorter path. Maestro’s own retirement notice points Cardano users at Blockfrost, and Nexus serves a Blockfrost-compatible surface at /api/v0: point the SDK’s customBackend at it, pass your nxs_ key as the project_id, and the migration is one line. See Blockfrost Compatibility. The map below is for teams calling Maestro over plain HTTP, or moving to the native API on purpose.

Endpoint map

Maestro paths are shown relative to their /v1 base. Nexus paths are absolute. Two paging shapes appear below. The older reads page with page and pageSize. The reads added for this migration page with cursor and limit: the response carries a nextCursor, and you send it back as cursor for the next page. That token is opaque and endpoint-specific, so do not build one, parse one, or carry a Maestro cursor into it. An absent nextCursor is the last page. limit defaults to 50 and caps at 200 unless the row says otherwise.

Accounts

Nexus adds two account reads with no Maestro counterpart: GET /api/account/{stakeAddress}/utxos and GET /api/account/{stakeAddress}/txs.

Addresses

Every cred path takes the payment credential as a 56-character hex key hash, the same value GET /api/addresses/decode/{address} reports under paymentCredential.hash.

Assets and policies

Nexus adds one asset read with no Maestro counterpart: POST /api/assets/metadata. Body {"units": [...]}, at most 100 units of policy + name hex. Every requested unit is a key of the response’s data object, in request order; a unit that is unknown or has no metadata maps to null rather than being dropped. Each entry carries onchainMetadata (the asset’s own CIP-25 entry from label 721, not the whole label-721 body), cip68Metadata (the CIP-68 reference datum decoded to JSON, with its version in cip68Version) and metadata (the token-registry entry), so a wallet or marketplace resolves the display data of a whole page of assets in one call instead of one detailedInfo call per asset. | GET /policy/{policy}/mints | GET /api/policy/{policyId}/mints | The asset mints view widened to the policy, each row naming the unit it applies to. Cursor-paged | | GET /policy/{policy}/addresses | GET /api/policy/{policyId}/addresses | Addresses holding any asset under the policy, largest first; the quantity sums every asset under the policy the address holds. Aggregates the LIVE UTxO set, so a top-ten fungible token can exceed the query timeout. Cursor-paged | | GET /policy/{policy}/accounts | GET /api/policy/{policyId}/accounts | The same holdings grouped by stake account. Mainnet, preview, and preprod aggregate positive current balances before sorting and paging, so cost follows current holdings rather than transaction history. Other configured networks use live-UTxO aggregation with an 8-second query budget. Cursor-paged with limit and cursor; page stability is best-effort as balances change | | GET /policy/{policy}/transactions | GET /api/policy/{policyId}/transactions | Transactions that produced the policy’s currently-unspent outputs. Narrower than every transaction that touched the policy: a transaction whose policy outputs have all since been spent does not appear, and neither does any spend side. Use /policy/{policyId}/mints for supply events. Cursor-paged |

Blocks, epochs and protocol parameters

Datums and scripts

Ecosystem

Stake pools

Delegators are the one row in this map whose behaviour differs enough to plan around. The native endpoint returns { "epoch": 657, "live": true, "data": [{ "stakeAddress": "stake1...", "liveStake": "1137959159981411" }], "nextCursor": "..." }. live says where the page’s figures came from: true for each account’s current delegated stake, false for the stake-snapshot fallback described below. The same data is served on /api/v0 in Blockfrost’s own [{ "address": ..., "live_stake": ... }] shape with its count and page parameters, so an unmodified Blockfrost SDK reaches it too. The behaviours to fold into a client:
  • Live first. Each page lists the pool’s current delegators, each with its current delegated stake (UTxO plus unwithdrawn rewards), and epoch is the current epoch. On mainnet the figures come from the chain-data sidecar, refreshed about every 2 hours. On preview and preprod they are read when you ask. On /api/v0 the live path answers in Blockfrost’s own order, oldest delegation first with order=desc for newest first, and has no depth limit. /api/v0 does not serve mainnet keys yet, so for live mainnet figures use the native endpoint.
  • Snapshot fallback. When the live source cannot answer (mainnet data gone stale, or the preview/preprod read unavailable), the figures come from the newest stake snapshot, which trails the chain tip by one epoch. live is false and the native envelope names that snapshot epoch; the Blockfrost shape has no field for either.
  • Snapshot pages are ordered by stake address. The snapshot table carries no slot or certificate column, so no chain order is recoverable from it. Page 1 is therefore not the page 1 hosted Blockfrost returns. order=desc on /api/v0 reverses that address ordering, which is the opposite of the key that exists rather than the opposite of Blockfrost’s. The set of delegators across all pages is the same either way. The native endpoint is ordered by stake address on every path, live or snapshot, so a cursor walk that crosses from live to snapshot keeps its place; check live on each page to see which figures it carries.
  • Snapshot offset depth on /api/v0. On the snapshot path Blockfrost’s offset pages are emulated over the native cursor, so /api/v0 pages only as deep as offset 2000, which is page 21 at count=100. Past that it answers 400 naming the native endpoint. Walk /api/pools/{poolId}/delegators with its nextCursor when you need the whole list; that path has no depth limit.

Transactions

Nexus also serves transaction metadata that has no Maestro equivalent: GET /api/transactions/{txHash}/metadata and GET /api/transactions/{txHash}/metadata/cbor.

Where there is no native equivalent

Two Maestro reads have no native Nexus route, plus the two product surfaces described after them. Everything else on Maestro’s Cardano API appears in the map above. Before writing client-side aggregation for anything, check the Blockfrost-compatible surface at /api/v0: it serves reads the native API has no route of its own for, among them the per-pool metadata, relays, updates and blocks sub-resources. See Blockfrost Compatibility for the full list of what that surface serves and what it guards. Not served on either surface:
  • GET /policy/{policy}, the policy summary root. Its /assets, /utxos, /mints, /addresses, /accounts and /transactions sub-resources are all mapped above, so the underlying facts are reachable; only the one aggregate document is not.
  • GET /pools/{pool_id}/delegators/{epoch_no}. Only the newest stake snapshot is readable. The epoch-scoped variant is not guarded on /api/v0 and times out against the upstream aggregation, so treat historical delegator lists as unavailable rather than as a route to point at today. The plain /pools/{pool_id}/delegators is served, with the caveats listed under Stake pools.
Maestro’s Transaction Manager has no Nexus counterpart. POST /txmanager maps cleanly to POST /api/transactions/submit, but POST /txmanager/turbosubmit, GET /txmanager/{txhash}/state, GET /txmanager/history and POST /webhooks/project/{project_id} do not. Nexus submits the transaction and returns; tracking confirmation means polling GET /api/transactions/{txHash}, or subscribing over WebSocket streaming where your plan includes it.
Nexus does not serve Maestro’s Managed Contracts API (vesting, direct swap, single-asset staking, subscription, multisig). That is application logic rather than chain data, and there is no equivalent surface to migrate it onto.

Auth, base URL and network selection

Three differences to fold into your client, all mechanical. The header. Maestro’s api-key header becomes X-Api-Key, carrying a key that starts with nxs_. Keys are created in the dashboard and shown once. The base URL. Maestro selects a network by hostname (mainnet., preprod., preview.) plus a /v1 version segment. Nexus has one host for everything, https://nexus.gerowallet.io, and no version segment on the native API. The network. Nexus selects the network by key, not by hostname. Each key is bound at creation time to one chain-and-network pair, CARDANO_MAINNET, CARDANO_PREPROD or CARDANO_PREVIEW, so a mainnet key cannot read preprod. Most endpoints accept an optional network query parameter; omit it and the request runs against the key’s own network. Sending one that disagrees with the key returns 400 Network Mismatch.
Because the network rides on the key, running Maestro and Nexus side by side during the cutover means one extra key per network you read, not a second base-URL scheme. Both APIs work independently until September 18.

Why not the free one

Koios is a community-run, open-source Cardano API, and it costs nothing. A team leaving Maestro can pick it, so here is the straight answer. Its published tiers (koios.rest/tiers.html, checked 2026-09-07): public access with no key at 5,000 requests a day and 100 requests per 10 seconds, a registered no-charge tier at 50,000 a day, then Pro at about 29.99amonthfor500,000adayandPremiumatabout29.99 a month for 500,000 a day and Premium at about 74.99 for 1.2M. Queries time out at 30 seconds on the free tiers, and support is best-effort from the node operators who run it. If your workload is Cardano-only chain reads under 50,000 requests a day and best-effort uptime is acceptable, Koios is a good answer. Where it stops: it is Cardano only, so a Maestro user with Bitcoin reads needs a second provider; it is chain data only, with no market data, streaming, transaction builder or wallet analytics; and there is no one on the hook when it is down. Nexus counts requests monthly with no daily reset (3M on Starter at 9,10MonBuilderat9, 10M on Builder at 29), raises the per-second limit with the plan (10, 25, 50, 100 req/s), covers Bitcoin and Midnight on the same account, and keeps Koios itself in the fallback path behind its Cardano reads, so nothing is lost by choosing it.

What to test first

Nine checks that surface the differences that actually break code.
  1. A UTxO read on a known address. Confirms the header swap and that your key is scoped to the network you think it is.
  2. An asset lookup. GET /api/assets/detailedInfo takes assetPolicy and assetName as separate query parameters, so anything that concatenated the two into one path segment needs a split. Asset holders and asset UTxOs keep the concatenated unit form, so both shapes exist and it is easy to send the wrong one.
  3. GET /api/network/era-summaries. One cheap call that pins the era arithmetic every slot-to-time conversion depends on. Mainnet answers with seven entries, Byron through Conway, Conway starting at epoch 507.
  4. One bulk call. POST /api/addresses/utxos with two addresses. Batch bodies are the biggest shape change in this map, and they are the calls whose caps bite first: 50 addresses, 100 datum hashes, 100 asset units, 25 credentials.
  5. A cursor page followed twice. GET /api/pools/{poolId}/delegators on a large pool, then the same call with the returned nextCursor. Anything that assumed Maestro’s cursors, or that stops when a page comes back shorter than limit, breaks here.
  6. A historical epoch. GET /api/epoch/500 on mainnet returns fees of 67528053731. Fees are the reason to ask about a closed epoch, so they are the field worth asserting on.
  7. A handle resolve. GET /api/handles/charles. Confirms the ADA Handle move off /ecosystem/adahandle/{handle} and, because a handle is a live token, that you are reading a current holder rather than a cached one.
  8. A deliberate network mismatch. Send ?network=CARDANO_PREPROD on a mainnet key and confirm your error handling reads the 400 body rather than retrying.
  9. A transaction submit on preprod. Submission returns immediately with no managed state to poll, so any code that waited on a Transaction Manager state transition needs its own confirmation loop against GET /api/transactions/{txHash}.
Then check rate limit behaviour under your real burst. Metering is per request rather than per credit, so your call volume translates directly. Check the per-tier numbers on Rate Limits against your peak.

Next steps

Migrate from Maestro: Bitcoin

The Bitcoin half of the same migration

Blockfrost Compatibility

The one-line path for code that already speaks a Blockfrost SDK

Authentication

Key creation, scoping, and the network parameter

API Reference

The native Nexus surface, endpoint by endpoint