bullpen solana dca create¶
Last updated: July 13, 2026
Create a Jupiter Recurring DCA schedule
Usage¶
bullpen solana dca create [OPTIONS] --per-cycle <PER_CYCLE> --cycles <CYCLES> --interval <INTERVAL> <INPUT_MINT> <OUTPUT_MINT>
Live Help¶
Create a Jupiter Recurring DCA schedule
Usage: bullpen solana dca create [OPTIONS] --per-cycle <PER_CYCLE> --cycles <CYCLES> --interval <INTERVAL> <INPUT_MINT> <OUTPUT_MINT>
Arguments:
<INPUT_MINT>
Input SPL token mint address
<OUTPUT_MINT>
Output SPL token mint address
Options:
--output <OUTPUT>
Output format for command results
[possible values: table, json]
--per-cycle <PER_CYCLE>
Input token amount per cycle, in input-token units. Jupiter Recurring may reject small schedules; the CLI enforces a best-effort $50 per-cycle minimum when input price is known
--cycles <CYCLES>
Number of DCA cycles. Must be between 2 and 1000
--env <ENV>
Target environment to connect to (overrides config.toml)
[env: BULLPEN_ENV=]
[possible values: staging, production]
--config <CONFIG>
Path to a custom config.toml file (overrides $BULLPEN_CONFIG and the default location).
Explicit --config and BULLPEN_CONFIG paths fail closed: if the file is missing, the CLI exits validation instead of silently loading defaults. Credentials still resolve via BULLPEN_HOME, so set BULLPEN_HOME too when isolating a session.
--interval <INTERVAL>
Interval between cycles, such as 30m, 6h, 1d, 1w, or 2mo
--min-price <MIN_PRICE>
Minimum execution price guard forwarded to Jupiter Recurring
--max-price <MAX_PRICE>
Maximum execution price guard forwarded to Jupiter Recurring
--start-at <START_AT>
Explicit schedule start time as RFC 3339 UTC, for example 2099-01-01T00:00:00Z
--read-only
Enable read-only mode: blocks all mutating commands
--yes
Skip confirmation prompt
--non-interactive
Suppress interactive prompts; does NOT imply --yes for money-moving commands
[env: BULLPEN_NON_INTERACTIVE=]
--preview
Build and display the unsigned Jupiter Recurring transaction without signing or executing
-h, --help
Print help (see a summary with '-h')
EXAMPLES:
# Preview a USDC-to-BONK DCA schedule without signing or submitting
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --preview
# Export the DCA create preview as JSON
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --preview --output json
# Preview a price-bounded DCA schedule with a future start time
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --min-price 0.00002 --max-price 0.00004 --start-at 2099-01-01T00:00:00Z --preview
# Submit a confirmed DCA schedule after reviewing the preview
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --yes
Example Commands¶
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --preview
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --preview --output json
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --min-price 0.00002 --max-price 0.00004 --start-at 2099-01-01T00:00:00Z --preview
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --yes
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --min-price 0.00002 --max-price 0.00004 --start-at 2099-01-01T00:00:00Z --preview --output json
JSON Output¶
Contract: JSON Output Contract.
Preview (--preview --output json)¶
Preview output is a single JSON document emitted only when --preview --output json is passed. Live submit output uses the corresponding Solana Recurring mutation-report schema instead.
Schema version: 1 when a command emits schema_version; otherwise treat the current command shape as contract version 1.
Top-level Keys¶
| key | type | nullable | notes |
|---|---|---|---|
action |
string | no | dca_create |
user |
string | no | Bullpen Solana wallet used for the Recurring order |
input |
object | no | Input mint, symbol, per-cycle decimal amount, and atomics |
output_mint |
string | no | Output SPL token mint |
output_symbol |
string | yes | Output symbol when metadata is available |
number_of_orders |
integer | no | Number of DCA cycles |
interval_seconds |
integer | no | Seconds between cycles |
min_price |
string/decimal | yes | Optional minimum output-token price bound for Recurring execution |
max_price |
string/decimal | yes | Optional maximum output-token price bound for Recurring execution |
start_at_unix_secs |
integer | yes | Optional future start time as Unix seconds |
start_at_utc |
string | yes | RFC 3339 rendering of start_at_unix_secs when present |
total_in_amount |
string/decimal | no | Total input deposited across all cycles |
request |
object | no | Jupiter Recurring createOrder request preview |
unsigned_transaction |
object | no | Present for --preview; includes Jupiter request id and unsigned transaction |
Example¶
Example JSON output
bullpen solana dca create EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --per-cycle 50 --cycles 4 --interval 1d --min-price 0.00002 --max-price 0.00004 --start-at 2099-01-01T00:00:00Z --preview --output json
{
"action": "dca_create",
"user": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
"input": {
"mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"symbol": "USDC",
"amount": "50",
"amount_atomics": 50000000
},
"output_mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"output_symbol": "BONK",
"number_of_orders": 4,
"interval_seconds": 86400,
"interval_display": "1 day",
"min_price": "0.00002",
"max_price": "0.00004",
"start_at_unix_secs": 4070959200,
"start_at_utc": "2099-01-01T14:00:00+00:00",
"total_in_amount": "200",
"total_in_amount_atomics": 200000000,
"referral_account_configured": false,
"referral_fee_bps_configured": 0,
"request": {
"user": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
"inputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"outputMint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"params": {
"time": {
"inAmount": 200000000,
"numberOfOrders": 4,
"interval": 86400,
"minPrice": 0.00002,
"maxPrice": 0.00004,
"startAt": 4070959200
}
}
},
"unsigned_transaction": {
"request_id": "dca-create-request-1",
"transaction": "base64-unsigned-transaction"
}
}
Live Submit (--yes --output json)¶
Live submit output is a single JSON document emitted after confirmation or
--yes. It signs the Jupiter Recurring transaction, submits it through
Jupiter /execute, and includes the receipt status observed by Solana RPC.
The CLI forwards --start-at as Jupiter Recurring startAt. Provider list
readback may not echo a far-future startAt as the next execution time, so use
the create preview/live request.params.time.startAt field as the audit record
for what the CLI submitted.
Live Top-level Keys¶
| key | type | nullable | notes |
|---|---|---|---|
action |
string | no | dca_create |
order_key |
string | yes | Jupiter Recurring order key when returned by /execute |
request_id |
string | no | Jupiter Recurring create request id |
signature |
string | yes | Solana transaction signature when returned by /execute |
receipt_status |
string/object | no | confirmed, timeout, unknown, or { "status": "failed", "reason": "..." } |
execute_status |
string | yes | Raw Jupiter execute status when available |
execute_error |
string | yes | Raw Jupiter execute error when available |
index_status |
string | no | index_confirmed, index_timeout, or created |
retry_after_secs |
integer | yes | Suggested wait before checking again when the schedule is not indexed yet |
next_command |
string | yes | Safe follow-up command for readback or cancellation |
indexed_order |
object | yes | DCA schedule summary when bounded readback finds the order |
preview |
object | no | Same create preview payload used for confirmation and auditability |
Live Example¶
Live submit JSON output
{
"action": "dca_create",
"order_key": "7nE9GJoYHNmtaQvTQpota3KV2oz4pQ2dA6nvYK8EUJHV",
"request_id": "dca-create-request-1",
"signature": "5WJ5c7dVn4yJmYw8cT9pP9Nqf9X4oMi4vMZL3a8f8CKiJx4CazQkJQf9QdZ8m4L3A3M7K1S4xGmQ3k8J2V6c9A1b",
"receipt_status": "confirmed",
"execute_status": "Success",
"index_status": "index_confirmed",
"next_command": "bullpen solana dca cancel 7nE9GJoYHNmtaQvTQpota3KV2oz4pQ2dA6nvYK8EUJHV --preview --output json",
"indexed_order": {
"order_key": "7nE9GJoYHNmtaQvTQpota3KV2oz4pQ2dA6nvYK8EUJHV",
"input_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"output_mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"status": "active",
"total_cycles": 4,
"executed_cycles": 0,
"remaining_cycles": 4,
"progress_percent": "0",
"raw": {}
},
"preview": {
"action": "dca_create",
"user": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
"input": {
"mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"symbol": "USDC",
"amount": "50",
"amount_atomics": 50000000
},
"output_mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"output_symbol": "BONK",
"number_of_orders": 4,
"interval_seconds": 86400,
"interval_display": "1 day",
"total_in_amount": "200",
"total_in_amount_atomics": 200000000,
"referral_account_configured": false,
"referral_fee_bps_configured": 0,
"request": {
"user": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
"inputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"outputMint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
}
}
}
Stability¶
Patch releases may add nullable or optional fields. Minor releases may add required fields or increment schema_version. Major releases may remove or rename fields.
Solana Recurring Notes¶
--previewcalls Jupiter RecurringcreateOrderto fetch an unsigned transaction without Turnkey signing or/execute; it does not sign or submit.- Live create requires confirmation or
--yes.BULLPEN_NON_INTERACTIVEalone returnsCONFIRMATION_REQUIRED. - After live create, the CLI runs a bounded Jupiter Recurring readback for both table and JSON output. If Jupiter accepts the order before its list index is updated, JSON returns
index_status: "index_timeout",retry_after_secs, andnext_commandinstead of making agents infer the indexing window from a later not-found error. --per-cycleis in input-token units. The Jupiter request sends total deposited input asparams.time.inAmount = per_cycle * cycles.- The CLI enforces the mini-app DCA bounds: interval at least 60 seconds, cycles between 2 and 1000, and a best-effort $50 per-cycle minimum when input price is known.
--min-price,--max-price, and--start-atmap to Jupiter Recurring time-order parameters. The preview reports both normalized CLI fields and the nested Jupiter request.- Jupiter Recurring does not currently expose the Jupiter Ultra referral fields; configured Bullpen referral settings are reported but not forwarded.