curl --request POST \
--url https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"marketId": "morpho-v2-base-steakhouse-usdc",
"amount": "10",
"chainId": 8453
}
'import requests
url = "https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals"
payload = {
"marketId": "morpho-v2-base-steakhouse-usdc",
"amount": "10",
"chainId": 8453
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({marketId: 'morpho-v2-base-steakhouse-usdc', amount: '10', chainId: 8453})
};
fetch('https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'marketId' => 'morpho-v2-base-steakhouse-usdc',
'amount' => '10',
'chainId' => 8453
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals"
payload := strings.NewReader("{\n \"marketId\": \"morpho-v2-base-steakhouse-usdc\",\n \"amount\": \"10\",\n \"chainId\": 8453\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"marketId\": \"morpho-v2-base-steakhouse-usdc\",\n \"amount\": \"10\",\n \"chainId\": 8453\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"marketId\": \"morpho-v2-base-steakhouse-usdc\",\n \"amount\": \"10\",\n \"chainId\": 8453\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"walletId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": 8453,
"marketId": "morpho-v2-base-steakhouse-usdc",
"source": "aave-v3",
"action": "deposit",
"amount": "10.0",
"status": "pending",
"transactions": [
{
"phase": "approval",
"hash": "<string>",
"nonce": 1,
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "signed",
"blockNumber": 123,
"blockHash": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"error": {
"code": "<string>",
"message": "<string>",
"reviewId": "<string>"
}
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"walletId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": 8453,
"marketId": "morpho-v2-base-steakhouse-usdc",
"source": "aave-v3",
"action": "deposit",
"amount": "10.0",
"status": "pending",
"transactions": [
{
"phase": "approval",
"hash": "<string>",
"nonce": 1,
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "signed",
"blockNumber": 123,
"blockHash": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"error": {
"code": "<string>",
"message": "<string>",
"reviewId": "<string>"
}
}{
"code": "INVALID_REQUEST",
"message": "type must be one of EVM, SOLANA, COSMOS, STELLAR, SUI"
}{
"code": "UNAUTHORIZED",
"message": "secret api key not provided"
}{
"code": "FORBIDDEN",
"message": "invalid secret api key"
}{
"code": "NOT_FOUND",
"message": "wallet not found"
}{
"code": "INVALID_REQUEST",
"message": "<string>",
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"failureStage": "mpc_sign",
"failureCode": "<string>",
"signedTransaction": "<string>"
}{
"code": "RATE_LIMITED",
"message": "Rate limit exceeded, try again shortly."
}{
"code": "INTERNAL_ERROR",
"message": "Internal Server Error"
}Withdraw
Withdraw some or all supplied USDC from the selected market to the same wallet.
curl --request POST \
--url https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"marketId": "morpho-v2-base-steakhouse-usdc",
"amount": "10",
"chainId": 8453
}
'import requests
url = "https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals"
payload = {
"marketId": "morpho-v2-base-steakhouse-usdc",
"amount": "10",
"chainId": 8453
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({marketId: 'morpho-v2-base-steakhouse-usdc', amount: '10', chainId: 8453})
};
fetch('https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'marketId' => 'morpho-v2-base-steakhouse-usdc',
'amount' => '10',
'chainId' => 8453
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals"
payload := strings.NewReader("{\n \"marketId\": \"morpho-v2-base-steakhouse-usdc\",\n \"amount\": \"10\",\n \"chainId\": 8453\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"marketId\": \"morpho-v2-base-steakhouse-usdc\",\n \"amount\": \"10\",\n \"chainId\": 8453\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.beta.getpara.com/v1/wallets/{walletId}/yield/withdrawals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"marketId\": \"morpho-v2-base-steakhouse-usdc\",\n \"amount\": \"10\",\n \"chainId\": 8453\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"walletId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": 8453,
"marketId": "morpho-v2-base-steakhouse-usdc",
"source": "aave-v3",
"action": "deposit",
"amount": "10.0",
"status": "pending",
"transactions": [
{
"phase": "approval",
"hash": "<string>",
"nonce": 1,
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "signed",
"blockNumber": 123,
"blockHash": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"error": {
"code": "<string>",
"message": "<string>",
"reviewId": "<string>"
}
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"walletId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": 8453,
"marketId": "morpho-v2-base-steakhouse-usdc",
"source": "aave-v3",
"action": "deposit",
"amount": "10.0",
"status": "pending",
"transactions": [
{
"phase": "approval",
"hash": "<string>",
"nonce": 1,
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "signed",
"blockNumber": 123,
"blockHash": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"error": {
"code": "<string>",
"message": "<string>",
"reviewId": "<string>"
}
}{
"code": "INVALID_REQUEST",
"message": "type must be one of EVM, SOLANA, COSMOS, STELLAR, SUI"
}{
"code": "UNAUTHORIZED",
"message": "secret api key not provided"
}{
"code": "FORBIDDEN",
"message": "invalid secret api key"
}{
"code": "NOT_FOUND",
"message": "wallet not found"
}{
"code": "INVALID_REQUEST",
"message": "<string>",
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"failureStage": "mpc_sign",
"failureCode": "<string>",
"signedTransaction": "<string>"
}{
"code": "RATE_LIMITED",
"message": "Rate limit exceeded, try again shortly."
}{
"code": "INTERNAL_ERROR",
"message": "Internal Server Error"
}Authorizations
Your partner secret key (server-side only)
Headers
UUID for request tracing. Para returns one if omitted.
Required durable key scoped to your API partner across yield operations. Reuse the same key and normalized request to retrieve or explicitly retry its operation. A different wallet, chain, market, action or amount returns 409. Unlike generic POST idempotency, this key is retained with the operation rather than expiring after 24 hours.
1 - 256^[\x21-\x7e]+$Path Parameters
Wallet UUID. A malformed or inaccessible wallet ID returns 404.
"0a1b2c3d-4e5f-6789-abcd-ef0123456789"
Body
- Option 1
- Option 2
Market ID from the markets endpoint. Determines the chain and asset. Required if chainId is omitted. Without marketId, chainId selects Aave V3. Unsupported market IDs or a mismatched chainId return 400 before operation creation or signing. Additional request fields are rejected. Morpho supports morpho-v2-ethereum-steakhouse-usdc on Ethereum (1) and morpho-v2-base-steakhouse-usdc on Base (8453). The sandbox-only Morpho demo market is morpho-v2-base-sepolia-demo-usdc on Base Sepolia (84532); it holds test USDC idle and earns no lending yield.
"morpho-v2-base-steakhouse-usdc"
Positive USDC amount in decimal units, not base units. At most six decimal places; zero is rejected.
85^(0|[1-9]\d*)(\.\d{1,6})?$"10"
Optional when marketId is supplied; must match its chain. Without marketId, selects Aave V3 on this chain. Native USDC on Ethereum mainnet (1) or Base mainnet (8453), or Aave test USDC on Sepolia (11155111). Base Sepolia (84532) uses test USDC and is available only in sandbox and local test environments. Base uses native USDC, not USDbC. Mainnet chain IDs use real funds regardless of API environment.
1, 8453, 11155111, 84532 8453
Response
Existing terminal or paused operation.
1, 8453, 11155111 8453
"morpho-v2-base-steakhouse-usdc"
aave-v3, morpho-v2 deposit, withdraw Normalized decimal USDC amount, or all for withdrawals.
"10.0"
pending work automatically retries recognized temporary RPC failures before signing and waits for another yield operation on the same wallet. submitted can mean signed and durably stored even when RPC acceptance is uncertain. confirmed requires two confirmations of the canonical block; this is not finality. failed means an on-chain revert or NONCE_CONSUMED; it does not guarantee that no funds moved. requires_action needs an explicit retry after correcting the issue.
pending, submitted, confirmed, failed, requires_action, cancelled Show child attributes
Show child attributes
Show child attributes
Show child attributes