Reel Insights
facebook_reel_insightsReads Graph insights for a single Facebook Reel by video ID, retrieving plays, watch time, and reactions that post-level insights cannot access.
Instructions
Read Graph insights for one Reel from /{video-id}/video_insights — the edge Reel metrics actually live on, which facebook_post_insights cannot reach. Takes the VIDEO id (digits only, as listed by facebook_list_reels or returned by facebook_create_reel), NOT a "{page-id}_{post-id}" post ID. Same compact shape as the other insights tools: flat rows plus one semantics-aware summary per metric (total removed; read value and aggregation), or summaries only with aggregate:true (output:{format} writes every row to a CSV/JSON file instead). The default period is "lifetime", because plays and watch time are cumulative counters rather than a daily series. Metric names are their own vocabulary — page/post names do not transfer — and Meta's reference lists blue_reels_play_count, post_video_avg_time_watched, post_video_view_time, post_video_likes_by_reaction_type and post_video_social_actions among others; they are examples, not a whitelist, so a name Graph never mentions is reported as unavailable rather than silently dropped. Empty series usually mean the wrong ID, a Reel that is not PUBLISHED yet, or the usual insights lag — the result says which to check.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Inclusive start boundary as a calendar date "YYYY-MM-DD". The range is [since, until); Page period=day boundaries are Pacific Time (America/Los_Angeles), post and Reel boundaries UTC. Omitted ⇒ Graph's own default window. The since..until boundary span may not exceed 90 days per call (checked before the request); read longer histories in slices. | |
| until | No | EXCLUSIVE end boundary as a calendar date "YYYY-MM-DD": for Page period=day, until=2026-08-30 includes the 2026-08-29 Pacific day but not 2026-08-30, and since = until is refused as an empty window. Each returned `date` is Graph's exclusive end boundary of its period, so a window reaching today ends in a partial, still-being-computed bucket. Omitted ⇒ today (Pacific Time for a Page, UTC otherwise). | |
| output | No | Write the FULL series to a local file in FB_EXPORT_DIR instead of returning rows. The row cap does not apply to the file; the inline result is the aggregate-mode summary (no rows, max_rows and aggregate are ignored) plus `export: {path, format, rows, bytes, sha256}`. Use it for long daily series that would otherwise be truncated. | |
| period | No | Aggregation window Graph applies per data point. "day" is a daily series (the Page default); "lifetime" is one cumulative value per metric (the post default); "week"/"days_28" are rolling windows; "month" is calendar-monthly; "total_over_range" collapses since..until into a single value. Not every metric supports every period — a metric queried with an unsupported period comes back empty, which the notes call out. | |
| metrics | Yes | Graph insights metric names to read, e.g. ["page_media_view","page_follows"] (1-20 per call; trimmed and lower-cased). Names are Graph-version dependent and Meta renamed most of them in the 2024-09, 2025-11 and 2026-06 waves: pre-wave names such as "page_impressions" or "page_fans" are dropped before the request and answered with their replacement instead of an error. Graph fails the WHOLE call when one surviving name is invalid: when Graph says which entry it rejected, that name is dropped, the rest are re-read and it is reported in rejectedMetrics; otherwise isolate a suspect name by requesting it alone. Page metrics (page_*) are read on the Page, post metrics (post_*) on a post or Reel. | |
| profile | No | Page profile key (e.g. "brand-a") or a raw Page ID. Omitted ⇒ the default Page (FB_PAGE_ID). | |
| max_rows | No | Lower the per-point row cap for this call (1-250; the default and the ceiling are both 250 — this argument can only shrink it). Rows past the cap are dropped and the result reports how many; prefer aggregate:true over a tiny cap when you only need per-metric summaries. | |
| video_id | Yes | The Reel to read, as its VIDEO id — the item `id` from facebook_list_reels, or the `videoId` returned by facebook_create_reel (also echoed by facebook_get_video_status). A "{page-id}_{post-id}" value is a post, not a video, and does not resolve on the /video_insights edge. The Reel must belong to the resolved Page, whose token authorizes the read. | |
| aggregate | No | True ⇒ return per-metric summaries only and NO per-point rows. Each summary states its `kind` (flow, gauge, unique, unknown) and its `aggregation`, and carries `value` only when one scalar is safe: known flows over disjoint day/month buckets are summed, gauges such as page_follows take the latest value (plus `change`), week/days_28 rolling windows and lifetime counters take the latest window, and unique-audience or unknown day/month series and breakdown maps get aggregation "none" rather than a guess. Use it for wide windows or many metrics when the daily rows would otherwise be truncated. |