Creator insights.
Report impressions as they happen; read back per-post views, unique reach, engagement, and a daily series — plus a follower time series per actor. Insights reads are gated by social.analytics.read; your backend decides who sees them (the same trust model as story viewers).
1
Report impressions
Batch impressions to POST /posts/impressions (debounce client-side, max 200 ids per call). Pass viewer_actor_id to count the impression toward unique reach — deduped per viewer, per post, per day. Omit it for anonymous traffic, which still counts total views but not reach. Ids that aren't published posts in the community are skipped silently, so a deleted post mid-batch never fails the rest. Needs social.view; the two read endpoints below need social.analytics.read.
curl -X POST -H "Authorization: Bearer pcft_live_..." \
-H "Content-Type: application/json" \
-d '{"post_ids":["<post1>","<post2>"],"viewer_actor_id":"<viewer>"}' \
"https://social.productcraft.co/v1/communities/<c>/posts/impressions" # 2042
Post insights
Total views + unique reach, engagement counts, and a daily { views, reach } series over an optional ?from/?to window of YYYY-MM-DD dates (defaults to the trailing 30 days; a span over 366 days is a 400). Days with no traffic are absent from daily.
curl -H "Authorization: Bearer pcft_live_..." \
"https://social.productcraft.co/v1/communities/<c>/posts/<post>/insights?from=2026-05-01&to=2026-05-31"
# → { post_id, community_id, views, unique_reach, reaction_count,
# comment_count, repost_count, quote_count,
# daily: [ { day, views, reach } ] }3
Actor follower series
The live follower count plus a daily series built from a nightly snapshot taken after the 04:00 UTC counter reconcile. Same optional ?from/?to window as post insights. daily only has points for days that were snapshotted — it is empty for an actor created since the last run.
curl -H "Authorization: Bearer pcft_live_..." \
"https://social.productcraft.co/v1/communities/<c>/actors/<actor>/insights"
# → { actor_id, community_id, follower_count,
# daily: [ { day, follower_count } ] }Privacy. Reach rows are keyed by viewer and are personal data — they're erased when the viewer's actor is deleted (the aggregate view tallies carry no viewer identity). See data-subject requests. Insights are aggregate by design — there is no raw per-viewer impression export.