# Campaigns

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

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

Newest first. `status` uses the public values this API reports, not the internal ones. **ApiKeyAuth** required.

### Query 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></div>
<div class="api-param__desc" markdown="span">Only this campaign type; today only 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">Only this status — `running`, `paused`, `stopped`, `done`, `error`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`limit` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Campaigns per page, 1-200 (default 20)</div>
<div class="api-param__meta" markdown="span">Default: `20`</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`offset` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Campaigns to skip (default 0)</div>
<div class="api-param__meta" markdown="span">Default: `0`</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">200</span> | A page of campaigns |
| <span class="api-status api-status--err">401</span> | Unauthorized: missing or unknown API key |
| <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 — [StrategyCampaignList](schemas.md#strategycampaignlist)

<div class="api-params" markdown>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`count` <span class="api-param__type">integer</span></div>
<div class="api-param__desc" markdown="span">Total campaigns matching the filter, across every page</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`campaigns` <span class="api-param__type">array[[StrategyCampaign](schemas.md#strategycampaign)]</span> <span class="api-req">required</span></div>
<div class="api-param__desc" markdown="span">This page's campaigns, newest first</div>
</div>
<div class="api-param" markdown>
<div class="api-param__head" markdown="span">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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">`campaigns[].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
    curl -X GET "$BASE/api/v2/strategies/campaigns?type=string" \
      -H "X-API-KEY: $API_KEY" -H "X-TIMESTAMP: $ts" \
      -H "X-SIGN: $sign"
    ```

=== "Python"

    ```python
    params = {"type": ..., "status": ..., "limit": ..., "offset": ...}
    r = requests.get(f"{BASE}/api/v2/strategies/campaigns",
        params=params
        headers=signed_headers_query(params))
    print(r.json())
    ```

=== "Rust"

    ```rust
    let resp = client
        .get(format!("{BASE}/api/v2/strategies/campaigns?type=string"))
        .headers(signed_headers_query(&params))
        .send()?;
    println!("{}", resp.text()?);
    ```

=== "Go"

    ```go
    req, _ := http.NewRequest("GET", BASE+"/api/v2/strategies/campaigns?type=string", nil)
    for k, v := range signedHeadersQuery(req.URL.Query()) {
    	req.Header.Set(k, v)
    }
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
    	log.Fatal(err)
    }
    defer resp.Body.Close()
    io.Copy(os.Stdout, resp.Body)
    ```

=== "Java"

    ```java
    HttpResponse<String> resp = client.send(
        signedGet("/api/v2/strategies/campaigns?type=string"),
        HttpResponse.BodyHandlers.ofString());
    ```

=== "TypeScript"

    ```typescript
    const res = await fetch(`${BASE}/api/v2/strategies/campaigns?type=string`, {
      method: "GET",
      headers: signedHeadersQuery(params),
    });
    const data: StrategyCampaignList = await res.json();
    ```

=== "Kotlin"

    ```kotlin
    val request = signedGet("/api/v2/strategies/campaigns?type=string")
    val response = client.send(request, HttpResponse.BodyHandlers.ofString())
    println(response.body())
    ```

=== "C++"

    ```cpp
    cpr::Response r = cpr::Get(
        cpr::Url{BASE + "/api/v2/strategies/campaigns?type=string"},
        signedHeadersQuery(params));
    std::cout << r.text << std::endl;
    ```

=== "JavaScript"

    ```javascript
    const res = await fetch(`${BASE}/api/v2/strategies/campaigns?type=string`, {
      method: "GET",
      headers: signedHeadersQuery(params),
    });
    console.log(await res.json());
    ```

<div class="api-response" markdown>

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

```json
{
  "count": 0,
  "campaigns": [
    {
      "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": [
        {}
      ],
      "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>
