# 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 %}
