Request headers
Select participant, executor, and retry-safety headers for DALP API requests.
DALP API requests separate who acts from which wallet executes. X-Participant selects the acting participant for the request. X-Executor selects whether the request uses the participant's direct signing wallet, a smart wallet, or the organization's default routing policy. DALP validates the participant, executor value, and account-abstraction availability before it queues a blockchain operation.
Header summary
| Header | Required | Accepted values | Default when omitted |
|---|---|---|---|
X-Participant | No | Canonical participant ID in pp_<uuid> format | The authenticated session participant |
X-Executor | No | eoa or smart-wallet | The active organization's executor routing policy |
Idempotency-Key | No | Client-generated retry key | DALP treats each request as a new instruction |
Send participant and executor headers only when the request needs explicit identity or wallet selection. Omit them for the normal path where DALP uses the authenticated participant and the organization's configured executor routing. Send an idempotency key on mutating requests when the client may retry after a timeout, dropped connection, or uncertain response.
Participant selection
X-Participant makes the acting participant explicit. The value must be the authenticated participant's canonical person participant ID, formatted as pp_<uuid> with lowercase UUID characters. It does not let an API key act for another participant.
curl "https://your-platform.example.com/api/v2/tokens/0x1234567890AbcdEF1234567890aBcdef12345678/holders" \
-H "X-Api-Key: YOUR_DALP_API_KEY" \
-H "X-Participant: pp_018f6d3e-89ab-7cde-8123-abcdefabcdef"If X-Participant is absent, DALP acts as the participant from the authenticated session. If the header is present but malformed, DALP rejects the request as input validation. If the header names any participant other than the authenticated participant, DALP returns the same not-found shaped error whether the requested participant exists in the same tenant, exists in another tenant, or does not exist.
Executor selection
X-Executor chooses the wallet that executes a blockchain operation for the selected participant.
| Header value | Effect | When to use it |
|---|---|---|
| Omitted | Uses the active organization's default executor routing. If account-abstraction routing is enabled, the executor resolves to the participant's smart wallet. If it is not enabled, the executor resolves to the participant's signing wallet. | Most integrations |
eoa | Forces raw execution through a personal participant's externally owned account. | Use only when the workflow must execute from the direct signer account. DALP rejects this value for non-person participants. |
smart-wallet | Forces smart-wallet execution after DALP confirms account abstraction is enabled for the platform and the active organization. | Use when the workflow must execute through a smart wallet. For person participants, DALP can provision the participant smart wallet during the request. |
The executor selected for the request becomes the effective wallet address that the smart contract sees as the caller. Route handlers use that resolved executor for role checks and user operation submission.
Use both headers together
The participant header answers who acts. The executor header answers which wallet acts for that participant. A request can set both when the caller wants the identity and executor choice to be explicit.
curl -X POST "https://your-platform.example.com/api/v2/tokens/0x1234567890AbcdEF1234567890aBcdef12345678/mints" \
-H "X-Api-Key: YOUR_DALP_API_KEY" \
-H "Idempotency-Key: mint-2026-05-17-001" \
-H "X-Participant: pp_018f6d3e-89ab-7cde-8123-abcdefabcdef" \
-H "X-Executor: smart-wallet" \
-H "Content-Type: application/json" \
-d '{
"recipients": ["0x1111111111111111111111111111111111111111"],
"amounts": ["1000"]
}'This request says: act as participant pp_018f6d3e-89ab-7cde-8123-abcdefabcdef, execute through that participant's smart wallet, and submit the mint operation once for the supplied idempotency key.
Idempotency-Key
Idempotency-Key makes a mutating request safer to retry when the first response is uncertain. Use one unique key for one client-side instruction. Store that key next to your own instruction or job ID. Reuse it only for retries of the same request. If the payload, route, or method changes, create a new key.
DALP uses the header in two ways:
- Response-cached mutations store the key per tenant with a stable hash of the request method, route, and body. A retry with the same key and the same request can return the cached response instead of running the instruction again.
- Transaction-writing APIs use the key as part of transaction queue retry identity. Queue identity can also include the operation kind, wallet route, chain, or route-specific scope. Treat the returned transaction request, status URL, events, and indexed state as the durable record after DALP accepts the request.
For response-cached mutations, retry behavior is:
| Retry situation | DALP behavior | Caller action |
|---|---|---|
| Same key, same request, completed inside the window | DALP returns the cached response for that request. | Treat the response as the result of the original instruction. |
| Same key while the original request is still running | DALP reports that the key is in flight. | Wait before retrying with the same key. Do not switch to a new key unless starting new work. |
| Same key with a different method, route, or body | DALP rejects the retry because the key was reused for a different request. | Keep the original key for the original request, or create a new key for the changed instruction. |
| Same key after the cache window expires | DALP can no longer attach the retry to the earlier cached response. | Confirm the earlier outcome before starting a new instruction with a new key. |
| Webhook endpoint creation or secret rotation retry | DALP returns the cached response with the cleartext signing secret removed. | Capture the secret from the first successful response and store it securely. If the first response was lost and the retry returns no secret, rotate or create again with a new key after confirming the endpoint state. |
DALP keeps the response cache for 24 hours. Treat that window as retry protection, not as a permanent transaction ledger. Use transaction status and event APIs to track long-running blockchain operations after DALP accepts the request.
Validation and failure modes
DALP validates participant and executor selection before queueing a blockchain operation.
| Condition | Result | Caller action |
|---|---|---|
X-Participant is malformed | The request fails input validation. | Use a canonical pp_<uuid> participant ID. |
X-Participant names a participant other than the authenticated participant | The request returns a not-found shaped participant error. | Remove the header or send the authenticated participant ID. |
X-Executor is not eoa or smart-wallet | The request fails input validation. | Omit the header or send one of the supported values. |
X-Executor: eoa is sent for a non-person participant | The request fails because EOA execution is not supported for that participant type. | Omit the header or use smart-wallet when the participant has an available smart wallet. |
X-Executor: smart-wallet is sent while platform account abstraction is disabled | The request fails before submission. | Omit the override or enable account abstraction before retrying. |
X-Executor: smart-wallet is sent while the active organization's account abstraction is disabled | The request fails before submission. | Omit the override, use eoa when the participant supports it, or enable account abstraction for the organization. |
X-Executor: smart-wallet cannot resolve a usable smart wallet | The request fails before submission. | Retry after wallet availability is restored, or omit the override. |
Route applicability
DALP exposes X-Participant and X-Executor in the OpenAPI specification on routes that can use participant or executor selection. Check /api/v2/spec.json for the operation you call before adding the headers.
| Route type | Header behavior |
|---|---|
| Transaction routes that queue blockchain operations | DALP validates the selected participant and executor before queueing the operation. |
| Token indexer reads that use participant context | DALP can use the selected participant to scope the read. |
| Smart wallet approval routes | DALP can use explicit executor selection when creating or signing approvals. |
| Routes that do not list these headers in OpenAPI | Treat the headers as not applicable. Omit them instead of relying on them. |
Error codes
| Error code | Public error | When it happens |
|---|---|---|
DALP-0524 | X_PARTICIPANT_FORBIDDEN | X-Participant is well formed but does not match the authenticated participant. |
DALP-0530 | X_EXECUTOR_UNSUPPORTED_FOR_PARTICIPANT_TYPE | X-Executor: eoa is used for a participant type that cannot execute through an EOA. |
DALP-0531 | X_EXECUTOR_NO_SMART_WALLET | X-Executor: smart-wallet is used when no smart wallet is available for the selected participant. |
DALP-0616 | X_EXECUTOR_AA_DISABLED_GLOBALLY | X-Executor: smart-wallet is used while platform account abstraction is disabled. |
DALP-0621 | X_EXECUTOR_AA_DISABLED_FOR_ORG | X-Executor: smart-wallet is used while account abstraction is disabled for the active organization. |
Malformed participant IDs and unsupported executor values return input validation errors before DALP queues the operation.
Related headers
Use Prefer when a transaction route supports response timing preferences. X-Transaction-Speed is a parsed request header on routes that expose it; leave it unset unless route documentation or your integration contract tells you to send an explicit speed preference. X-User-Id and X-Organization-Id are internal response headers used by the API layer and are not request headers for integrations.