Estimate transfer batch
Validates an exact-wallet transfer batch request and estimates transaction chunking and fees.
POST/Run in dashboard
warnings lists what would make the batch fail: a native SOL amount below the rent-exempt minimum sent to an address with no account, or a source wallet left below the minimum; create refuses those with 409 AMOUNT_BELOW_RENT_MINIMUM.
Requires an API key with the transfer_batches.read action.
Headers
-
x-project-id·string· min length 1 · exampleprj_exampleRequired for dashboard sessions. API keys use their assigned project.
Request body
application/json · required
Estimate transaction chunking and fees for a transfer batch.
-
projectId·string· min length 1 · exampleprj_exampleProject identifier for the transfer batch context.
-
sourceCustodyWalletId·string· required · min length 1 · examplecwlt_exampleExact SDP Wallet ID (
idfromGET /v1/wallets). -
token·string· required · exampleSOLToken to transfer. Pass
SOLfor the native token, a well-known token symbol (e.g.USDC) resolved to the configured cluster's mint, or a base58 SPL mint address. Custom tokens must be specified by their on-chain mint. -
recipients·object[]· required · min items 1 · max items 500Counterparty-account recipients to pay in this batch.
-
externalId·string· min length 1 · max length 256 -
counterpartyId·string· min length 1 -
counterpartyAccountId·string· required · min length 1 -
amount·string· required
-
-
options·objectExecution options for transaction chunking, priority fees, and preflight validation.
-
maxRecipientsPerTransaction·integer· min 1 · max 64 -
priorityFee·string· one ofnone,low,medium,high,auto -
preflight·boolean
-
-
externalId·string· min length 1 · max length 256 · examplepayroll_2026_06_30Optional: an estimate moves nothing, so it names no payout run. Pass the run's
externalIdto estimate the batch you will create with it.
Responses
-
200Transfer batch estimate-
data·object· requiredTransfer batch estimate response payload.
-
estimate·object· requiredTransfer batch estimate.
-
recipientCount·integer· requiredRequested recipient count.
-
transactionCount·integer· requiredEstimated number of Solana transaction chunks.
-
estimatedFees·object· requiredEstimated fee components.
-
networkFeeLamports·string· required · example5000Estimated base network fee in lamports.
-
priorityFeeLamports·string· required · example0Estimated priority fee in lamports.
-
tokenAccountRentLamports·string· required · example0Estimated rent needed for newly-created recipient token accounts.
-
sponsored·boolean· required · exampletrueWhether SDP sponsors transaction fees for this batch.
-
-
warnings·object[]· requiredWhat would make the batch fail. Empty when the batch can be sent as estimated.
One of:
-
code: "AMOUNT_BELOW_RENT_MINIMUM"
-
code·string· required · alwaysAMOUNT_BELOW_RENT_MINIMUMA native SOL recipient's address holds no account and its amount is below the rent-exempt minimum.
-
recipientIndex·integer· requiredZero-based index of the recipient in the request.
-
minimumAmount·string· requiredThe smallest SOL amount the address can receive while it has no account.
-
message·string· requiredHuman-readable warning.
-
-
code: "SOURCE_BELOW_RENT_MINIMUM"
-
code·string· required · alwaysSOURCE_BELOW_RENT_MINIMUMThe source wallet would be left holding more than nothing but less than the rent-exempt minimum, at the end or after some order of the batch's concurrent transactions.
-
sourceRemainder·string· requiredThe SOL the source wallet would be left with.
-
minimumAmount·string· requiredThe rent-exempt minimum for a SOL wallet.
-
message·string· requiredHuman-readable warning.
-
-
-
-
-
meta·object· requiredResponse metadata.
-
requestId·string· required · min length 1 · examplereq_exampleRequest identifier for tracing.
-
timestamp·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
-
-
400Bad Request-
error·object· requiredStandard error payload.
-
code·string· requiredMachine-readable error code.
-
message·string· requiredHuman-readable error message.
-
details·objectOptional error details for debugging.
*·any
-
-
meta·object-
requestId·string· min length 1 · examplereq_exampleRequest identifier for tracing.
-
-
-
401UnauthorizedSame fields as
400. -
403Forbidden. Requires thetransfer_batches.readaction: an API key must hold it (a module'smanageorexecutealso covers itsread), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS anderror.details.actionnames the action. Any other 403 names its own reason.Same fields as
400. -
404Not FoundSame fields as
400. -
500Internal Server ErrorSame fields as
400.
Example request
curl -X POST 'https://api.solana.com/v1/payments/transfer-batches/estimate' \
-H "Authorization: Bearer $SDP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "prj_example",
"sourceCustodyWalletId": "cwlt_example",
"token": "SOL",
"recipients": [
{
"externalId": "payroll_row_001",
"counterpartyId": "cpty_example",
"counterpartyAccountId": "cpacct_example",
"amount": "25.00"
}
],
"options": {
"maxRecipientsPerTransaction": 20,
"priorityFee": "auto",
"preflight": true
},
"externalId": "payroll_2026_06_30"
}'Example responses
{
"data": {
"estimate": {
"recipientCount": 1,
"transactionCount": 1,
"estimatedFees": {
"networkFeeLamports": "5000",
"priorityFeeLamports": "0",
"tokenAccountRentLamports": "0",
"sponsored": true
},
"warnings": [
{
"code": "AMOUNT_BELOW_RENT_MINIMUM",
"recipientIndex": 1,
"minimumAmount": "example",
"message": "example"
}
]
}
},
"meta": {
"requestId": "req_example",
"timestamp": "2025-01-01T00:00:00.000Z"
}
}Error responses use the standard error shape.