Skip to content

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

  • --preview calls Jupiter Recurring createOrder to fetch an unsigned transaction without Turnkey signing or /execute; it does not sign or submit.
  • Live create requires confirmation or --yes. BULLPEN_NON_INTERACTIVE alone returns CONFIRMATION_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, and next_command instead of making agents infer the indexing window from a later not-found error.
  • --per-cycle is in input-token units. The Jupiter request sends total deposited input as params.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-at map 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.