Skip to main content
POST
/
accounts
/
{external_id}
/
plan
/
earn
Plan Earn
curl --request POST \
  --url https://api.example.com/accounts/{external_id}/plan/earn

Plan Earn

Creates a plan to deposit assets into a DeFi yield protocol. Returns a plan ID and an EIP-712 digest that must be signed by the account’s signer to authorize execution.

Request

POST /accounts/:external_id/plan/earn

Path parameters

ParameterTypeDescription
external_idstringThe sub-account’s external ID

Body parameters

ParameterTypeRequiredDescription
amountstringYesAmount in the asset’s smallest unit (e.g., "1000000" = 1 USDC)
assetstringYesAsset symbol (e.g., "USDC")
networkstringYesNetwork name (e.g., "base", "mainnet")
protocolstringYesProtocol to earn on (e.g., "compound", "morpho", "aave")

Examples

curl -X POST https://prime-api.legend.xyz/accounts/acc_2o0yiljtp378/plan/earn \
  -H "Authorization: Bearer $LEGEND_QUERY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "1000000",
    "asset": "USDC",
    "network": "base",
    "protocol": "compound"
  }'
Response (201 Created)
{
  "plan_id": "pln_71mcui082png",
  "chart": {
    "quark_operation_actions": [
      {
        "operation": {
          "expiry": "1750012800",
          "is_replayable": false,
          "nonce": "0xcafe...cafe",
          "script_address": "0x72e7e6ce7cb4d28ffe830708be3d30aee286ec24",
          "script_calldata": "0x4d618e3b..."
        },
        "action": {
          "action_context": {
            "action_type": "COMET_SUPPLY",
            "amount": "1000000",
            "asset_symbol": "USDC",
            "chain_id": "8453"
          }
        }
      }
    ],
    "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)
chartobjectTransaction details including EIP-712 signing data
chart.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 or invalid values
400plan_failedCould not generate a valid plan (e.g., insufficient balance)
400no_walletAccount has no wallets
408timeoutFolio computation timed out

Notes

  • Plans are ephemeral — they’re stored temporarily and expire after 2 minutes
  • No on-chain state changes until you call Execute Plan
  • The amount is in the asset’s smallest unit. For USDC (6 decimals), "1000000" = 1 USDC
  • Use List Assets to check supported assets and their decimals
  • Use List Networks to check supported networks