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

# Quickstart

> Mint a key, make your first request, parse the response.

This walkthrough takes about five minutes. By the end you'll have an API key, a successful request, and enough scaffolding to start exploring the rest of the catalog. Test update

## 1. Get a key

Sign in to the [developer portal](https://developers.elestrals.com), accept the Developer Agreement, and mint a Free key from your dashboard.

<Info>
  The raw key is shown **once**, at creation. Copy it into your password manager or an environment variable immediately — the portal stores only a hash, so a key you didn't save is a key you have to revoke and replace.
</Info>

A live key looks like this:

```
elestrals_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

Anything starting with `elestrals_test_` is reserved for a future sandbox; only `live` keys work today.

## 2. Make a request

Pass your key as a Bearer token. Keys in query strings are rejected.

<CodeGroup>
  ```bash curl theme={"dark"}
  curl https://api.elestrals.com/v1/cards/et-100 \
    -H "Authorization: Bearer $ELESTRALS_KEY"
  ```

  ```javascript Node.js theme={"dark"}
  const res = await fetch('https://api.elestrals.com/v1/cards/et-100', {
    headers: { Authorization: `Bearer ${process.env.ELESTRALS_KEY}` },
  });
  const { data } = await res.json();
  console.log(data.name); // "Waspivy"
  ```

  ```python Python theme={"dark"}
  import os, requests

  res = requests.get(
      "https://api.elestrals.com/v1/cards/et-100",
      headers={"Authorization": f"Bearer {os.environ['ELESTRALS_KEY']}"},
  )
  print(res.json()["data"]["name"])  # "Waspivy"
  ```
</CodeGroup>

## 3. Read the response

Every successful response uses the same envelope:

```json theme={"dark"}
{
  "data": { "id": "et-100", "name": "Waspivy", "...": "..." },
  "pagination": { "next_cursor": null, "has_more": false },
  "meta": { "request_id": "req_01H...", "cached": false, "attribution_required": true }
}
```

* `data` is the resource (object) or list (array).
* `pagination` is present on list endpoints; cursor-based, max `limit=250`. Single-resource endpoints return `null`/`false`.
* `meta.request_id` is the value to quote in any support ticket.
* `meta.cached` tells you whether the edge served the response.

## 4. Watch your headers

Every authenticated response carries rate-limit context:

```
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1714512000
```

When you exceed your per-minute or monthly budget, the API returns `429 Too Many Requests` with a `Retry-After` header and an error body that names which limit was hit:

```json theme={"dark"}
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded: 60 requests per minute on the free tier.",
    "request_id": "req_01H...",
    "docs_url": "https://docs.elestrals.com/errors/rate_limit_exceeded"
  }
}
```

## What's next

<CardGroup cols={2}>
  <Card title="Browse the reference" icon="book" href="/api-reference">
    Every endpoint, parameter, and response shape.
  </Card>

  <Card title="Apply for Partner" icon="handshake" href="https://developers.elestrals.com/apply">
    Higher limits, bulk export, set-release webhooks.
  </Card>
</CardGroup>
