> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beliefsystems.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Your first request

> Mint a key, read a Belief index level, and chart the trailing window – in curl, Python, or JavaScript.

<Steps>
  <Step title="Mint a key">
    Create an account and mint a key at [beliefsystems.xyz/data](https://beliefsystems.xyz/data/signup?source=docs-quickstart). Free, work email, no password, about a minute.

    The secret is shown once. Put it in your environment:

    ```bash theme={null}
    export BELIEF_API_KEY="belief_live_..."
    ```
  </Step>

  <Step title="Call the service index">
    `GET /v1` is the cheapest way to confirm a key works. It answers with every endpoint, the free-tier limits, and your own remaining quota.

    ```bash theme={null}
    curl -s https://api.beliefsystems.xyz/v1 \
      -H "Authorization: Bearer $BELIEF_API_KEY"
    ```

    ```json theme={null}
    {
      "data": {
        "version": "v1",
        "limits": {
          "requestsPerMinute": 60,
          "requestsPerDay": 2000,
          "historyMaxDays": 90,
          "intervals": ["1h", "1d"]
        },
        "key": {
          "prefix": "belief_live_a1b2c3d4",
          "limitMinute": 60,
          "limitDay": 2000,
          "remainingMinute": 59,
          "remainingDay": 1873
        }
      }
    }
    ```

    A `401` here means the key is wrong, not that the endpoint is. Check [`invalid_api_key`](/api-reference/limits#invalid-api-key).
  </Step>

  <Step title="Read a level">
    `CONFLICT` is the Belief Global Conflict Risk Escalation Expectations Index. `GET /v1/indices` lists every published ticker.

    <CodeGroup>
      ```bash curl theme={null}
      curl -s https://api.beliefsystems.xyz/v1/indices/CONFLICT/latest \
        -H "Authorization: Bearer $BELIEF_API_KEY"
      ```

      ```python Python theme={null}
      import os
      import requests

      resp = requests.get(
          "https://api.beliefsystems.xyz/v1/indices/CONFLICT/latest",
          headers={"Authorization": f"Bearer {os.environ['BELIEF_API_KEY']}"},
          timeout=10,
      )
      resp.raise_for_status()

      latest = resp.json()["data"]
      print(latest["ticker"], latest["indexLevel"], latest["computedAt"])
      ```

      ```javascript JavaScript theme={null}
      const res = await fetch("https://api.beliefsystems.xyz/v1/indices/CONFLICT/latest", {
        headers: { Authorization: `Bearer ${process.env.BELIEF_API_KEY}` },
      });
      if (!res.ok) throw new Error(`Belief Systems API ${res.status}`);

      const { data } = await res.json();
      console.log(data.ticker, data.indexLevel, data.computedAt);
      ```
    </CodeGroup>

    ```json theme={null}
    {
      "data": {
        "ticker": "CONFLICT",
        "name": "Belief Global Conflict Risk Escalation Expectations Index",
        "computedAt": "2026-08-31T13:44:44.963697Z",
        "indexLevel": "36.11697608",
        "baseIndexLevel": "100.00000000",
        "stale": false,
        "publicStatus": "active",
        "maturityType": "PERPETUAL",
        "methodologyVersion": "midprice-v1",
        "dataQuality": {
          "freshMarketsCount": 24,
          "staleMarketsCount": 0,
          "totalMarketsCount": 24,
          "freshDataPct": 100.0
        }
      },
      "meta": {
        "attribution": "Source: Belief Systems (beliefsystems.xyz)",
        "generatedAt": "2026-08-31T14:01:28.178537Z"
      }
    }
    ```

    Every index is based at 100 on its inception date, so a level reads on its own: `CONFLICT` at 36.12 is down 63.9% since inception.

    `indexLevel` is a decimal **string**, not a number. Parse it with a decimal type – see [Conventions](/api-reference/conventions#levels-are-decimal-strings).
  </Step>

  <Step title="Chart the trailing window">
    History reaches back 90 days, at `1h` or `1d`. With no parameters you get the full window at `1d`.

    <CodeGroup>
      ```bash curl theme={null}
      curl -s "https://api.beliefsystems.xyz/v1/indices/CONFLICT/history?interval=1d" \
        -H "Authorization: Bearer $BELIEF_API_KEY"
      ```

      ```python Python theme={null}
      import os
      from decimal import Decimal

      import requests

      resp = requests.get(
          "https://api.beliefsystems.xyz/v1/indices/CONFLICT/history",
          params={"interval": "1d"},
          headers={"Authorization": f"Bearer {os.environ['BELIEF_API_KEY']}"},
          timeout=10,
      )
      resp.raise_for_status()
      payload = resp.json()

      points = payload["data"]["points"]
      first, last = Decimal(points[0]["indexLevel"]), Decimal(points[-1]["indexLevel"])
      change = (last / first - 1) * 100

      # Label the chart with what you were served, not what you asked for.
      window = payload["meta"]
      print(f"{window['effectiveStart']} to {window['effectiveEnd']}: {change:+.2f}%")
      ```

      ```javascript JavaScript theme={null}
      const url = new URL("https://api.beliefsystems.xyz/v1/indices/CONFLICT/history");
      url.searchParams.set("interval", "1d");

      const res = await fetch(url, {
        headers: { Authorization: `Bearer ${process.env.BELIEF_API_KEY}` },
      });
      if (!res.ok) throw new Error(`Belief Systems API ${res.status}`);

      const { data, meta } = await res.json();
      const first = Number(data.points.at(0).indexLevel);
      const last = Number(data.points.at(-1).indexLevel);

      // Label the chart with what you were served, not what you asked for.
      console.log(meta.effectiveStart, meta.effectiveEnd, `${((last / first - 1) * 100).toFixed(2)}%`);
      ```
    </CodeGroup>

    A `start` older than 90 days is clamped, not rejected, so a chart that asked for a year still renders. `meta.clamped` tells you it happened and `meta.effectiveStart` tells you where the data really begins. Read them before labeling an axis.
  </Step>
</Steps>

## Where to go next

<CardGroup cols={2}>
  <Card title="Conventions" icon="ruler" href="/api-reference/conventions">
    Decimal strings, timestamps, staleness, and clamping – the four things that surprise people.
  </Card>

  <Card title="Limits and errors" icon="gauge" href="/api-reference/limits">
    60 per minute, 2,000 per day, and how to back off correctly.
  </Card>

  <Card title="Belief Volatility" icon="wave-square" href="/volatility/methodology">
    What the volatility series measure and how to quote one.
  </Card>

  <Card title="Snapshot bundles" icon="download" href="/data-access/downloads">
    Full history since inception, composition, and weights, as free CSVs.
  </Card>
</CardGroup>

## Common first errors

| What you see              | What it means                                                                                                        |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `401 invalid_api_key`     | No key, a typo, or a key that was rotated or revoked                                                                 |
| `404 not_found`           | The ticker is not on this surface. `GET /v1/indices` is the catalog                                                  |
| `422 invalid_interval`    | `interval` must be `1h` or `1d`                                                                                      |
| `429 rate_limited`        | Sleep for `Retry-After` seconds, which is exact                                                                      |
| CORS failure in a browser | Expected. This API is server-to-server – see [Authentication](/api-reference/authentication#keys-belong-on-a-server) |
