curl --request GET \
--url https://brew.new/api/v1/sends/{sendId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://brew.new/api/v1/sends/{sendId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://brew.new/api/v1/sends/{sendId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://brew.new/api/v1/sends/{sendId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://brew.new/api/v1/sends/{sendId}"
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(string(body))
}HttpResponse<String> response = Unirest.get("https://brew.new/api/v1/sends/{sendId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://brew.new/api/v1/sends/{sendId}")
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{
"sendId": "r4Kq8ZxL2mW7nT1vPb9Yc",
"kind": "campaign",
"messageClass": "marketing",
"emailId": "V1StGXR8_Z5jdHi6B-myT",
"emailVersionId": "Yc5Kz8Sq2Wn7Lp4Tm1RvX",
"status": "completed",
"audienceId": "jn79k2x4apqz8mjm12ekz1kxdx87yceg",
"audienceName": "Subscribers",
"startedAt": "2026-04-08T12:00:05.000Z",
"completedAt": "2026-04-08T12:34:56.000Z",
"stats": {
"sent": 1200,
"delivered": 1180,
"opened": 540,
"clicked": 96,
"bounced": 20,
"complained": 1,
"unsubscribed": 4
},
"createdAt": "2026-04-08T12:00:00.000Z",
"updatedAt": "2026-04-08T12:34:56.000Z"
}Get a send
Reads one send (campaign or automation) as the bare Send row: identity and join keys, the sender and subject snapshot, status, approvalState, delivery accounting, gradual-send progress and lifetime stats.
Use when polling a send accepted by createSend, or inspecting one automation delivery.
Input sendId in the path; include=events attaches a bounded first page of the send’s analytics events (recipient, type, click URL).
Returns 200 with the row; events is present only when requested.
Errors 404 SEND_NOT_FOUND for an unknown or cross-brand id; 400 INVALID_REQUEST for an unknown include token.
See also listSends, cancelSend, pauseSend, resumeSend, getEventsAnalytics (?sendId=).
curl --request GET \
--url https://brew.new/api/v1/sends/{sendId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://brew.new/api/v1/sends/{sendId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://brew.new/api/v1/sends/{sendId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://brew.new/api/v1/sends/{sendId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://brew.new/api/v1/sends/{sendId}"
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(string(body))
}HttpResponse<String> response = Unirest.get("https://brew.new/api/v1/sends/{sendId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://brew.new/api/v1/sends/{sendId}")
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{
"sendId": "r4Kq8ZxL2mW7nT1vPb9Yc",
"kind": "campaign",
"messageClass": "marketing",
"emailId": "V1StGXR8_Z5jdHi6B-myT",
"emailVersionId": "Yc5Kz8Sq2Wn7Lp4Tm1RvX",
"status": "completed",
"audienceId": "jn79k2x4apqz8mjm12ekz1kxdx87yceg",
"audienceName": "Subscribers",
"startedAt": "2026-04-08T12:00:05.000Z",
"completedAt": "2026-04-08T12:34:56.000Z",
"stats": {
"sent": 1200,
"delivered": 1180,
"opened": 540,
"clicked": 96,
"bounced": 20,
"complained": 1,
"unsubscribed": 4
},
"createdAt": "2026-04-08T12:00:00.000Z",
"updatedAt": "2026-04-08T12:34:56.000Z"
}Authorizations
Send your Brew API key as Authorization: Bearer brew_xxx.
Headers
The brand this request acts on. REQUIRED for organization-scoped credentials (otherwise 400 BRAND_ID_REQUIRED — there is no default brand); list ids with GET /v1/brands. Brand-scoped credentials may omit it, and sending a different brand returns 403 BRAND_SCOPE_MISMATCH. A brand outside your organization returns 404 BRAND_NOT_FOUND.
1 - 64Path Parameters
Send id returned by POST /v1/sends.
1 - 64"r4Kq8ZxL2mW7nT1vPb9Yc"
Query Parameters
Expansions: events attaches a bounded first page of the send’s analytics events.
Response
The send row.
1campaign, automation 1scheduled, queued, running, paused, completed, partially_completed, failed, canceled marketing, transactional 111111pending, approved, rejected Why a paused send is held. plan_limit: the organization ran out of monthly email sends. domain_unsendable: its sending domain stopped passing DNS; fails after 7 days. Both resume on their own and can be canceled. manual: its operator paused the gradual ramp; resume it to continue.
manual, plan_limit, domain_unsendable Show child attributes
Show child attributes
11x >= 0Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?