> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://mailchimp.com/developer/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://mailchimp.com/developer/_mcp/server.

# Get campaign report

GET https://api.mailchimp.com/3.0/reports/{campaign_id}

Get report details for a specific sent campaign.

Reference: https://mailchimp.com/developer/marketing/api/reports/get

## Authentication

- `Authorization` header (bearer token, required) — Authorization using a Mailchimp API key (a.k.a. Bearer token)
- `Authorization` header (bearer token, required) — Authorization using OAuth

## Request

### Path parameters

- `campaign_id` (string, required) — The unique id for the campaign.

### Query parameters

- `fields` (list of string, optional) — A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.
- `exclude_fields` (list of string, optional) — A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.

## Response

### 200

- `_links` (list of CampaignReportLinksItems, optional) — A list of link types and descriptions for the API schema documents.
- `ab_split` (CampaignReportAbSplit, optional) — General stats about different groups of an A/B Split campaign. Does not return information about Multivariate Campaigns.
- `abuse_reports` (integer, optional) — The number of abuse reports generated for this campaign.
- `bounces` (CampaignReportBounces, optional) — An object describing the bounce summary for the campaign.
- `campaign_title` (string, optional) — The title of the campaign.
- `clicks` (CampaignReportClicks, optional) — An object describing the click activity for the campaign.
- `delivery_status` (CampaignReportDeliveryStatus, optional) — Updates on campaigns in the process of sending.
- `ecommerce` (CampaignReportEcommerce, optional) — E-Commerce stats for a campaign.
- `emails_sent` (integer, optional) — The total number of emails sent for this campaign.
- `facebook_likes` (CampaignReportFacebookLikes, optional) — An object describing campaign engagement on Facebook.
- `forwards` (CampaignReportForwards, optional) — An object describing the forwards and forward activity for the campaign.
- `id` (string, optional) — A string that uniquely identifies this campaign.
- `industry_stats` (CampaignReportIndustryStats, optional) — The average campaign statistics for your industry.
- `list_id` (string, optional) — The unique list id.
- `list_is_active` (boolean, optional) — The status of the list used, namely if it's deleted or disabled.
- `list_name` (string, optional) — The name of the list.
- `list_stats` (CampaignReportListStats, optional) — The average campaign statistics for your list. This won't be present if we haven't calculated it yet for this list.
- `opens` (CampaignReportOpens, optional) — An object describing the open activity for the campaign.
- `preview_text` (string, optional) — The preview text for the campaign.
- `rss_last_send` (datetime, optional) — For RSS campaigns, the date and time of the last send in ISO 8601 format.
- `send_time` (datetime, optional) — The date and time a campaign was sent in ISO 8601 format.
- `share_report` (CampaignReportShareReport, optional) — The url and password for the [VIP report](https://mailchimp.com/help/share-a-campaign-report/).
- `subject_line` (string, optional) — The subject line for the campaign.
- `timeseries` (list of CampaignReportTimeseriesItems, optional) — An hourly breakdown of the performance of the campaign over the first 24 hours.
- `timewarp` (list of CampaignReportTimewarpItems, optional) — An hourly breakdown of sends, opens, and clicks if a campaign is sent using timewarp.
- `type` (string, optional) — The type of campaign (regular, plain-text, ab_split, rss, automation, variate, or auto).
- `unsubscribed` (integer, optional) — The total number of unsubscribed members for this campaign.

## Types

### CampaignReportLinksItems

This object represents a link from the resource where it is found to another resource or action that may be performed.

- `href` (string, optional) — This property contains a fully-qualified URL that can be called to retrieve the linked resource or perform the linked action.
- `method` (enum, optional) — The HTTP method that should be used when accessing the URL defined in 'href'.
  - Allowed values: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `OPTIONS`, `HEAD`
- `rel` (string, optional) — As with an HTML 'rel' attribute, this describes the type of link.
- `schema` (string, optional) — For HTTP methods that can receive bodies (POST and PUT), this is a URL representing the schema that the body should conform to.
- `targetSchema` (string, optional) — For GETs, this is a URL representing the schema that the response should conform to.

### CampaignReportAbSplit

General stats about different groups of an A/B Split campaign. Does not return information about Multivariate Campaigns.

- `a` (CampaignReportAbSplitA, optional) — Stats for Campaign A.
- `b` (CampaignReportAbSplitB, optional) — Stats for Campaign B.

### CampaignReportBounces

An object describing the bounce summary for the campaign.

- `hard_bounces` (integer, optional) — The total number of hard bounced email addresses.
- `soft_bounces` (integer, optional) — The total number of soft bounced email addresses.
- `syntax_errors` (integer, optional) — The total number of addresses that were syntax-related bounces.

### CampaignReportClicks

An object describing the click activity for the campaign.

- `click_rate` (double, optional) — The number of unique clicks divided by the total number of successful deliveries.
- `clicks_total` (integer, optional) — The total number of clicks for the campaign.
- `last_click` (datetime, optional) — The date and time of the last recorded click for the campaign in ISO 8601 format.
- `unique_clicks` (integer, optional) — The total number of unique clicks for links across a campaign.
- `unique_subscriber_clicks` (integer, optional) — The total number of subscribers who clicked on a campaign.

### CampaignReportDeliveryStatus

Updates on campaigns in the process of sending.

- `can_cancel` (boolean, optional) — Whether a campaign send can be canceled.
- `emails_canceled` (integer, optional) — The total number of emails canceled for this campaign.
- `emails_sent` (integer, optional) — The total number of emails confirmed sent for this campaign so far.
- `enabled` (boolean, optional) — Whether Campaign Delivery Status is enabled for this account and campaign.
- `status` (enum, optional) — The current state of a campaign delivery.
  - Allowed values: `delivering`, `delivered`, `canceling`, `canceled`

### CampaignReportEcommerce

E-Commerce stats for a campaign.

- `currency_code` (string, optional)
- `total_orders` (integer, optional) — The total orders for a campaign.
- `total_revenue` (double, optional) — The total revenue for a campaign. Calculated as the sum of all order totals minus shipping and tax totals.
- `total_spent` (double, optional) — The total spent for a campaign. Calculated as the sum of all order totals with no deductions.

### CampaignReportFacebookLikes

An object describing campaign engagement on Facebook.

- `facebook_likes` (integer, optional) — The number of Facebook likes for the campaign.
- `recipient_likes` (integer, optional) — The number of recipients who liked the campaign on Facebook.
- `unique_likes` (integer, optional) — The number of unique likes.

### CampaignReportForwards

An object describing the forwards and forward activity for the campaign.

- `forwards_count` (integer, optional) — How many times the campaign has been forwarded.
- `forwards_opens` (integer, optional) — How many times the forwarded campaign has been opened.

### CampaignReportIndustryStats

The average campaign statistics for your industry.

- `abuse_rate` (double, optional) — The industry abuse rate.
- `bounce_rate` (double, optional) — The industry bounce rate.
- `click_rate` (double, optional) — The industry click rate.
- `open_rate` (double, optional) — The industry open rate.
- `type` (string, optional) — The type of business industry associated with your account. For example: retail, education, etc.
- `unopen_rate` (double, optional) — The industry unopened rate.
- `unsub_rate` (double, optional) — The industry unsubscribe rate.

### CampaignReportListStats

The average campaign statistics for your list. This won't be present if we haven't calculated it yet for this list.

- `click_rate` (double, optional) — The average click rate (a percentage represented as a number between 0 and 100) per campaign for the list.
- `open_rate` (double, optional) — The average unique open rate (a percentage represented as a number between 0 and 100) per campaign for the list.
- `proxy_excluded_open_rate` (double, optional) — The average unique open rate (a percentage represented as a number between 0 and 100) per campaign for the list, excluding opens from email clients that use proxies.
- `sub_rate` (double, optional) — The average number of subscriptions per month for the list.
- `unsub_rate` (double, optional) — The average number of unsubscriptions per month for the list.

### CampaignReportOpens

An object describing the open activity for the campaign.

- `last_open` (datetime, optional) — The date and time of the last recorded open in ISO 8601 format.
- `open_rate` (double, optional) — The number of unique opens for a campaign divided by the total number of successful deliveries.
- `opens_total` (integer, optional) — The total number of opens for a campaign.
- `proxy_excluded_open_rate` (double, optional) — The average unique open rate for a campaign, excluding opens from email clients that use proxies.
- `proxy_excluded_opens` (integer, optional) — The total number of opens for a campaign, excluding opens from email clients that use proxies.
- `proxy_excluded_unique_opens` (integer, optional) — The total number of unique opens for a campaign, excluding opens from email clients that use proxies.
- `unique_opens` (integer, optional) — The total number of unique opens for a campaign.

### CampaignReportShareReport

The url and password for the [VIP report](https://mailchimp.com/help/share-a-campaign-report/).

- `share_password` (string, optional) — If password protected, the password for the VIP report.
- `share_url` (string, optional) — The URL for the VIP report.

### CampaignReportTimeseriesItems

- `emails_sent` (integer, optional) — The number of emails sent in the timeseries.
- `proxy_excluded_unique_opens` (integer, optional) — The number of unique opens in the timeseries, excluding opens from email clients that use proxies.
- `recipients_clicks` (integer, optional) — The number of clicks in the timeseries.
- `timestamp` (datetime, optional) — The date and time for the series in ISO 8601 format.
- `unique_opens` (integer, optional) — The number of unique opens in the timeseries.

### CampaignReportTimewarpItems

- `bounces` (integer, optional) — The number of bounces.
- `clicks` (integer, optional) — The number of clicks.
- `gmt_offset` (integer, optional) — For campaigns sent with timewarp, the time zone group the member is apart of.
- `last_click` (datetime, optional) — The date and time of the last click in ISO 8601 format.
- `last_open` (datetime, optional) — The date and time of the last open in ISO 8601 format.
- `opens` (integer, optional) — The number of opens.
- `unique_clicks` (integer, optional) — The number of unique clicks.
- `unique_opens` (integer, optional) — The number of unique opens.

### CampaignReportAbSplitA

Stats for Campaign A.

- `abuse_reports` (integer, optional) — Abuse reports for Campaign A.
- `bounces` (integer, optional) — Bounces for Campaign A.
- `forwards` (integer, optional) — Forwards for Campaign A.
- `forwards_opens` (integer, optional) — Opens from forwards for Campaign A.
- `last_open` (string, optional) — The last open for Campaign A.
- `opens` (integer, optional) — Opens for Campaign A.
- `recipient_clicks` (integer, optional) — Recipient Clicks for Campaign A.
- `unique_opens` (integer, optional) — Unique opens for Campaign A.
- `unsubs` (integer, optional) — Unsubscribes for Campaign A.

### CampaignReportAbSplitB

Stats for Campaign B.

- `abuse_reports` (integer, optional) — Abuse reports for Campaign B.
- `bounces` (integer, optional) — Bounces for Campaign B.
- `forwards` (integer, optional) — Forwards for Campaign B.
- `forwards_opens` (integer, optional) — Opens for forwards from Campaign B.
- `last_open` (string, optional) — The last open for Campaign B.
- `opens` (integer, optional) — Opens for Campaign B.
- `recipient_clicks` (integer, optional) — Recipients clicks for Campaign B.
- `unique_opens` (integer, optional) — Unique opens for Campaign B.
- `unsubs` (integer, optional) — Unsubscribes for Campaign B.

## Examples

**Response**

```json
{
  "_links": [
    {
      "href": "string",
      "method": "GET",
      "rel": "string",
      "schema": "string",
      "targetSchema": "string"
    }
  ],
  "ab_split": {
    "a": {
      "abuse_reports": 1,
      "bounces": 1,
      "forwards": 1,
      "forwards_opens": 1,
      "last_open": "string",
      "opens": 1,
      "recipient_clicks": 1,
      "unique_opens": 1,
      "unsubs": 1
    },
    "b": {
      "abuse_reports": 1,
      "bounces": 1,
      "forwards": 1,
      "forwards_opens": 1,
      "last_open": "string",
      "opens": 1,
      "recipient_clicks": 1,
      "unique_opens": 1,
      "unsubs": 1
    }
  },
  "abuse_reports": 1,
  "bounces": {
    "hard_bounces": 1,
    "soft_bounces": 1,
    "syntax_errors": 1
  },
  "campaign_title": "string",
  "clicks": {
    "click_rate": 1.1,
    "clicks_total": 1,
    "last_click": "2024-01-15T09:30:00Z",
    "unique_clicks": 1,
    "unique_subscriber_clicks": 1
  },
  "delivery_status": {
    "can_cancel": true,
    "emails_canceled": 1,
    "emails_sent": 1,
    "enabled": true,
    "status": "delivering"
  },
  "ecommerce": {
    "currency_code": "USD",
    "total_orders": 1,
    "total_revenue": 1.1,
    "total_spent": 1.1
  },
  "emails_sent": 1,
  "facebook_likes": {
    "facebook_likes": 1,
    "recipient_likes": 1,
    "unique_likes": 1
  },
  "forwards": {
    "forwards_count": 1,
    "forwards_opens": 1
  },
  "id": "string",
  "industry_stats": {
    "abuse_rate": 1.1,
    "bounce_rate": 1.1,
    "click_rate": 1.1,
    "open_rate": 1.1,
    "type": "string",
    "unopen_rate": 1.1,
    "unsub_rate": 1.1
  },
  "list_id": "string",
  "list_is_active": true,
  "list_name": "string",
  "list_stats": {
    "click_rate": 1.1,
    "open_rate": 1.1,
    "proxy_excluded_open_rate": 1.1,
    "sub_rate": 1.1,
    "unsub_rate": 1.1
  },
  "opens": {
    "last_open": "2024-01-15T09:30:00Z",
    "open_rate": 1.1,
    "opens_total": 1,
    "proxy_excluded_open_rate": 1.1,
    "proxy_excluded_opens": 1,
    "proxy_excluded_unique_opens": 1,
    "unique_opens": 1
  },
  "preview_text": "string",
  "rss_last_send": "2024-01-15T09:30:00Z",
  "send_time": "2024-01-15T09:30:00Z",
  "share_report": {
    "share_password": "string",
    "share_url": "string"
  },
  "subject_line": "string",
  "timeseries": [
    {
      "emails_sent": 1,
      "proxy_excluded_unique_opens": 1,
      "recipients_clicks": 1,
      "timestamp": "2024-01-15T09:30:00Z",
      "unique_opens": 1
    }
  ],
  "timewarp": [
    {
      "bounces": 1,
      "clicks": 1,
      "gmt_offset": 1,
      "last_click": "2024-01-15T09:30:00Z",
      "last_open": "2024-01-15T09:30:00Z",
      "opens": 1,
      "unique_clicks": 1,
      "unique_opens": 1
    }
  ],
  "type": "string",
  "unsubscribed": 1
}
```

**SDK Code**

```python
import requests

url = "https://api.mailchimp.com/3.0/reports/campaign_id"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.mailchimp.com/3.0/reports/campaign_id';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.mailchimp.com/3.0/reports/campaign_id"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.mailchimp.com/3.0/reports/campaign_id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.mailchimp.com/3.0/reports/campaign_id")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.mailchimp.com/3.0/reports/campaign_id', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.mailchimp.com/3.0/reports/campaign_id");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.mailchimp.com/3.0/reports/campaign_id")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```