From 33cec77396296b57b488c971e70a45ac864ddd63 Mon Sep 17 00:00:00 2001 From: Will Strinz Date: Thu, 22 Oct 2026 12:47:50 -0500 Subject: [PATCH 1/3] Document the Email Series Campaign email list and fetch endpoints Co-Authored-By: Claude Opus 5.5 --- source/includes/rest/_campaigns.md | 201 +++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) diff --git a/source/includes/rest/_campaigns.md b/source/includes/rest/_campaigns.md index d1d82202491..549350347ef 100644 --- a/source/includes/rest/_campaigns.md +++ b/source/includes/rest/_campaigns.md @@ -407,6 +407,207 @@ client.pauseCampaign(campaignId) None. +## List all emails in an Email Series Campaign + +> To list the emails in an Email Series Campaign: + +```shell +curl "https://api.getdrip.com/v2/YOUR_ACCOUNT_ID/campaigns/CAMPAIGN_ID/emails" \ + -H 'User-Agent: Your App Name (www.yourapp.com)' \ + -u YOUR_API_KEY: +``` + +```ruby +require "net/http" + +uri = URI("https://api.getdrip.com/v2/YOUR_ACCOUNT_ID/campaigns/CAMPAIGN_ID/emails") + +request = Net::HTTP::Get.new(uri) +request.basic_auth("YOUR_API_KEY", "") +request["User-Agent"] = "Your App Name (www.yourapp.com)" + +response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| + http.request(request) +end + +puts response.body +``` + +```javascript +const response = await fetch( + "https://api.getdrip.com/v2/YOUR_ACCOUNT_ID/campaigns/CAMPAIGN_ID/emails", + { + headers: { + "User-Agent": "Your App Name (www.yourapp.com)", + "Authorization": "Basic " + Buffer.from("YOUR_API_KEY:").toString("base64") + } + } +); + +const body = await response.json(); +``` + +> The response looks like this: + +```json +{ + "links": { + "emails.account": "https://api.getdrip.com/v2/accounts/{emails.account}", + "emails.campaign": "https://api.getdrip.com/v2/{emails.account}/campaigns/{emails.campaign}" + }, + "emails": [{ + "id": "7654321", + "href": "https://api.getdrip.com/v2/9999999/campaigns/123456/emails/7654321", + "sending_delay": 0, + "sending_order": 0, + "subject": "Welcome to the course, {{ subscriber.first_name }}", + "html_body": "

Welcome!

", + "text_body": "Welcome!", + "created_at": "2026-06-21T10:31:58Z", + "open_rate": 0.42, + "click_rate": 0.085, + "links": { + "account": "9999999", + "campaign": "123456" + } + }] +} +``` + +Returns every email in the Email Series Campaign at once. Includes draft emails. The list is not +paginated. + +**Properties** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescription
idThe email's id. Use it to fetch the email.
hrefThe url for retrieving the email via the REST API.
sending_delayHow long Drip waits before sending this email, in the unit set for it in the campaign: minutes, hours, or days. The unit is not included.
sending_orderThe email's position in the campaign. The list is returned in this order.
subjectThe email's subject.
html_bodyThe HTML content used in the email's body.
text_bodyThe plain text content used in the email's body.
created_atA timestamp for when the email was created.
open_rateThe email's open rate, as a decimal: 0.42 is 42%.
click_rateThe email's click rate, as a decimal: 0.085 is 8.5%.
linksAn object containing the ids of the email's account and Email Series Campaign.
+ +Liquid in `subject`, `html_body`, and `text_body` is returned as written, not rendered for a +subscriber. + +### HTTP Endpoint + +`GET /v2/:account_id/campaigns/:campaign_id/emails` + +### Arguments + +None. + +## Fetch an email in an Email Series Campaign + +> To fetch one email in an Email Series Campaign: + +```shell +curl "https://api.getdrip.com/v2/YOUR_ACCOUNT_ID/campaigns/CAMPAIGN_ID/emails/EMAIL_ID" \ + -H 'User-Agent: Your App Name (www.yourapp.com)' \ + -u YOUR_API_KEY: +``` + +```ruby +require "net/http" + +uri = URI("https://api.getdrip.com/v2/YOUR_ACCOUNT_ID/campaigns/CAMPAIGN_ID/emails/EMAIL_ID") + +request = Net::HTTP::Get.new(uri) +request.basic_auth("YOUR_API_KEY", "") +request["User-Agent"] = "Your App Name (www.yourapp.com)" + +response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| + http.request(request) +end + +puts response.body +``` + +```javascript +const response = await fetch( + "https://api.getdrip.com/v2/YOUR_ACCOUNT_ID/campaigns/CAMPAIGN_ID/emails/EMAIL_ID", + { + headers: { + "User-Agent": "Your App Name (www.yourapp.com)", + "Authorization": "Basic " + Buffer.from("YOUR_API_KEY:").toString("base64") + } + } +); + +const body = await response.json(); +``` + +> The response looks like this: + +```json +# The emails property is an array of one email object. +{ + "links": { ... }, + "emails": [{ ... }] +} +``` + +Returns one email, with the same properties as +[List all emails in an Email Series Campaign](#list-all-emails-in-an-email-series-campaign). +Responds with a `404 Not Found` if the Email Series Campaign does not exist or the email is not +part of it. + +### HTTP Endpoint + +`GET /v2/:account_id/campaigns/:campaign_id/emails/:email_id` + +### Arguments + +None. + ## List all subscribers subscribed to an Email Series Campaign > To list subscribers on an Email Series Campaign: From 602960538e545b74dc31e87bb82f4af895fd5c2d Mon Sep 17 00:00:00 2001 From: Will Strinz Date: Mon, 2 Nov 2026 13:00:03 -0600 Subject: [PATCH 2/3] Clarity pass: wording and accuracy fixes Co-Authored-By: Claude Opus 5.5 --- source/includes/rest/_campaigns.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/includes/rest/_campaigns.md b/source/includes/rest/_campaigns.md index ac5e3f51b48..1437a639774 100644 --- a/source/includes/rest/_campaigns.md +++ b/source/includes/rest/_campaigns.md @@ -480,11 +480,14 @@ not sent and are not marked as drafts in the response. The list is not paginated `sending_delay` is how long Drip waits before sending the email, counted from the previous email or, for the first email, from when the person subscribed unless the campaign has -`start_immediately`. Its unit (minutes, hours, or days) is set in the Email Series Campaign and -is not part of the response. For an email's performance, use +`start_immediately`. Each email has its own unit (minutes, hours, or days), set in the Drip app. +The unit is not part of the response. For an email's performance, use [Fetch email metrics](#fetch-email-metrics). Liquid in `subject`, `html_body`, and `text_body` is returned as written, not rendered for a subscriber. +The drip-ruby and drip-nodejs clients do not have methods for these endpoints yet, so the Ruby +and JavaScript examples call the API directly. + ### HTTP Endpoint `GET /v2/:account_id/campaigns/:campaign_id/emails` From ae90a19360c67b7bb684df1d1769c0f12b587654 Mon Sep 17 00:00:00 2001 From: Will Strinz Date: Mon, 2 Nov 2026 13:16:49 -0600 Subject: [PATCH 3/3] Drop open_rate and click_rate from the campaign emails example Co-Authored-By: Claude Opus 5.5 --- source/includes/rest/_campaigns.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/includes/rest/_campaigns.md b/source/includes/rest/_campaigns.md index 1437a639774..d331196b8c1 100644 --- a/source/includes/rest/_campaigns.md +++ b/source/includes/rest/_campaigns.md @@ -465,8 +465,6 @@ const body = await response.json(); "html_body": "

Welcome!

", "text_body": "Welcome!", "created_at": "2026-06-21T10:31:58Z", - "open_rate": 0.0, - "click_rate": 0.0, "links": { "account": "9999999", "campaign": "123456"