# Ideas, conveyor and balance

> Everything in one call: the account's ideas with their stages and results, the idea holding the conveyor, and the credit balance. Free.

Source: https://firmtape.com/docs/developers/lab/state

Everything in one call: the account's ideas with their stages and results, the idea holding the conveyor, and the credit balance. Free.

`GET /api/lab/state`

Plan LAB · Key scope lab · Limit Credits; one idea on the conveyor at a time · Version 1.0.0 · Since 2026-08-12

**This endpoint serves:** [LAB: LAB from a script](https://firmtape.com/docs/lab#lab-api), [LAB: Credits and tokens](https://firmtape.com/docs/lab#credits-and-tokens). **Plan:** [LAB](https://firmtape.com/features/lab). LAB credits: developing an idea is free, a backtest or an optimize pass is one credit, the desk is free once an idea is tested. LIVE includes 5 credits a month.

## Response

The state.

| Field | Meaning | Unit |
| --- | --- | --- |
| `ideas` (array) | `{ id, name, stage, spec, results }`. |  |
| `conveyor` (string \| null) | The idea holding the conveyor. |  |
| `balance` (object) | `{ monthly, purchased, total }` credits. |  |

## Errors

| Status | Code | What to do |
| --- | --- | --- |
| 401 |  | No key, or an unknown or revoked one. Send a `lab` key. |

## Request

```sh
curl \
  -H "Authorization: Bearer $FIRMTAPE_LAB_KEY" \
  "https://firmtape.com/api/lab/state"
```

```python
import os, requests

H = {"Authorization": f"Bearer {os.environ['FIRMTAPE_LAB_KEY']}"}
r = requests.get("https://firmtape.com/api/lab/state", headers=H)
print(r.status_code, r.text[:500])
```

```js
const r = await fetch("https://firmtape.com/api/lab/state", {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.FIRMTAPE_LAB_KEY}` },
});
console.log(r.status, await r.text());
```

## Example response

```json
{
  "ideas": [],
  "conveyor": null,
  "balance": {
    "monthly": 5,
    "purchased": 0,
    "total": 5
  }
}
```

## Changes

- 2026-08-12: Added.
