POST /wallet/:address/transactions/submit
Submit wallet-signed transactions to the Solana cluster. Each signed transaction is paired with the submission ticket returned by the build endpoint. The server verifies the ticket, confirms the message hash matches, forwards the transaction via RPC, and logs the result.
Request
POST https://api.aerosol.com/api/v1/burner/wallet/:address/transactions/submitHeaders
| Header | Required | Description |
|---|---|---|
X-Api-Key or Authorization | Yes | API key or session token with transactions:submit scope |
Content-Type | Yes | application/json |
Path parameters
| Parameter | Type | Description |
|---|---|---|
address | string | Solana wallet address |
Body
| Field | Type | Required | Description |
|---|---|---|---|
signed | SignedTransaction[] | Yes | Array of signed transactions with their submission tickets. |
SignedTransaction
| Field | Type | Required | Description |
|---|---|---|---|
transactionBase64 | string | Yes | Base64-encoded signed VersionedTransaction. |
submissionTicket | string | Yes | The ticket from the build response’s BuiltTransaction.submissionTicket. |
Example request
curl -X POST https://api.aerosol.com/api/v1/burner/wallet/DRpbCBMxVnDK7maPM5tGv6MvB3v1sRMC86PZ8okm21hy/transactions/submit \
-H "Authorization: Bearer eyJhbGci..." \
-H "Content-Type: application/json" \
-d '{
"signed": [
{
"transactionBase64": "AQAAAA...(signed)...",
"submissionTicket": "ticket_abc123..."
}
]
}'Response
200 OK
{
"results": [
{
"signature": "5UfDuK...txHash",
"status": "submitted",
"includes": [
{ "type": "empty_account", "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU", "action": "close" }
]
}
]
}SubmissionResult fields
| Field | Type | Description |
|---|---|---|
signature | string | null | Solana transaction signature. null if the submission failed. |
status | string | One of submitted, duplicate, or failed. |
includes | ItemSelection[] | The items this transaction covers (echoed from the build response). |
error | { code: string, message: string } | Present only when status is failed. |
Status values
| Status | Meaning |
|---|---|
submitted | Transaction was sent to the Solana cluster. The signature field contains the transaction hash. |
duplicate | This submission ticket was already submitted. The original signature is returned. Safe to treat as success. |
failed | The transaction could not be submitted. Check error for details. |
Common error codes
| Code | Description |
|---|---|
TICKET_EXPIRED | The submission ticket has expired. Rebuild the transactions. |
HASH_MISMATCH | The signed transaction’s message hash doesn’t match what the server built. The transaction may have been tampered with. |
RPC_ERROR | The Solana RPC rejected the transaction (e.g., blockhash expired, insufficient funds for fees). |
Error responses
| Status | Cause |
|---|---|
| 400 | Empty signed array, missing submissionTicket |
| 401 | Invalid credentials or session lacks transactions:submit scope |
| 429 | Rate limit exceeded |
SDK example
const { results } = await client.submitTransactions(walletAddress, {
signed: signedTxs.map((tx, i) => ({
transactionBase64: Buffer.from(tx.serialize()).toString('base64'),
submissionTicket: builtTxs[i].submissionTicket,
})),
})Raw fetch example
const res = await fetch(
`https://api.aerosol.com/api/v1/burner/wallet/${walletAddress}/transactions/submit`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${sessionToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
signed: [
{
transactionBase64: base64SignedTx,
submissionTicket: ticket,
},
],
}),
}
)
const data = await res.json()Retry behavior
Submission tickets include a unique jti (JWT ID). If you submit the same ticket twice, the server returns status: "duplicate" with the original signature rather than sending the transaction again. This makes retries safe and idempotent.
Last updated on