Hourly SMS statistics
GET
/v1/sms/stats/hourly
const stats = await bird.sms.stats.hourly({
from: "2026-05-30T00:00:00Z",
to: "2026-05-31T00:00:00Z",
});
for (const point of stats.data ?? []) {
console.log(point.bucket, point.delivery);
}stats = client.sms.stats.hourly(from_="2026-05-30T00:00:00Z", to="2026-05-31T00:00:00Z")
for point in stats.data or []:
print(point.bucket, point.delivery)series, err := client.Sms.Stats.Hourly(context.Background(), bird.SmsStatsHourlyParams{
From: time.Now().Add(-24 * time.Hour),
To: time.Now(),
})
if err != nil {
log.Fatal(err)
}
for _, point := range *series.Data {
fmt.Println(*point.Bucket, *point.Delivery.Accepted)
}$hourly = $bird->sms->stats->hourly(['from' => '2026-05-30T00:00:00Z', 'to' => '2026-05-31T00:00:00Z']);
foreach ($hourly->getData() ?? [] as $point) {
echo $point->getBucket(), PHP_EOL;
}bird sms stats hourlycurl -X GET "https://us1.platform.bird.com/v1/sms/stats/hourly" \
-H "Authorization: Bearer $TOKEN"Returns one row of aggregate SMS statistics per hour for the workspace -- per UTC hour by default, or per local hour when you set timezone (so a timezone with a sub-hour offset gets correctly aligned hours). Useful for inspecting send rate and deliverability inside a single day or across a recent window.
Rows are bucketed by send time, not event time -- a delivery confirmation recorded at 14:07 for a message accepted at 09:00 lands in the 09:00 row, alongside that message's own accepted. A recent row therefore under-reports delivered while its delivery reports are still arriving, and its counts only ever grow toward the truth.
Each row carries lifecycle counts only (accepted, sent, delivered, undelivered, failed, rejected, expired); rates and latency are whole-window aggregates available from the summary endpoint.
A single request may span at most 30 days (720 hourly rows). For longer ranges use the daily endpoint, which has a 365-day window. Requesting an hourly window longer than 30 days, or a from after to, returns 422. from and to are interpreted as instants (ISO 8601); the server rounds each down to the enclosing hour and echoes the rounded values back in period. Both bounds are inclusive after round-down.
查询参数
from
string
Start of the window (ISO 8601 instant). Rounded down to the start of its hour -- the local hour when timezone is set, otherwise the UTC hour -- and that hour is included. When timezone is set, a numeric UTC offset here (for example +05:45) is rejected; use a Z (UTC) instant. Defaults to 7 days before to when omitted.
to
string
End of the window (ISO 8601 instant). Rounded down to the start of its hour -- the local hour when timezone is set, otherwise the UTC hour -- and that hour is included (both bounds inclusive). When timezone is set, a numeric UTC offset here is rejected; use a Z (UTC) instant. Defaults to the current hour when omitted. Window may not exceed 30 days (720 hours).
timezone
string
IANA timezone identifier (for example Asia/Kathmandu) to report in; defaults to UTC. Day and hour boundaries and the default window when from and to are omitted both follow it, so a calendar-day from or to names a local day. A from or to carrying its own UTC offset is rejected while this is set: pass a calendar day or a Z instant.
originator
string
Restrict the statistics to a single originator (the sender address messages were sent from). Mutually exclusive with the other dimension filters (country, category, carrier); only one may be set per request. Matches the message from.
country
string
Restrict the statistics to a single destination country, as an ISO 3166-1 alpha-2 code. Mutually exclusive with the other dimension filters (originator, category, carrier); only one may be set per request.
category
string
Restrict the statistics to a single category. Mutually exclusive with the other dimension filters (originator, country, carrier); only one may be set per request.
carrier
string
Restrict the statistics to a single delivery carrier. Mutually exclusive with the other dimension filters (originator, country, category); only one may be set per request.
响应载荷
period
object
必填
The window and bucket grain the response covers, echoed from the request, plus the freshness boundary the data is current to.
显示子属性
period.from
string
必填
Inclusive start of the window. A calendar day (YYYY-MM-DD) on the day grain, an RFC 3339 instant rounded to the hour on the hour grain.
period.to
string
必填
Inclusive end of the window. A calendar day (YYYY-MM-DD) on the day grain, an RFC 3339 instant rounded to the hour on the hour grain.
period.grain
string
必填
The bucket grain of the series, either day or hour.
Possible values: day, hour
period.data_as_of
nullable string
The instant the statistics in this response are current to: events recorded up to roughly this time are reflected, while more recent events may not be yet. Statistics are served from a rolling aggregation that refreshes every few seconds, so a response is near-real-time but not live; use this field to label data freshness rather than assuming the numbers are to-the-second. Null when the freshness boundary is not being reported.
data
array of object
必填
One row per bucket (day or hour, per the grain) in the period, in chronological order. Zero-filled -- buckets with no activity are included with zero counts, so the series charts continuously without client-side gap handling.
显示子属性
data.bucket
string
必填
The day (YYYY-MM-DD) or hour (RFC 3339, on the hour) this point covers, matching the period's grain.
data.delivery
object
必填
显示子属性
data.delivery.accepted
integer
必填
Distinct messages accepted for sending after admission checks.
data.delivery.sent
integer
必填
Distinct messages handed off to the carrier for delivery.
data.delivery.delivered
integer
必填
Distinct messages the carrier confirmed as delivered to the handset.
data.delivery.undelivered
integer
必填
Distinct messages the carrier reported as not delivered.
data.delivery.failed
integer
必填
Distinct messages that failed during sending.
data.delivery.rejected
integer
必填
Distinct messages rejected before any send attempt, for example by sending policy or a message-generation failure.
data.delivery.expired
integer
必填
Distinct messages that could not be delivered within their validity window and expired.