Post Insights
facebook_post_insightsRead insights for one published Facebook post—media views, clicks, reactions, video metrics—as compact rows and per-metric summaries, with aggregate-only or CSV/JSON export.
Instructions
Read Graph insights for one published post (post_media_view, post_clicks, post_reactions_by_type_total, video metrics, ...) in the same compact flat shape as facebook_page_insights: rows plus semantics-aware per-metric summaries (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" — one cumulative value per metric. Post metrics lag minutes to hours after publishing, so empty series on a fresh post are normal and are flagged as such rather than reported as zeros. Reel metrics are NOT reachable through this tool: they live on /{video-id}/video_insights, a different edge — a Reel ID here returns empty series, never Reel numbers. Use facebook_reel_insights with the VIDEO id instead.
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. | |
| post_id | Yes | The published post to read, as Graph's "{page-id}_{post-id}" ID (as returned by facebook_list_posts / facebook_get_post). Permalink URLs and bare numeric IDs are rejected before any request — a bare number is a video/photo ID (see facebook_reel_insights), not a post. The post must belong to the resolved Page, whose token authorizes the read. | |
| 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. | |
| 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. |