*** title: Introduction slug: introduction ------------------ 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) | | Emails | Email sender management | | 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://api.hublinks.io/rest/accounts/{account_id}/campaigns X-API-KEY: ``` **Agency key** - access any account within your agency: ``` GET https://api.hublinks.io/rest/agency/accounts/{account_id}/campaigns X-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=` in your next request. 3. Repeat until `last_key` is `null` - you have fetched all results.