> ## Documentation Index
> Fetch the complete documentation index at: https://usegately.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Campaign Stats

> Retrieve delivery and engagement statistics for a campaign

Returns event counts aggregated from the email tracking system. Stats are populated as emails are delivered, opened, and clicked — a freshly sent campaign may show zeros until tracking events arrive.

## Headers

<ParamField header="Authorization" type="string" required>
  `Bearer YOUR_API_KEY`
</ParamField>

<ParamField header="X-Project-ID" type="string">
  Your project UUID. Not required if the API key already encodes the project.
</ParamField>

## Path Parameters

<ParamField path="campaignId" type="string" required>
  Campaign UUID
</ParamField>

## Response

<ResponseField name="sent" type="number">
  Total emails targeted (`total_recipients` from the campaign record)
</ResponseField>

<ResponseField name="delivered" type="number">
  Emails accepted by recipient mail servers
</ResponseField>

<ResponseField name="opened" type="number">
  Unique opens tracked via pixel
</ResponseField>

<ResponseField name="clicked" type="number">
  Unique link clicks tracked via redirect
</ResponseField>

<ResponseField name="bounced" type="number">
  Hard and soft bounces
</ResponseField>

<ResponseField name="complained" type="number">
  Spam complaints received
</ResponseField>

<Note>
  The SDK's `getStats()` method adds derived `delivery_rate`, `open_rate`, and `click_rate` percentages calculated client-side from these raw counts.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.usegately.com/api/v1/campaigns/CAMPAIGN_ID/stats" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "X-Project-ID: YOUR_PROJECT_ID"
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch(
    'https://api.usegately.com/api/v1/campaigns/CAMPAIGN_ID/stats',
    {
      headers: {
        'Authorization': 'Bearer YOUR_API_KEY',
        'X-Project-ID': 'YOUR_PROJECT_ID',
      }
    }
  )
  const stats = await res.json()
  ```

  ```typescript SDK theme={null}
  import { GatelyCampaigns } from '@gately/sdk'

  const campaigns = new GatelyCampaigns({ projectId: 'YOUR_PROJECT_ID' })
  const stats = await campaigns.getStats('CAMPAIGN_ID')

  // SDK adds derived rates automatically
  console.log(`Delivery rate: ${stats.delivery_rate}%`)
  console.log(`Open rate:     ${stats.open_rate}%`)
  console.log(`Click rate:    ${stats.click_rate}%`)
  ```
</RequestExample>

<ResponseExample>
  ```json Success theme={null}
  {
    "sent": 842,
    "delivered": 835,
    "opened": 412,
    "clicked": 98,
    "bounced": 7,
    "complained": 1
  }
  ```

  ```json No tracking data yet theme={null}
  {
    "sent": 500,
    "delivered": 0,
    "opened": 0,
    "clicked": 0,
    "bounced": 0,
    "complained": 0
  }
  ```
</ResponseExample>
