Skip to main content
POST
/
api
/
v1
/
transfers
/
{transferId}
/
prepare
curl -X POST /api/v1/transfers/42/prepare \
  -H "x-api-key: mh_live_abc123..." \
  -H "Idempotency-Key: $(uuidgen)"
{
  "transfer": { "id": 42, "status": "awaiting_signature" },
  "preparedTxs": {
    "keeperFundingTx": "AQAAAAAAAA...",
    "routeInitTxs": [{ "base64": "AQAAAAAAAA..." }],
    "orchestratorInitTx": null,
    "sessionInitTxs": ["AQAAAAAAAA...", "AQAAAAAAAA..."],
    "recentBlockhash": "BpFi8bTNRuLbUnrq7q1N1M...",
    "lastValidBlockHeight": 289043200,
    "resume": {
      "routeAlreadyDeployed": false,
      "existingHopCount": 0,
      "totalHops": 7,
      "orchestratorAlreadyInitialized": true,
      "completedStepIndices": [],
      "totalSteps": 7,
      "keeperAlreadyFunded": false,
      "nothingToDo": false
    }
  }
}
Probes on-chain state and returns the full bundle of unsigned Solana transactions that sourceOwner must sign and broadcast to deploy the transfer. This endpoint is resumable — re-call it after a partial broadcast to get a fresh blockhash and drop any groups already confirmed on-chain (null fields are already on chain, skip them).
On compliance-enabled networks (mainnet) the bundle includes a flat 0.002 SOL screening fee transfer that runs at deploy. Ensure the sourceOwner wallet holds enough SOL to cover route amount + protocol fees + account rent + keeper funding + the screening fee before signing — the fee is not part of /estimate. It is a refundable anti-abuse deposit: a clean (verified) route gets it back, a flagged route forfeits it. Either way the wallet must hold it at deploy time. See Compliance & screening.

Path parameters

transferId
integer
required
The internal transfer ID.

Response

transfer
object
Current transfer state.
preparedTxs
object
Bundle of unsigned transactions to sign and broadcast.
curl -X POST /api/v1/transfers/42/prepare \
  -H "x-api-key: mh_live_abc123..." \
  -H "Idempotency-Key: $(uuidgen)"
{
  "transfer": { "id": 42, "status": "awaiting_signature" },
  "preparedTxs": {
    "keeperFundingTx": "AQAAAAAAAA...",
    "routeInitTxs": [{ "base64": "AQAAAAAAAA..." }],
    "orchestratorInitTx": null,
    "sessionInitTxs": ["AQAAAAAAAA...", "AQAAAAAAAA..."],
    "recentBlockhash": "BpFi8bTNRuLbUnrq7q1N1M...",
    "lastValidBlockHeight": 289043200,
    "resume": {
      "routeAlreadyDeployed": false,
      "existingHopCount": 0,
      "totalHops": 7,
      "orchestratorAlreadyInitialized": true,
      "completedStepIndices": [],
      "totalSteps": 7,
      "keeperAlreadyFunded": false,
      "nothingToDo": false
    }
  }
}