Skip to main content

What it does

Returns Meta’s template analytics for up to 10 templates of a single application: an overall summary, 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 dataAvailableUntil watermark are flagged isPending: true, telling you the day is not yet aggregated rather than genuinely empty.
  • Derived ratesdeliveredRate, readRate, clickRate, and costPerDelivered are 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

There are no body parameters.

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.
Limits: at most 10 templateId values and at most a 90-day range per request. Split larger reports into several calls.

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

The top-level summary aggregates both templates, while templates[] keeps them separate and in the order you sent them:
Meta has aggregated up to 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.
Metrics outside the core set are surfaced per bucket under additionalMetrics:
The response echoes the applied choice so you can label your charts correctly:

Errors

object
Error details with code, group, and description; isSuccess is false.

Auth / tenant

Request validation

Meta-side

Example error responses: