Get Facebook post monetization earnings
Returns lifetime monetization earnings for ONE Facebook post, read live from Meta on every request. Requires the Analytics add-on.
Earnings are CUMULATIVE since the post was published, not earnings within a date range, so this endpoint takes no since/until and the totals must not be summed across dates or across posts. Page-level daily earnings live on /v1/analytics/facebook/page-insights.
A post on a Page that is not enrolled in monetization, or that earned nothing, returns "total": 0 rather than an error: Meta does not distinguish the two. A metric Meta returned no bucket for at all is reported in "unavailableMetrics" and omitted from "metrics", never as a 0.
Amounts are the platform's raw numbers in the stated "unit" and are never rescaled by Zernio. Breakdown dimensions are not exposed and a "breakdown" param is rejected with 400. So are "since", "until", "period", and "metricType": scoping this endpoint to a window is not possible, and silently returning the lifetime total for one would let a caller sum a year of weekly requests into a figure ~52x the post's real earnings.
API key authentication - use your Zernio API key as a Bearer token
In: header
Query Parameters
The Zernio SocialAccount ID for the connected Facebook Page.
The platform post ID, exactly as returned in platformAnalytics[].platformPostId by /v1/analytics: "{pageId}_{postId}", or the bare video ID for Reels.
Comma-separated list of monetization metrics. Defaults to both:
- content_monetization_earnings
- monetization_approximate_earnings
content_monetization_earnings always carries unit "micro_amount" plus an ISO 4217 "currency". monetization_approximate_earnings is always a bare number, so its unit is "unspecified" and its "currency" is null. The two are on different scales and are not comparable to each other. Any other metric name is rejected with 400.
Response Body
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.analytics.getFacebookPostEarnings({ query: { accountId: 'account_abc123', postId: 'post_abc123', },});console.log(data);{
"success": true,
"accountId": "64e1a2b3c4d5e6f7a8b9c0d1",
"postId": "123456789_987654321",
"platform": "facebook",
"period": "lifetime",
"metrics": {
"content_monetization_earnings": {
"total": 1234000000,
"unit": "micro_amount",
"currency": "USD"
},
"monetization_approximate_earnings": {
"total": 1234,
"unit": "unspecified",
"currency": null
}
},
"dataDelay": "Meta restates monetization earnings after the fact. Per-post earnings are lifetime cumulative: they are the total since publication, not earnings within a date range, and must not be summed across dates."
}{
"error": "Unauthorized"
}Get GBP search keywords GET
Returns search keywords that triggered impressions for a Google Business Profile location. Data is aggregated monthly. Keywords below a minimum impression threshold set by Google are excluded. Max 18 months of historical data. Requires the Analytics add-on.
List conversation analytics GET
Per-conversation listing with per-row totals + first/last message timestamps. The inbox analog of GET /v1/analytics (posts listing) — same filter shape, same pagination, same sort/order semantics. Use as the entry point for the per-conversation analytics drawer at /v1/analytics/inbox/conversations/{conversationId}. Rows are enriched with the conversation's participant info (`participantName`, `participantUsername`, `participantPicture`) and last-message preview by joining the Conversation document scoped to the caller's team. Max date range is 365 days.