# Authentication

## Overview

All calls to the Countercyclical API require authorization using a query parameter called `apiKey` in the API call. Here's what an example call might look like:

```
https://api.countercyclical.io/v1/investments?apiKey=ck_prod_dxjgVIbY...
```

{% hint style="info" %}
Each API key is associated to a member with in workspace. As such, users can only work with items within that workspace (along with what's available on their plan).
{% endhint %}

### Generating an API Key

Users can find their API tokens by going to [Settings -> Workspace -> Advanced -> Developers -> API Keys](https://dashboard.countercyclical.io/settings/workspace/advanced).

Each key you generate should look something like the following:

```
ck_prod_dxjgVIbY...
```

{% hint style="warning" %}
Be sure to take note of what your generated token is before closing the dialog as you will not be able to view it afterwards.&#x20;

We recommend storing this value as an environment variable.
{% endhint %}

### Best Practice: Rolling your API Keys

It's a good practice to roll your API keys once in a while for security purposes.

While we do not currently support "rerolling" the same API key, we recommend users generate a new API key with the same permissions they might otherwise have.&#x20;

To make this easier, you can select from the dropdown menu on the right-hand side of any one of your API keys and select the "Roll as New Key" option.

## Example

Here's an example of what a call to get a member's Investments might look like:

{% tabs %}
{% tab title="Express.js (API)" %}

```typescript
import axios, { AxiosResponse } from 'axios';
import { NextFunction, Request, Response, Router } from 'express';

const router = Router();

const apiKey = process.env.COUNTERCYCLICAL_API_KEY;

const countercyclicalAxiosInstance = axios.create({
    baseURL: 'https://api.countercyclical.io',
    params: {
        apiKey: apiKey,
    },
});

router.get('/v1/investments', async (req: Request, res: Response, next: NextFunction) => {
    try {
        await countercyclicalAxiosInstance
            .get('/v1/investments', { params: { limit: 6 } })
            .then((apiResponse: AxiosResponse) => {
                if (apiResponse.status === 200) {
                    return res.send(apiResponse.data);
                }
            });
    } catch (error) {
        console.error(error);
    }
});
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.countercyclical.io/developers/authentication.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
