Skip to main content

Base URL

Authentication

Every authenticated request must include your API key (a UUID) in the x-api-key header:
GET /chains and GET /source-config are public and do not require a key. A missing key returns 401 UNAUTHORIZED; an invalid key returns 403 FORBIDDEN.

Pagination

List endpoints are cursor-paginated by creation time (newest first). Each response includes nextCursor; pass it back as cursor for the next page. When nextCursor is null, there are no more pages.

Errors

Error shape

All API errors — plus the error field on a swap and on a status_changed event — share one structured shape:
API error responses wrap it as { "error": { ... } } with an appropriate HTTP status. Always branch on code (a stable enum) rather than message (which may be reworded). details, when present, holds only safe, parameterized context (numbers, ids, thresholds) — never raw internal exception text.

Error codes

On a swap, error.retryable also reflects state: a dead (terminal) item always reports retryable: false, because the worker will not try it again regardless of the code.

Get a deposit address

You don’t call MPS to mint a deposit address — you get one from the Mayan Quote API. Request a quote with mpsDeposit: true and a destinationAddress, then read mpsDepositAddress off any eligible quote. The address is deterministic and permanent for a given recipient, and MPS settles anything sent to it automatically. See MPS deposit address on the Quote API for the request/response shape and eligibility rules.

List deposit addresses

Paginated deposit addresses that have been created for the authenticated integrator (each is minted the first time you request a quote with mpsDeposit: true for a new recipient).
Response

List swaps

Paginated settlement status for your deposit addresses. This is the endpoint to poll for payment progress. Each item is a settlement request: MPS sweeps the wallet’s balance of tokenAddress on chainId and delivers it to the destination.
Response
  • chainId is the Wormhole chain ID the funds are on; tokenAddress is the token being settled.
  • amount is a best-effort snapshot for display (raw smallest-unit string, or null for a request-indexed settlement). The actual settled amount is the wallet’s live balance at swap time.
  • error is null unless the item is failing/deferred — a non-null error never means success.
  • See Swap Statuses for status/phase/category/terminal, and swapTxHash for the settlement transaction (view it on Mayan Explorer).

Request index

Trigger settlement for a token the scanner doesn’t auto-detect. Only whitelisted tokens (native + USDC on EVM; USDC/USDT/WETH on Solana) are detected automatically. For any other token, call this with one of your deposit addresses (an mpsDepositAddress from a quote), the token, and the chain — MPS queues a settlement and the worker sweeps the wallet’s live balance. If a settlement for that wallet+token is already active, the call is deduped.
Request body Example
Response
  • queueItemId is the settlement id (null when not queued) — track it via GET /swaps and status_changed events.
  • When queued is false, reason explains why: "already_queued" (a settlement for this wallet+token is already active — the in-flight one will sweep the new balance too), "below_token_min" (below the token’s configured minimum), or "below_min" (below the chain’s USD floor).
  • Returns 404 NOT_FOUND if walletAddress is not one of your registered deposit addresses.

Chain info

Supported chains with their block-explorer URLs. No authentication required.
Response
kind is "evm" or "svm". This lists every chain (as a destination or explorer target); to discover which source chains and tokens the scanner actually detects and settles, use GET /source-config.

Source config

The source chains and tokens the scanner auto-detects and settles, with the minimum deposit advertised per token. No authentication required. Poll this instead of hardcoding a list — the minimums here are the same ones the deposit gate enforces, so they never drift. Any token not listed can still be settled on demand via POST /request-index.
Response
A deposit below the advertised minimum is detected but not settled — you still get a deposit_detected event with queued: false and ignoredReason: "below_token_min" (or "below_min" for the chain-level USD floor). See deposit_detected.

Event replay

Fetch this integrator’s events in chronological order — used to catch up after a WebSocket disconnect. Events are retained for 30 days.
Response (ascending by time):
Page forward with nextCursor until it is null. See Delivery & replay for the full pattern.