# Get daily Apple Messages for Business conversation statistics

`GET /v1/amb/stats/conversations/daily`

Returns one row of Apple Messages for Business conversation lifecycle counts (`started`, `reopened`, `closed`, `conversations`) per calendar day for the workspace, gap-filled so a silent day is a zero row rather than a missing one. Every row is attributed to the day the lifecycle event occurred, not to any earlier outbound message. A conversation can be reopened and closed more than once, so `started`, `reopened`, and `closed` need not sum to `conversations` within a row, and any one of them can exceed it.

`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.

## Code samples

**TypeScript**

```ts
const result = await bird.amb.stats.conversations.daily();
console.log(result);
```

Examples: [TypeScript](/docs/api/reference/get-amb-conversation-stats-daily.ts.md) · [Python](/docs/api/reference/get-amb-conversation-stats-daily.py.md) · [Go](/docs/api/reference/get-amb-conversation-stats-daily.go.md) · [PHP](/docs/api/reference/get-amb-conversation-stats-daily.php.md) · [CLI](/docs/api/reference/get-amb-conversation-stats-daily.cli.md) · [MCP](/docs/api/reference/get-amb-conversation-stats-daily.mcp.md) · [cURL](/docs/api/reference/get-amb-conversation-stats-daily.curl.md)

## Example response `200`

```json
{
  "period": {
    "from": "2026-05-01",
    "to": "2026-05-25",
    "grain": "day",
    "data_as_of": "2026-05-25T14:03:10Z"
  },
  "attribution": "accepted_time",
  "data": [
    {
      "bucket": "2026-05-25",
      "counts": {
        "started": 210,
        "reopened": 34,
        "closed": 198,
        "conversations": 205
      }
    }
  ]
}
```

## Query parameters

- `from` (string): Start date (inclusive), YYYY-MM-DD. Interpreted as a calendar day in `timezone` (a UTC day when `timezone` is omitted). The window may not exceed 365 days. Defaults to 30 days before `to` when omitted.
- `to` (string): End date (inclusive), YYYY-MM-DD. Interpreted as a calendar day in `timezone` (a UTC day when `timezone` is omitted). The window may not exceed 365 days. Defaults to today in that timezone when omitted.
- `timezone` (string): IANA timezone identifier used to group statistics, for example `Asia/Kathmandu`. The default is UTC. Day and hour boundaries, including the default window when `from` and `to` are omitted, follow this timezone. When this parameter is set, pass `from` and `to` as calendar days or `Z` instants instead of timestamps with explicit UTC offsets.

## Response body

- `period` (object, required): The window and bucket grain the response covers, echoed from the request, plus the freshness boundary the data is current to.
- `period.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.
- `period.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.
- `period.grain` (string, required)

  The bucket grain of the series, either `day` or `hour`.

  Possible values: `day`, `hour`
- `period.data_as_of` (nullable string): Latest time reflected in the statistics. More recent events might not be included yet. Null when the freshness boundary is unavailable.
- `attribution` (string, required)

  Always `event_time` for conversation statistics.

  Possible values: `accepted_time`, `event_time`
- `data` (array of object, required): One row per day or hour in chronological order. Buckets with no activity contain zero counts.
- `data.bucket` (string, required): The day (YYYY-MM-DD) or hour (RFC 3339, on the hour) this point covers, matching the period's grain.
- `data.counts` (object, required): Conversation lifecycle counts for the requested scope, attributed to when each event occurred. A conversation can start, reopen, and close more than once over its life, so `started`, `reopened`, and `closed` can each exceed `conversations`, the number of distinct conversations touched in scope. Very large counts are close estimates rather than exact tallies.
- `data.counts.started` (integer, required): Count of conversation-started events in scope.
- `data.counts.reopened` (integer, required): Count of conversation-reopened events in scope.
- `data.counts.closed` (integer, required): Count of conversation-closed events in scope.
- `data.counts.conversations` (integer, required): Distinct conversations with at least one lifecycle event in scope.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
