> ## 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.

# Data API

> The keyed REST surface for Belief index levels and Belief Volatility series – base URL, authentication, the response envelope, and a first call in curl, Python, or JavaScript.

**Base URL:** `https://api.beliefsystems.xyz`
**Authentication:** `Authorization: Bearer belief_live_…`

## Quickstart

<Steps>
  <Step title="Get a key">
    Create an account and [mint a key](https://beliefsystems.xyz/data/signup?source=docs-quickstart) in the portal. Free, work email, about a minute. The secret is shown once.
  </Step>

  <Step title="Make a request">
    <CodeGroup>
      ```bash curl theme={null}
      export BELIEF_API_KEY="belief_live_…"

      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>

    `X-API-Key` is accepted for the same secret. `Authorization: Bearer` is the canonical form and the one every example here uses.
  </Step>

  <Step title="Read the envelope">
    Every successful response is `{ data, meta }`. `data` is the payload; `meta` carries the attribution line, the license and terms URLs, and the moment the response was generated. History endpoints add the effective window to `meta`.

    ```json theme={null}
    {
      "data": {
        "ticker": "CONFLICT",
        "name": "Belief Global Conflict Risk Escalation Expectations Index",
        "computedAt": "2026-08-29T23:05:31.969917Z",
        "indexLevel": "35.47662726",
        "baseIndexLevel": "100.00000000",
        "stale": false,
        "publicStatus": "active",
        "maturityType": "PERPETUAL",
        "compositionVersion": "24ecfc71d2ddb86c",
        "methodologyVersion": "midprice-v1",
        "inceptionAt": "2026-04-24T13:38:30.565565Z",
        "seriesPartiallyResolved": true,
        "seriesFullyResolved": false,
        "resolvedAt": null,
        "ceasedAt": null,
        "dataQuality": {
          "freshMarketsCount": 24,
          "staleMarketsCount": 0,
          "totalMarketsCount": 24,
          "freshDataPct": 100.0
        }
      },
      "meta": {
        "attribution": "Source: Belief Systems (beliefsystems.xyz)",
        "license": "https://beliefsystems.xyz/license",
        "termsUrl": "https://beliefsystems.xyz/terms",
        "generatedAt": "2026-08-29T23:07:04.118204Z"
      }
    }
    ```

    Levels are decimal strings, not JSON numbers – `"35.47662726"` rather than `35.47662726`. They are exact as published, so parse them with a decimal type wherever the arithmetic has to round-trip. Timestamps are UTC with microsecond precision. Every index carries `baseIndexLevel` 100 at inception, which is what makes a level readable on its own: in the response above, `CONFLICT` at 35.48 is down 64.5% from its inception base.&#x20;
  </Step>
</Steps>

`Source: Belief Systems (beliefsystems.xyz)` belongs on anything you publish from this data. It travels in `meta.attribution` on every response.

<Warning>
  `/v1` answers cross-origin preflights only for Belief Systems' own origins, so browser JavaScript on your domain will fail. Treat it as server-to-server: call it from your backend, which is also where the key belongs – a key shipped to a browser is a published key. Non-production environments allow `localhost`, so a prototype that works against staging will not work in production.
</Warning>

There is no test mode. The API is read-only, so a live key is safe to use in development.

## Endpoints

| Endpoint                                   | Returns                                                                                                         |
| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------- |
| `GET /v1`                                  | Service index: every endpoint, the free-tier limits, and a `key` block with your own limits and remaining quota |
| `GET /v1/indices`                          | The index catalog – ticker, name, publication status, last computation, staleness                               |
| `GET /v1/indices/{ticker}/latest`          | Latest level, undelayed, with data-quality counts                                                               |
| `GET /v1/indices/{ticker}/history`         | Level history. `start`, `end`, and `interval` (`1h` or `1d`) are all optional                                   |
| `GET /v1/indices/{ticker}/reconstitutions` | Completed composition changes, newest first                                                                     |
| `GET /v1/volatility`                       | The Belief Volatility catalog                                                                                   |
| `GET /v1/volatility/{ticker}/latest`       | Latest computed tick and latest published value                                                                 |
| `GET /v1/volatility/{ticker}/history`      | Belief Volatility history, newest first                                                                         |
| `GET /v1/downloads`                        | Where the full-depth [snapshot bundles](/data-access/downloads) live                                            |

Each endpoint's parameters, with a try-it panel, are in the API Reference tab. Tickers are case-insensitive; `GET /v1/indices` is the catalog.

<Note>
  The volatility endpoints return the envelope of the published `/volatility` surface verbatim – `series`, `publicationState`, `tick`, `published` inside `data` – rather than the flatter shape the index endpoints use. The website, the MCP tools, and `/v1` all read the same structure, so a Belief Volatility value quoted from one channel always matches the other two. [Belief Volatility methodology](/volatility/methodology) defines each field.
</Note>

## Next

<CardGroup cols={3}>
  <Card title="Limits and errors" icon="gauge" href="/data-access/data-api-limits">
    Rate limits, the header set, error codes, and the 90-day window.
  </Card>

  <Card title="Data boundaries" icon="signs-post" href="/data-access/data-api-boundaries">
    What the API serves, where the rest lives, and how `/v1` changes.
  </Card>

  <Card title="MCP server" icon="plug" href="/data-access/mcp-server">
    The same data as tools, on the same key.
  </Card>
</CardGroup>
