Skip to content

Broadcast statistics

GET
https://api.getsitecontrol.com/v1/sites/{site_id}/broadcasts/{broadcast_id}/stats
curl --request GET \
--url https://api.getsitecontrol.com/v1/sites/1/broadcasts/1/stats \
--header 'Authorization: Bearer <token>'

E-mail numbers of one broadcast over its whole life, its A/B variants included, plus how many e-mails are still queued and the numbers of each A/B variant. For a period use get_broadcasts_stats_by_broadcast with this id. While the broadcast is being prepared, sent or paused, progress gives the e-mails sent and left, the current step and the estimated finish time.

Every number counts e-mails, one e-mail being one message to one recipient, and each e-mail at most once per metric: send e-mails sent, including those rejected on sending; bounce e-mails that bounced or were rejected on sending; deliver is send minus bounce, never below zero; open e-mails opened; click e-mails with at least one link clicked; unsubscribe e-mails whose recipient unsubscribed through them; complaint e-mails reported as spam through the recipient’s mail provider. rates next to each total gives the delivery, open, click, click-to-open, unsubscribe, complaint and bounce rates, rounded to 4 places; a rate is null when its denominator is 0, as it is undefined, not zero.

FieldDescription
site_id
required
Site Id
integer
broadcast_id
required
Broadcast Id

Broadcast id from list_broadcasts

integer

Broadcast id from list_broadcasts

Successful Response

Media typeapplication/json
BroadcastLifetimeStats
object
FieldDescription
total
required
Total

All e-mails of the broadcast, every A/B variant included

object
FieldDescription
send
required
Send
integer
deliver
required
Deliver
integer
bounce
required
Bounce
integer
open
required
Open
integer
click
required
Click
integer
unsubscribe
required
Unsubscribe
integer
complaint
required
Complaint
integer
rates
required
Rates

Rates computed from total, so the open rate is rates.open; every key is always present, null when its denominator is 0

object
FieldDescription
deliver
Deliver

Delivery rate: deliver / send; null when send is 0: the rate is undefined, not zero

number
nullable
open
Open

Open rate: open / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
click
Click

Click rate: click / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
click_to_open
Click To Open

Click-to-open rate: click / open; null when open is 0: the rate is undefined, not zero. A click is counted without an open when the recipient’s mail app does not load images, so it can exceed 1

number
nullable
unsubscribe
Unsubscribe

Unsubscribe rate: unsubscribe / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
complaint
Complaint

Spam complaint rate: complaint / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
bounce
Bounce

Bounce rate: bounce / send; null when send is 0: the rate is undefined, not zero

number
nullable
queued
Queued

E-mails waiting to be sent, as progress.queued. null for a draft or a scheduled broadcast and when the count is not available; 0 once stopped or completed

integer
nullable
variants
required
Variants

A/B variants in their order, empty without A/B. The winner also counts the e-mails of the main phase. A deleted e-mail shows zeros.

Array<object>
BroadcastVariant
object
FieldDescription
email_id
required
Email Id

The variant’s e-mail, as in ab_test.variant_email_ids

integer
subject
Subject

Subject of the variant’s e-mail; null when the e-mail was deleted

string
nullable
preview_text
Preview Text

Preview text of the variant’s e-mail, shown after the subject in inboxes; null when it has none or the e-mail was deleted

string
nullable
sender
Sender

From address of the variant’s e-mail; null when the e-mail was deleted

string
nullable
total
required
EmailMetrics

E-mail counts; every key is always present.

open, click and the rest count each e-mail once. send includes e-mails rejected on sending, which are also counted in bounce. complaint is spam complaints reported by mail providers.

For a period, each number counts the events dated in it, so the numbers are independent: a bounce may fall in a later period than its sending. deliver is send minus bounce, never below zero.

object
FieldDescription
send
required
Send
integer
deliver
required
Deliver
integer
bounce
required
Bounce
integer
open
required
Open
integer
click
required
Click
integer
unsubscribe
required
Unsubscribe
integer
complaint
required
Complaint
integer
rates
required
Rates

Rates computed from total, so the open rate is rates.open; every key is always present, null when its denominator is 0

object
FieldDescription
deliver
Deliver

Delivery rate: deliver / send; null when send is 0: the rate is undefined, not zero

number
nullable
open
Open

Open rate: open / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
click
Click

Click rate: click / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
click_to_open
Click To Open

Click-to-open rate: click / open; null when open is 0: the rate is undefined, not zero. A click is counted without an open when the recipient’s mail app does not load images, so it can exceed 1

number
nullable
unsubscribe
Unsubscribe

Unsubscribe rate: unsubscribe / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
complaint
Complaint

Spam complaint rate: complaint / deliver; null when deliver is 0: the rate is undefined, not zero

number
nullable
bounce
Bounce

Bounce rate: bounce / send; null when send is 0: the rate is undefined, not zero

number
nullable
progress
Progress

How far a broadcast being prepared, sent or paused has got and when it is expected to finish; null in any other status

object
FieldDescription
sent
required
Sent

E-mails sent so far, as total.send

integer
queued
Queued

E-mails left to send, the same as queued of the response; while the audience is being selected, the contacts matching it. null when the count is not available

integer
nullable
total
Total

sent plus queued; null together with queued

integer
nullable
finishes_at
Finishes At

Estimated time (UTC) the last e-mail is sent; for an A/B test it includes the test duration and the sending to the rest of the audience. null while the audience is being selected, while paused and together with queued

string format: date-time
nullable
step
required
BroadcastProgressStep

Audience_segmentation: the recipients are being selected and queued. ab_test_sending: an A/B broadcast is sending its variants to the test group. ab_test_waiting: the test e-mails are sent and the winner is being chosen. sending: the e-mails are being sent to the recipients.

string
Allowed values: audience_segmentation ab_test_sending ab_test_waiting sending
step_status
required
BroadcastProgressStatus

Running: the step goes on. paused: paused by a person or via the API. paused_balance: paused because the e-mail balance ran out.

string
Allowed values: running paused paused_balance

Example

{
"progress": {
"step": "audience_segmentation",
"step_status": "running"
}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

Unsupported GSC-Version

Media typeapplication/problem+json
Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

Missing or invalid API key or access token

Media typeapplication/problem+json
Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

WWW-Authenticate
string

Authentication scheme: Bearer

Access denied

Media typeapplication/problem+json
Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

Media typeapplication/problem+json

site_not_found: no such site in your account; broadcast_not_found: the site has no broadcast with this id, or it was deleted

Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

Validation failed

Media typeapplication/problem+json
Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

Media typeapplication/problem+json

rate_limited: a limit of the key or the account is spent; statistics also spend the heavy request limit of the key. Retry after Retry-After seconds

Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds

Retry-After
integer

Seconds until the bucket refills

Media typeapplication/problem+json

temporarily_unavailable: the numbers took too long to count or the limits cannot be checked right now; retry later or shorten the period

Problem

The documented shape of every error body on the versioned surface.

object
FieldDescription
type
required
Type
string
title
required
Title
string
status
required
Status
integer
detail
Detail
string
nullable
instance
required
Instance
string
reason
Reason
string
nullable
next
Next
string
nullable
request_id
required
Request Id
string
errors
Errors
Array<object>
nullable
ValidationIssue
object
FieldDescription
loc
required
Loc
Array
msg
required
Msg
string
type
required
Type
string
metadata
Metadata
object

Example · Generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"reason": "example",
"next": "example",
"request_id": "example",
"errors": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
],
"metadata": {}
}
FieldDescription
GSC-Version
string

API version the response was produced for

X-Request-Id
string

Request id, echoed from the request when valid

X-RateLimit-Limit
integer

Limit of the tightest bucket

X-RateLimit-Remaining
integer

Requests left in its window

X-RateLimit-Reset
integer

End of its window, epoch seconds