***

title: Introduction
slug: introduction
---------------------

For clean Markdown of any page, append .md to the page URL. For a complete documentation index, see https://api.alsona.com/llms.txt. For full documentation content, see https://api.alsona.com/llms-full.txt.

Welcome to the **Alsona REST API**! Let’s walk through a quick setup to get you.

**API version:** v1 (REST)

## Groups

| Group             | Description                                                |
| ----------------- | ---------------------------------------------------------- |
| Account           | Retrieve and manage account details                        |
| Agency            | Cross-account access via a single Agency API key           |
| Campaigns         | Create, update, list, and delete outreach campaigns        |
| Campaign Profiles | Manage individual LinkedIn profiles inside campaigns       |
| Filters           | Define targeting rules (one filter group per seat)         |
| Integrations      | Connect third-party CRMs (HubSpot, Salesforce, etc.)       |
| Inbox > Email     | Read and manage email inbox threads and messages           |
| Inbox > LinkedIn  | Read and manage LinkedIn inbox threads and messages        |
| Logs              | Audit logs for seat-profile activity                       |
| Stats             | Aggregated activity metrics (DAY / HOUR / MIN granularity) |
| Templates         | Reusable workflow templates scoped by `group`              |

## Authentication

Two auth patterns are supported - both use the `X-API-KEY` request header.

**Account key** - scoped to a single account:

```
GET https://alsona.com/rest/accounts/{account_id}/campaigns
X-API-KEY: <account_api_key>
```

**Agency key** - access any account within your agency:

```
GET https://alsona.com/rest/agency/accounts/{account_id}/campaigns
X-API-KEY: <agency_api_key>
```

The Agency key does **not** aggregate across accounts - you must specify `account_id` in the path. Both key types produce the same response for account-scoped endpoints.

## Pagination

List endpoints support cursor-based pagination via the `last_key` query parameter:

1. Make the initial request without `last_key`.
2. If the response includes a non-null `last_key`, URL-encode it and pass it as `?last_key=<value>` in your next request.
3. Repeat until `last_key` is `null` - you have fetched all results.