Skip to main content
POST
/
accounts
/
{account_id}
/
plan
/
migrate
Plan Migrate
curl --request POST \
  --url https://api.example.com/accounts/{account_id}/plan/migrate

Plan Migrate

Creates a plan to migrate a supply position from one DeFi protocol to another. This atomically withdraws from the source protocol and deposits into the destination protocol. Returns a plan ID and an EIP-712 digest that must be signed to authorize execution.

Request

POST /accounts/:account_id/plan/migrate

Path parameters

ParameterTypeDescription
account_idstringThe sub-account ID

Body parameters

ParameterTypeRequiredDescription
amountstringYesAmount to migrate in the asset’s smallest unit
assetstringYesAsset to migrate (e.g., "USDC")
from_protocolstringYesSource protocol: "compound", "aave", or "morpho_vault"
to_protocolstringYesDestination protocol: "compound", "aave", or "morpho_vault"
networkstringYesTarget network (e.g., "base", "mainnet"). Funds on other chains are bridged automatically.
from_marketstringNoSource market reference (required for morpho_vault)
to_marketstringNoDestination market reference (required for morpho_vault)
migrate_only_supply_balancesbooleanNoIf true, only migrate supply balances (default: false)

Examples

Compound to Aave

curl -X POST https://prime-api.legend.xyz/accounts/acc_2o0yiljtp378/plan/migrate \
  -H "Authorization: Bearer $LEGEND_QUERY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "1000000",
    "asset": "USDC",
    "from_protocol": "compound",
    "to_protocol": "aave",
    "network": "base"
  }'

Aave to Morpho Vault

curl -X POST https://prime-api.legend.xyz/accounts/acc_2o0yiljtp378/plan/migrate \
  -H "Authorization: Bearer $LEGEND_QUERY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "1000000",
    "asset": "USDC",
    "from_protocol": "aave",
    "to_protocol": "morpho_vault",
    "to_market": "steakhouse-usdc",
    "network": "base"
  }'
Response (201 Created)
{
  "plan_id": "pln_71mcui082png",
  "details": {
    "quark_operation_actions": [...],
    "eip712_data": {
      "digest": "0x8a3f...b7c2",
      "domain_separator": "0x...",
      "hash_struct": "0x..."
    }
  },
  "expires_at": "2025-06-15T10:32:00Z"
}

Response fields

FieldTypeDescription
plan_idstringUnique identifier for this plan (pln_ prefix)
detailsobjectTransaction details including EIP-712 signing data
details.eip712_data.digeststringThe hash to sign with the account’s signer key
expires_atstringISO 8601 timestamp — plan must be executed before this time

Errors

StatusCodeDescription
400invalid_paramsMissing required parameters, unsupported protocol, or missing market reference for morpho_vault
400plan_failedCould not generate a valid plan (e.g., insufficient balance in source)
400no_walletAccount has no wallets
408timeoutFolio computation timed out

Notes

  • Plans expire after 2 minutes. Sign and execute via Execute Plan before expiry.
  • The withdrawal and deposit happen atomically in a single transaction.
  • When using morpho_vault as source or destination, you must provide the corresponding from_market or to_market parameter.
  • Set migrate_only_supply_balances to true to prevent migrating reward or other non-supply balances.