The build response
Every builder returns:result is one step or an array of steps. Each step has:
Some builders add metadata fields, such as
position from dlmm/open or vault from vault/initialize. The endpoint pages list them.
Sign and send one step
- Decode
transactionfrom base64 and deserialize it as aVersionedTransaction. - Sign it with the manager keypair. Keep any signatures already present. For example,
dlmm/openincludes the new position account’s signature. - Send
POST /transactions/sendwith the signed transaction and the step’s ticket:
Store
signature and receipt in both cases.
Confirm with the receipt
PollGET /transactions/status?receipt=<receipt> every 2 seconds or slower. URL-encode the receipt.
Only
confirmed means the action happened. A receipt works only for the key that sent it, for 24 hours.
Send a batch in order
Whenresult is an array, keep its order. sendConcurrently splits it into groups:
- A step without
sendConcurrently: trueis a barrier. Send it alone and wait forconfirmedbefore you send anything after it. - A run of consecutive steps with
sendConcurrently: trueis one group. Send them together, then wait until every one isconfirmedbefore the next barrier or group.
GET /vaults/{vault}/strategies, and build only the remaining work. DLMM builders that process bin ranges accept cursorBinId so you can resume where the last confirmed range ended.
Each step’s ticket expires 90 seconds after the build. Sign every step right after the build, and send the batch without long pauses. If a ticket expires partway, send returns 403 InvalidTicket. Read current state and build again.
Follow next steps
A step withnext needs a follow-up build after it confirms:
POST /transactions/{next.path} with next.body unchanged. The follow-up reads chain state that only exists after the earlier step, which is why it is a separate build. The key needs the scope for next.path. Authentication lists which actions can return which paths.
Phoenix onboarding
Aphoenix/onboard build invokes only the Phoenix program, and Phoenix must co-sign it. POST /transactions/send rejects its ticket with 403.
- Build with
POST /transactions/phoenix/onboard. The step is not simulated (simulation.deferred: true). - Sign it with the manager keypair. The manager signs only as the fee payer.
- Send
{ "transaction", "ticket" }toPOST /transactions/phoenix/onboard/submit. The key needssendandphoenix/onboard.
status is unknown when the Phoenix request failed in flight, took longer than 15 seconds, returned a reply the API could not read, or named a different signature. Poll the receipt in that case. When Phoenix returns an error reply, the API returns 502 with no receipt.
Sending outside the relay
The relay is optional. A bot can submit its own signed transaction to Solana. The ticket and scopes protect this HTTP service, not the manager key’s on-chain power. If you bypass the relay, you also bypass its checks, and you cannot useGET /transactions/status for that transaction.