What it does
Returns Meta’s template analytics for up to 10 templates of a single application: an overallsummary, a per-template summary, and a daily series.
- Gap-filled buckets — days Meta returns no data for are emitted as zero points, so the series is always continuous across the requested range.
- Pending days — zero points beyond Meta’s
dataAvailableUntilwatermark are flaggedisPending: true, telling you the day is not yet aggregated rather than genuinely empty. - Derived rates —
deliveredRate,readRate,clickRate, andcostPerDeliveredare computed for you and rounded to 4 decimals.
This endpoint is per-application and per-template. For organization-wide message volume, use Get Messages instead.
Endpoint
Headers
string
required
Secret key in
Bearer sk_... format. See Secret Key authentication.Path parameters
string
required
Application ID. Must belong to the organization (otherwise
404).Query parameters
string[]
required
Repeatable:
?templateId=a&templateId=b. Between 1 and 10 IDs per request. Blank values are discarded and duplicates are collapsed before the request reaches Meta; more than 10 distinct IDs returns 422.string
default:"30 days before today 00:00:00 (UTC)"
ISO-8601 datetime. Start of the range.
string
default:"today 23:59:59 (UTC)"
ISO-8601 datetime. End of the range. Must be greater than
startDate, and the total span cannot exceed 90 days.string
default:"DAILY"
Bucket size of the
series. DAILY is the only value Meta exposes for template analytics, so this is effectively fixed.string[]
default:"core set"
Repeatable. Omit for the full core set (
SENT, DELIVERED, READ, CLICKED, COST). Conversion metrics can be requested explicitly. See Template Metrics Metric Type.string
Restricts the result to one messaging product:
CLOUD_API or MARKETING_MESSAGES_LITE_API. Omit for all products.boolean
default:"false"
When
true, Meta buckets the days in the WABA’s own timezone instead of UTC. The applied choice is echoed back as usesWabaTimezone.Response
The envelope is{ "data": {...}, "isSuccess": true }, where data carries the range metadata, an overall summary, and one entry per requested template.
boolean
true when the request completed successfully.object
Invariants:
Σ series[].sent == summary.sent for each template (the same holds for delivered, read, clicked, and amountSpent), and the top-level summary is the sum of every template summary. Rates are always recomputed from the totals, never averaged from the buckets.Examples
Demo 1 — single template (defaults: last 30 days, daily)
Demo 1 — single template (defaults: last 30 days, daily)
Demo 2 — multiple templates (repeatable templateId)
Demo 2 — multiple templates (repeatable templateId)
summary aggregates both templates, while templates[] keeps them separate and in the order you sent them:Demo 3 — pending days (today is not aggregated yet)
Demo 3 — pending days (today is not aggregated yet)
2026-08-12T00:00:00, so the following bucket is emitted as a zero point flagged isPending: true — the day is not empty, it is simply not ready.Demo 4 — conversion metrics (metricType) → additionalMetrics
Demo 4 — conversion metrics (metricType) → additionalMetrics
additionalMetrics:Demo 5 — WABA timezone buckets
Demo 5 — WABA timezone buckets
Demo 6 — error: more than 10 template IDs → 422
Demo 6 — error: more than 10 template IDs → 422
Demo 7 — error: range wider than 90 days → 422
Demo 7 — error: range wider than 90 days → 422
Errors
object
Error details with
code, group, and description; isSuccess is false.Auth / tenant
Request validation
Meta-side
Example error responses: