---
title: "Campaign analytics"
method: GET
path: "/v1/campaigns/{id}/analytics"
tags: ["Analytics"]
---

# Campaign analytics

`GET /v1/campaigns/{id}/analytics`

## Request

- Base URL: `https://api.mailbeast.ai`
- URL: `https://api.mailbeast.ai/v1/campaigns/{id}/analytics`
- Auth: HTTP bearer

Aggregate engagement for one campaign. Ask for extra breakdowns with `breakdown=smtp,sequence,bounce` – each is an extra query, so request only what you will read.

Requires one of the following scopes: `metrics:read`, `all:read`, `all:all`.

## Path parameters

- `id` string, required

## Query parameters

- `startDate` string
- `endDate` string
- `excludeOOO` boolean
- `breakdown` string[]

## Response `200`

- CampaignAnalyticsApiResponseDto
  - `campaignId` string, required
  - `period` AnalyticsPeriodView, required
    - `start` string, required
    - `end` string, required
    - `clamped` boolean, required: true = your requested start was older than the plan retention window and was moved forward. The data you got is real but shorter than you asked for.
    - `retentionDays` number, required: Days of history your plan retains.
  - `totals` AnalyticsTotalsView, required
    - `sent` number, required: Emails handed to the provider.
    - `failed` number, required: Sends that permanently failed before delivery.
    - `delivered` number, required: Sent minus bounced.
    - `leadsContacted` number, required: Distinct leads that received at least one email.
    - `opens` EngagementCountView, required
      - `total` number, required: Opens/clicks counted per email (bots excluded): the same email opened twice counts once, two different steps count twice.
      - `uniqueLeads` number, required: Distinct leads who did this at least once.
    - `clicks` EngagementCountView, required
      - `total` number, required: Opens/clicks counted per email (bots excluded): the same email opened twice counts once, two different steps count twice.
      - `uniqueLeads` number, required: Distinct leads who did this at least once.
    - `replies` number, required: Distinct leads who replied.
    - `bounces` number, required: All bounces. Ask for `breakdown=bounce` to split hard/soft and by reason.
    - `unsubscribed` number, required: Unsubscribes in the window.
    - `positiveLeads` number, required: Leads currently in a positive state (interested / meeting / converted).
    - `conversions` number, required: Conversions attributed in the window.
    - `conversionValue` number, nullable: Total value of those conversions, in your workspace currency.
    - `rates` AnalyticsRatesView, required
      - `open` number, nullable, required: uniqueLeads opened / leads contacted.
      - `click` number, nullable, required: uniqueLeads clicked / leads contacted.
      - `reply` number, nullable, required: uniqueLeads replied / leads contacted.
      - `bounce` number, nullable, required: bounces / sent.
      - `delivery` number, nullable, required: delivered / sent.
      - `unsubscribe` number, nullable, required: unsubscribes / sent.
      - `conversion` number, nullable, required: conversions / leads contacted.
  - `bySmtp` SmtpBreakdownView[]: Present only when requested via `breakdown=smtp`.
    - `accountId` string, required
    - `email` string, nullable, required: Sending account address. null when the account name is unavailable.
    - `totals` BreakdownTotalsView, required
      - `sent` number, required
      - `delivered` number, required
      - `opens` EngagementCountView, required
        - `total` number, required: Opens/clicks counted per email (bots excluded): the same email opened twice counts once, two different steps count twice.
        - `uniqueLeads` number, required: Distinct leads who did this at least once.
      - `clicks` EngagementCountView, required
        - `total` number, required: Opens/clicks counted per email (bots excluded): the same email opened twice counts once, two different steps count twice.
        - `uniqueLeads` number, required: Distinct leads who did this at least once.
      - `replies` number, required: Distinct leads who replied.
      - `bounces` number, required
      - `positiveLeads` number, required: Leads currently in a positive state (interested / meeting / converted).
      - `conversions` number, required: Conversions attributed to this row.
      - `conversionValue` number, nullable: Total value of those conversions, in your workspace currency.
      - `rates` BreakdownRatesView, required
        - `open` number, nullable, required
        - `click` number, nullable, required
        - `reply` number, nullable, required
        - `bounce` number, nullable, required
        - `delivery` number, nullable, required
        - `positive` number, nullable, required: Share of replied leads whose status is positive now (interested / meeting / converted), %. null when nobody replied.
        - `conversion` number, nullable, required: conversions / leads contacted.
  - `bySequence` SequenceBreakdownView[]: Present only when requested via `breakdown=sequence`.
    - `step` number, required: Sequence step number.
    - `variant` string, required: A/B variant letter.
    - `totals` BreakdownTotalsView, required
      - `sent` number, required
      - `delivered` number, required
      - `opens` EngagementCountView, required
        - `total` number, required: Opens/clicks counted per email (bots excluded): the same email opened twice counts once, two different steps count twice.
        - `uniqueLeads` number, required: Distinct leads who did this at least once.
      - `clicks` EngagementCountView, required
        - `total` number, required: Opens/clicks counted per email (bots excluded): the same email opened twice counts once, two different steps count twice.
        - `uniqueLeads` number, required: Distinct leads who did this at least once.
      - `replies` number, required: Distinct leads who replied.
      - `bounces` number, required
      - `positiveLeads` number, required: Leads currently in a positive state (interested / meeting / converted).
      - `conversions` number, required: Conversions attributed to this row.
      - `conversionValue` number, nullable: Total value of those conversions, in your workspace currency.
      - `rates` BreakdownRatesView, required
        - `open` number, nullable, required
        - `click` number, nullable, required
        - `reply` number, nullable, required
        - `bounce` number, nullable, required
        - `delivery` number, nullable, required
        - `positive` number, nullable, required: Share of replied leads whose status is positive now (interested / meeting / converted), %. null when nobody replied.
        - `conversion` number, nullable, required: conversions / leads contacted.
  - `bounceBreakdown` BounceBreakdownView
    - `total` number, required
    - `hard` number, required: Permanent failures (5xx) – the address is bad; drop it from the list.
    - `soft` number, required: Temporary failures (4xx) – mailbox full, greylisting, throttling.
    - `senderBounces` number, required: Bounces caused by the sender side (reputation, auth, content).
    - `recipientBounces` number, required: Bounces caused by the recipient side (bad address, disabled mailbox).
    - `unknownBounces` number, required: Bounces we could not attribute to either side.
    - `byCategory` BounceCategoryView[], required
      - `category` string, required: Machine-readable category.
      - `label` string, required: Human-readable label.
      - `type` 'sender' | 'recipient' | 'unknown', required: Who is responsible: sender (reputation/auth/content – fix your sending), recipient (bad address – clean your list), or unknown.
      - `count` number, required: Unique messages that ended in this category.
      - `percentage` number, required: Share of all bounces, percent. Category counts sum to `total`.

## Other responses

- `400`: The request body or parameters failed validation.
- `401`: Missing or invalid API key.
- `403`: The key lacks a required scope, or the plan does not include API access.
- `404`: The resource does not exist in your workspace.
- `429`: Rate limit exceeded - retry after the interval in the Retry-After header.

---

[API](https://skmtc.dev/mailbeast/apis/mailbeast-public-api.md) · [All operations](https://skmtc.dev/mailbeast/apis/mailbeast-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mailbeast/apis/mailbeast-public-api/revisions/6440ce0738a4?raw)
