---
title: "Get daily outbound Apple Messages for Business statistics"
method: GET
path: "/v1/amb/stats/daily"
tags: ["amb-stats"]
---

# Get daily outbound Apple Messages for Business statistics

`GET /v1/amb/stats/daily`

## Request

- Base URL: `https://us1.platform.bird.com`
- URL: `https://us1.platform.bird.com/v1/amb/stats/daily`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `bird_session`

Returns one row of outbound Apple Messages for Business counts and processing-latency percentiles per calendar day for the workspace, gap-filled so a silent day is a zero row rather than a missing one. Every count in a row is attributed to the day its message was accepted, regardless of when a later event, such as a send failure, arrived.

There is no delivery receipt on this channel, so there is no `delivered` count or delivery-latency figure in any row. Each row carries its own `latency.processing` percentiles. Read `first_response` from the summary or a breakdown endpoint.

`from` and `to` are optional calendar days (YYYY-MM-DD), defaulting to the trailing 30 days. The maximum window is 365 days; a longer range returns `422`. Set `timezone` to report rows by your local calendar day. Historical dates are supported within the maximum window length; the requested dates are not shifted forward.

Set at most one dimension filter (`business_account_id`, `message_kind`, `intent`, `group`, `category`, or `tag`) to restrict the statistics to that dimension's value; setting more than one returns `422`.

## Query parameters

- `from` string, date
- `to` string, date
- `timezone` string
- `business_account_id` string
- `message_kind` 'text' | 'attachment' | 'rich_link' | 'quick_reply' | 'list_picker' | 'time_picker' | 'form' | 'apple_pay' | 'authenticate' | 'imessage_app' | 'interactive': Derived message classification for filtering and statistics. Send requests use the native content.type families. Create Apple Pay and authentication requests through the conversation payment and authentication operations. - text: Text, optionally with a subject. - attachment: One or more files, images, audio clips, or videos. - rich_link: A link with a preview card. - quick_reply: Two to five reply choices. - list_picker: A grouped menu of choices. - time_picker: Appointment time slots; a reply may contain only a selected label. - form: A multi-page form. - imessage_app: A custom iMessage app interaction on a compatible device. - interactive: An opaque interactive reference whose subtype is unknown. - apple_pay: An Apple Pay request created through the conversation payment operations. - authenticate: An identity verification request created through the conversation authentication operations.
- `intent` string
- `group` string
- `category` string
- `tag` string

## Headers

- `X-Workspace-Id` string
- `X-Organization-Id` string

## Response `200`

Daily aggregate stats for the requested period.

- AMBStatsResponse: Time-series stats payload. `period` echoes the range and bucket grain the server computed against; `data` is one row per bucket in chronological order.
  - `period` AMBStatsSeriesPeriod, required: The window and bucket grain the response covers, echoed from the request, plus the freshness boundary the data is current to.
    - `from` string, required: Inclusive start of the window. A calendar day (YYYY-MM-DD) on the day grain, an RFC 3339 instant on the hour grain. Historical starts are preserved; the maximum request length does not impose a historical cutoff.
    - `to` string, required: Inclusive end of the window. A calendar day (YYYY-MM-DD) on the day grain, an RFC 3339 instant on the hour grain.
    - `grain` 'day' | 'hour', required: The bucket grain of the series, either `day` or `hour`.
    - `data_as_of` string, date-time, nullable: Latest time reflected in the statistics. More recent events might not be included yet. Null when the freshness boundary is unavailable.
  - `attribution` 'accepted_time' | 'event_time', required: Which timestamp a statistics response buckets its rows and totals by: - `accepted_time`: attributed to when Bird accepted the outbound message for sending. The outbound send statistics use this, so a later event for the same message, such as a send failure, still counts against the day or hour its message was accepted. - `event_time`: attributed to when the event itself occurred. Inbound message statistics, conversation statistics and the staff per-business failure counts use this, since there is no earlier outbound event to anchor them to. A response never mixes the two axes: every row and total in one payload shares the same attribution.
  - `data` AMBStatsPoint[], required: One row per day or hour in chronological order. Buckets with no activity contain zero counts.
    - `bucket` string, required: The day (YYYY-MM-DD) or hour (RFC 3339, on the hour) this point covers, matching the period's grain.
    - `counts` AMBOutboundStatsCounts, required: Outbound Apple Messages for Business counts for the requested scope, attributed to when each message was accepted. Apple Messages for Business has no delivery receipt, so there is no `delivered` count anywhere in this API: `sent` is the last outbound state Bird observes for a message. Very large counts are close estimates rather than exact tallies. Rates are computed once here, clamped to 1, and null when nothing was accepted.
      - `accepted` integer, required: Distinct messages accepted for sending after admission checks. This is the denominator for `sent_rate` and `send_failure_rate`.
      - `sent` integer, required: Distinct messages handed off to Apple.
      - `send_failed` integer, required: Distinct accepted messages that Apple refused or that exhausted their send attempts. See `last_error.code` on the message for the reason; a refused charge is not a send failure, it is `rejected`.
      - `rejected` integer, required: Distinct messages refused before any send attempt, because the destination has no price, the wallet could not fund the send, or the content cannot be sent yet. Rejected messages are never charged and are not counted in `accepted`, so the total addressed is `accepted + rejected`. Excluded from `send_failure_rate`, which covers send failures only.
      - `sent_rate` number, nullable, required: Share of accepted messages Apple acknowledged, computed as `sent / accepted`. Null when no messages were accepted in scope. This stands where other channels report a delivery rate.
      - `send_failure_rate` number, nullable, required: Share of accepted messages that failed to send, computed as `send_failed / accepted`. Null when no messages were accepted in scope.
    - `latency` AMBStatsLatency, required: Processing-latency percentiles in milliseconds for the requested scope, from acceptance to Apple handoff. Apple Messages for Business has no delivery receipt, so there is no `delivery` or `total` member beside `processing`. Conversation response timing is reported separately in `first_response`. Always present; every percentile is null when no qualifying message in scope has a measurement.
      - `processing` AMBStatsQuantiles, required: Approximate p50, p95, and p99 latency percentiles in milliseconds for one latency family. All three are null when no qualifying event contributed a measurement.
        - `p50_ms` integer, nullable, required: Median (50th percentile) latency in milliseconds. Null when no qualifying event contributed a measurement.
        - `p95_ms` integer, nullable, required: 95th percentile latency in milliseconds. Null when no qualifying event contributed a measurement.
        - `p99_ms` integer, nullable, required: 99th percentile latency in milliseconds. Null when no qualifying event contributed a measurement.

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Insufficient permissions
- `404`: Resource not found
- `422`: The request has invalid field values, violates a business rule, or carries a query parameter the endpoint does not declare. Field validation errors use `type: validation_error` and include the affected fields in `details`. Business-rule errors identify the failed rule in `type`.
- `429`: Rate limit exceeded
- `500`: Internal server error
- `503`: The service is temporarily unavailable. If `Retry-After` is present, wait for that delay before retrying; otherwise, retry with exponential backoff. Reuse the same idempotency key and request when retrying a mutation.

---

[API](https://skmtc.dev/messagebird/apis/bird-api.md) · [All operations](https://skmtc.dev/messagebird/apis/bird-api/llms.txt) · [OpenAPI document](https://skmtc.dev/messagebird/apis/bird-api/revisions/6dfce1179799?raw)
