# Create

<div class="api-grid" markdown>
<div class="api-main" markdown>

<span class="api-method api-method--post">POST</span> <span class="api-url">`https://api.pro.anboto.xyz/api/v2/strategies/campaigns/create`</span>

A delta-neutral long+short pair on Papertrade, repeated until stopped. 409 while the team already runs a campaign (one at a time per account), or while one in error still holds legs. **ApiKeyAuth** required.

### Body params

<div class="api-params" markdown>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`type` <span class="api-param__type">string</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">Campaign type; today only paper_farm</div>
<div class="api-param__meta" markdown="span">Default: `paper_farm`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`exchange_id` <span class="api-param__type">string</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">The venue to farm on; today only papertrade</div>
<div class="api-param__meta" markdown="span">Default: `papertrade`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`symbol` <span class="api-param__type">string</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">Anboto symbol, BTC/USDC:USDC or ETH/USDC:USDC</div>
<div class="api-param__meta" markdown="span">Example: `BTC/USDC:USDC`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`leverage` <span class="api-param__type">integer</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">Leverage of each leg, 1-1000 (the leverage guard caps it well below 1000 in practice)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`margin_per_leg` <span class="api-param__type">number</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">Margin to post per leg at the start of a cycle, in USDC (>= 10)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`target_move_bps` <span class="api-param__type">integer</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">Winning-leg move, in basis points, that closes a cycle (50-100)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`max_cycles` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Stop after this many cycles; omit or null for unlimited</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`budget_usdc` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Stop once this much USDC has been spent; omit or null for no cap</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stop` <span class="api-param__type">[StrategyStopRules](schemas.md#strategystoprules)</span></div>
<div class="api-param__desc" markdown="span">Stop conditions the campaign watches on its own, besides an explicit stop/kill</div>
</div>
</div>

### Headers

| Header | | |
|---|---|---|
| `X-API-KEY` | string | <span class="api-req">required</span> |
| `X-TIMESTAMP` | int64 ms | <span class="api-req">required</span> |
| `X-SIGN` | string | <span class="api-req">required</span> |
| `X-RECV-WINDOW` | int, default 5000 | |

### Responses

| | |
|---|---|
| <span class="api-status api-status--ok">201</span> | The campaign, started |
| <span class="api-status api-status--err">400</span> | Invalid parameter, or the leverage guard rejected the combination, `{"code", "error", "errors"?}` |
| <span class="api-status api-status--err">401</span> | Unauthorized: missing or unknown API key |
| <span class="api-status api-status--err">403</span> | Forbidden: the API key is read-only, or the paper_farm_bot feature is not enabled for this team, `{"code", "error", "errors"?}` |
| <span class="api-status api-status--err">409</span> | The team already has an active campaign, `{"code", "error", "errors"?}` |
| <span class="api-status api-status--err">429</span> | Rate limit exceeded, retry later, `{"code", "error", "errors"?}` |
| <span class="api-status api-status--err">503</span> | The strategies service is unavailable, `{"code", "error", "errors"?}` |

### Response fields — [StrategyCampaign](schemas.md#strategycampaign)

<div class="api-params" markdown>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`id` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">Campaign id (UUID)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`type` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">Campaign type; today always paper_farm</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`status` <span class="api-param__type">enum</span></div>
<div class="api-param__desc" markdown="span">running \| paused \| stopped \| done \| error — `running`, `paused`, `stopped`, `done`, `error`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stopping` <span class="api-param__type">boolean</span></div>
<div class="api-param__desc" markdown="span">A graceful stop or a hard kill is under way. Independent of status: can be true while status stays error (the open legs are being closed before the campaign reaches stopped)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`phase` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">Cycle phase the runner is in: idle, opening, open, closing or settling</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stop_reason` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">Why a stopped/done campaign ended: cycles_done, budget_spent, session_key_expiring, queued_share, user_stop or user_kill. Empty while still running</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`cycles_done` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Cycles completed so far</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`cycles_planned` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">max_cycles from create, or null for unlimited</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`paper_minted` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Total PAPER minted by this campaign's losing legs</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`usdc_converted` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Total USDC spent converting minted PAPER (haircut + fee)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`queued_usdc` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Profit queued to fund a future cycle's margin instead of being paid out</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`haircut_paid` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Total haircut paid converting PAPER to USDC</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`fees_paid` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Total trading fees paid by this campaign</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs` <span class="api-param__type">array[[StrategyCampaignLeg](schemas.md#strategycampaignleg)]</span></div>
<div class="api-param__desc" markdown="span">Open legs of the current cycle (0 while idle, up to 2 while open)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].position_id` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">The venue's position id, or null while the open is still unconfirmed</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].side` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">long or short</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].entry` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Entry (mark) price the leg opened at</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].move_pct` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Signed move since entry, in percent, from this leg's point of view</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].bust` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">This leg's liquidation (bust) price</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].size` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Position size</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].margin` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Margin posted for this leg, in USDC</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].leverage` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Leverage of this leg</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].mark_price` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Latest mark price used to watch this leg</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].parent_order_id` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">The order id that opened this leg</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`current_legs[].opened_at` <span class="api-param__type">date-time</span></div>
<div class="api-param__desc" markdown="span">UTC time the leg opened, ISO 8601</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`last_cycle` <span class="api-param__type">[StrategyCampaignCycle](schemas.md#strategycampaigncycle)</span></div>
<div class="api-param__desc" markdown="span">The campaign's most recently closed cycle</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`last_cycle.pnl_usdc` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Net result of the cycle, in USDC (can be negative)</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`last_cycle.paper` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">PAPER minted by the losing leg of this cycle</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`last_cycle.closed_at` <span class="api-param__type">date-time</span></div>
<div class="api-param__desc" markdown="span">UTC time both legs were closed, ISO 8601</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`last_cycle.multileg_order_id` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">The multileg (or paired single) order id the close went through, when known</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`last_error` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">Why the campaign is in error; empty otherwise</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`symbol` <span class="api-param__type">string</span></div>
<div class="api-param__desc" markdown="span">Anboto symbol being farmed, e.g. BTC/USDC:USDC</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`leverage` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Leverage of each leg</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`margin_per_leg` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Margin posted per leg at the start of a cycle, in USDC</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`target_move_bps` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Winning-leg move, in basis points, that closes the cycle</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`budget_usdc` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">budget_usdc from create, or null for no spend cap</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stop` <span class="api-param__type">[StrategyStopRules](schemas.md#strategystoprules)</span></div>
<div class="api-param__desc" markdown="span">Stop conditions the campaign watches on its own, besides an explicit stop/kill</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stop.queued_share_pct` <span class="api-param__type">number</span></div>
<div class="api-param__desc" markdown="span">Stop once this percent (0-100) of a new cycle's margin would come from queued profit rather than fresh budget. Null or omitted: off</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stop.stop_before_key_expiry` <span class="api-param__type">boolean</span></div>
<div class="api-param__desc" markdown="span">Stop gracefully once the Papertrade session key has under an hour left, rather than risk a cycle stuck open past expiry</div>
<div class="api-param__meta" markdown="span">Default: `true`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stop.hard_kill_on_stop` <span class="api-param__type">boolean</span></div>
<div class="api-param__desc" markdown="span">If a stop rule fires mid-cycle, close both legs at market now instead of waiting for the target</div>
<div class="api-param__meta" markdown="span">Default: `false`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`created_at` <span class="api-param__type">date-time</span></div>
<div class="api-param__desc" markdown="span">UTC time the campaign was created, ISO 8601</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`started_at` <span class="api-param__type">date-time</span></div>
<div class="api-param__desc" markdown="span">UTC time the campaign started, ISO 8601</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`stopped_at` <span class="api-param__type">date-time</span></div>
<div class="api-param__desc" markdown="span">UTC time the campaign stopped, ISO 8601, or null while still running</div>
</div>
</div>

</div>
<div class="api-code" markdown>

=== "Shell"

    ```bash
    body='{
      "type": "string",
      "exchange_id": "string",
      "symbol": "BTC/USDC:USDC",
      "leverage": 0,
      "margin_per_leg": 0.0,
      "target_move_bps": 0,
      "max_cycles": 0,
      "budget_usdc": 0.0,
      "stop": {
        "queued_share_pct": 0.0,
        "stop_before_key_expiry": true,
        "hard_kill_on_stop": true
      }
    }'

    curl -X POST "$BASE/api/v2/strategies/campaigns/create" \
      -H "X-API-KEY: $API_KEY" -H "X-TIMESTAMP: $ts" \
      -H "X-SIGN: $sign" \
      -H "Content-Type: application/json" -d "$body"
    ```

=== "Python"

    ```python
    payload = {
      "type": "string",
      "exchange_id": "string",
      "symbol": "BTC/USDC:USDC",
      "leverage": 0,
      "margin_per_leg": 0.0,
      "target_move_bps": 0,
      "max_cycles": 0,
      "budget_usdc": 0.0,
      "stop": {
        "queued_share_pct": 0.0,
        "stop_before_key_expiry": true,
        "hard_kill_on_stop": true
      }
    }

    r = requests.post(f"{BASE}/api/v2/strategies/campaigns/create",
        data=json.dumps(payload)
        headers=signed_headers(payload))
    print(r.json())
    ```

=== "Rust"

    ```rust
    let payload = serde_json::json!({
      "type": "string",
      "exchange_id": "string",
      "symbol": "BTC/USDC:USDC",
      "leverage": 0,
      "margin_per_leg": 0.0,
      "target_move_bps": 0,
      "max_cycles": 0,
      "budget_usdc": 0.0,
      "stop": {
        "queued_share_pct": 0.0,
        "stop_before_key_expiry": true,
        "hard_kill_on_stop": true
      }
    });

    let resp = client
        .post(format!("{BASE}/api/v2/strategies/campaigns/create"))
        .headers(signed_headers(&payload))
        .json(&payload)
        .send()?;
    println!("{}", resp.text()?);
    ```

=== "Go"

    ```go
    payload := map[string]any{
    	"type": "string",
    	"exchange_id": "string",
    	"symbol": "BTC/USDC:USDC",
    	"leverage": 0,
    	"margin_per_leg": 0.0,
    	"target_move_bps": 0,
    	"max_cycles": 0,
    	"budget_usdc": 0.0,
    	"stop": map[string]any{
    		"queued_share_pct": 0.0,
    		"stop_before_key_expiry": true,
    		"hard_kill_on_stop": true,
    	},
    }
    body, _ := json.Marshal(payload)

    req, _ := http.NewRequest("POST", BASE+"/api/v2/strategies/campaigns/create", bytes.NewReader(body))
    for k, v := range signedHeaders(string(body)) {
    	req.Header.Set(k, v)
    }
    req.Header.Set("Content-Type", "application/json")
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
    	log.Fatal(err)
    }
    defer resp.Body.Close()
    io.Copy(os.Stdout, resp.Body)
    ```

=== "Java"

    ```java
    String jsonBody = mapper.writeValueAsString(payload);
    HttpResponse<String> resp = client.send(
        signedPost("/api/v2/strategies/campaigns/create", jsonBody),
        HttpResponse.BodyHandlers.ofString());
    ```

=== "TypeScript"

    ```typescript
    const payload: CreateStrategyCampaignRequest = {
      "type": "string",
      "exchange_id": "string",
      "symbol": "BTC/USDC:USDC",
      "leverage": 0,
      "margin_per_leg": 0.0,
      "target_move_bps": 0,
      "max_cycles": 0,
      "budget_usdc": 0.0,
      "stop": {
        "queued_share_pct": 0.0,
        "stop_before_key_expiry": true,
        "hard_kill_on_stop": true
      }
    };

    const res = await fetch(`${BASE}/api/v2/strategies/campaigns/create`, {
      method: "POST",
      headers: signedHeaders(payload),
      body: JSON.stringify(payload),
    });
    const data: StrategyCampaign = await res.json();
    ```

=== "Kotlin"

    ```kotlin
    val jsonBody = mapper.writeValueAsString(payload)
    val request = signedPost("/api/v2/strategies/campaigns/create", jsonBody)
    val response = client.send(request, HttpResponse.BodyHandlers.ofString())
    println(response.body())
    ```

=== "C++"

    ```cpp
    std::string body = R"({
      "type": "string",
      "exchange_id": "string",
      "symbol": "BTC/USDC:USDC",
      "leverage": 0,
      "margin_per_leg": 0.0,
      "target_move_bps": 0,
      "max_cycles": 0,
      "budget_usdc": 0.0,
      "stop": {
        "queued_share_pct": 0.0,
        "stop_before_key_expiry": true,
        "hard_kill_on_stop": true
      }
    })";

    cpr::Response r = cpr::Post(
        cpr::Url{BASE + "/api/v2/strategies/campaigns/create"},
        signedHeaders(body),
        cpr::Header{{"Content-Type", "application/json"}},
        cpr::Body{body});
    std::cout << r.text << std::endl;
    ```

=== "JavaScript"

    ```javascript
    const payload = {
      "type": "string",
      "exchange_id": "string",
      "symbol": "BTC/USDC:USDC",
      "leverage": 0,
      "margin_per_leg": 0.0,
      "target_move_bps": 0,
      "max_cycles": 0,
      "budget_usdc": 0.0,
      "stop": {
        "queued_share_pct": 0.0,
        "stop_before_key_expiry": true,
        "hard_kill_on_stop": true
      }
    };

    const res = await fetch(`${BASE}/api/v2/strategies/campaigns/create`, {
      method: "POST",
      headers: signedHeaders(payload),
      body: JSON.stringify(payload),
    });
    console.log(await res.json());
    ```

<div class="api-response" markdown>

**Response** <span class="api-status api-status--ok">201</span>

```json
{
  "id": "string",
  "type": "string",
  "status": "running",
  "stopping": true,
  "phase": "string",
  "stop_reason": "string",
  "cycles_done": 0,
  "cycles_planned": 0,
  "paper_minted": 0.0,
  "usdc_converted": 0.0,
  "queued_usdc": 0.0,
  "haircut_paid": 0.0,
  "fees_paid": 0.0,
  "current_legs": [
    {
      "position_id": "string",
      "side": "string",
      "entry": 0.0,
      "move_pct": 0.0,
      "bust": 0.0,
      "size": 0.0,
      "margin": 0.0,
      "leverage": 0,
      "mark_price": 0.0,
      "parent_order_id": "string",
      "opened_at": "string"
    }
  ],
  "last_cycle": {
    "pnl_usdc": 0.0,
    "paper": 0.0,
    "closed_at": "string",
    "multileg_order_id": "string"
  },
  "last_error": "string",
  "symbol": "string",
  "leverage": 0,
  "margin_per_leg": 0.0,
  "target_move_bps": 0,
  "budget_usdc": 0.0,
  "stop": {
    "queued_share_pct": 0.0,
    "stop_before_key_expiry": true,
    "hard_kill_on_stop": true
  },
  "created_at": "string",
  "started_at": "string",
  "stopped_at": "string"
}
```

</div>
</div>
</div>
