> Source: https://wexa.ai/docs/get-started/quickstart

# Quickstart

This quickstart takes you from nothing to one successful call to Wexa, in Python, TypeScript or REST.

You need a Wexa project and an administrator role on it, so that you can create a key. Python needs 3.9 or later and TypeScript needs Node 18 or later; REST needs only `curl`.

## How it works

1. You create an API key, pinned to one project.
2. The client sends the key as a bearer token to `https://fabric.wexa.ai`.
3. Wexa reads your scope from the key and returns the result.

## Step 1: Get an API key

In the console, pick your project in the project switcher, open **Settings → Developer access**, choose the **API keys** tab and click **Create key**. A Simple-only role sees **Generate API key** in Simple mode instead. Copy the secret when it is shown, because it is never shown again.

Then export the key and the workspace URL. Both SDKs read these two names. `WEXA_WORKSPACE` is the host URL, not a project id: the key is pinned to your project, so you never pass one.

```bash
export WEXA_WORKSPACE="https://fabric.wexa.ai"
export WEXA_API_KEY="fab_sk_..."
```

To create a key over REST instead, or to see which roles can, read [Authentication](/docs/get-started/authentication#create-an-api-key).

## Step 2: Install

REST has nothing to install, so go straight to step 3.

**Install an SDK**

**Python SDK**

```bash
pip install wexa
```

**TypeScript SDK**

```bash
npm install @wexa-fabric/sdk
```

## Step 3: Make one call

The `docs` tool is registered in every deployment and needs no data in your project. It returns your own scope and limits, so a success proves the key and its scope together.

**Call the docs tool**

**Python SDK**

```python
from wexa import Fabric

fabric = Fabric()

result = fabric.docs(topic="governance")
print(result["mode"])
print(result["quota"])
```

```text
auto
{'org_window_max': 600, 'org_window_used': 1, 'project_window_max': 120, 'project_window_used': 1}
```

**TypeScript SDK**

```typescript
// Top-level await: save as .mjs, or set "type": "module" in package.json.
import { Fabric } from '@wexa-fabric/sdk'

const fabric = new Fabric()

const result = await fabric.docs({ topic: 'governance' })
console.log(result.mode)
console.log(JSON.stringify(result.quota))
```

```text
auto
{"org_window_max":600,"org_window_used":4,"project_window_max":120,"project_window_used":4}
```

**REST API**

```bash
curl -sS -X POST https://fabric.wexa.ai/v1/docs \
  -H "Authorization: Bearer $WEXA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"topic": "governance"}'
```

```json
{
  "lifecycle_id": "qlc_...",
  "result": {
    "mode": "auto",
    "quota": {
      "org_window_max": 600,
      "org_window_used": 7,
      "project_window_max": 120,
      "project_window_used": 7
    }
  }
}
```

That is a successful call. `mode` is your project mode, where `auto` is Simple mode, and `quota` is your rolling call budget for the project and the organization.

The SDKs return the `result` directly. REST wraps it in an envelope with a `lifecycle_id`, which names the governance record of the call.

If it fails:

- **401, `AuthError` in Python:** no key was sent (`missing bearer credential`), or it is wrong or revoked (`api key invalid or revoked`). Create a new key; see [Authentication](/docs/get-started/authentication#create-an-api-key).
- **`token invalid`:** the key does not start with `fab_sk_`, so it is not an API key. Copy the secret again; see [Authentication](/docs/get-started/authentication#limits-and-behavior).
- **`ConfigurationError` in Python:** `WEXA_WORKSPACE` or `WEXA_API_KEY` is not set in this shell. Export both from step 1; see [Authentication](/docs/get-started/authentication#make-your-first-signed-request).

## What's next

- [Core ideas](/docs/get-started/core-ideas): scope, and why you never pass a project.
- [Using the Python SDK](/docs/sdks-and-apis/python-sdk) or [Using the TypeScript SDK](/docs/sdks-and-apis/typescript-sdk): writes, approvals, retry and errors.
- [How every tool call works](/docs/sdks-and-apis/how-every-tool-call-works): tool names on each surface, the return shape, governance and errors.
