Per-creative performance inside TikTok Smart+ ads
Breaks a Smart+ ad (or ad group) down by creative material, one row per Spark post, video or image, from TikTok's Smart+ material report. For a Spark post tiktokItemId is the TikTok post id. Conversion metrics are TikTok web (pixel) events. TikTok allows two dimensions per report, so rows are keyed by the Smart+ ad (level=ad) or by the ad group (level=adGroup), not both. Metrics TikTok returns empty come back as null.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Query Parameters
A tiktok or tiktokads account ID
TikTok advertiser ID
YYYY-MM-DD, in the advertiser's time zone
dateYYYY-MM-DD, on or after startDate
dateKey each row by Smart+ ad or by ad group
"ad"Value in
- "ad"
- "adGroup"
Comma-separated Smart+ ad ids to filter by (up to 100)
Comma-separated ad group ids to filter by (up to 100)
1 <= value11 <= value <= 1000100Response Body
application/json
application/json
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.adinsights.getTikTokSmartPlusMaterialReport({ query: { accountId: 'account_abc123', adAccountId: 'adaccount_abc123', startDate: '2026-01-15', endDate: '2026-01-15', },});console.log(data);{ "adAccountId": "string", "level": "ad", "startDate": "string", "endDate": "string", "page": 0, "pageSize": 0, "totalRows": 0, "totalPages": 0, "rows": [ { "materialId": "string", "materialType": "string", "tiktokItemId": "string", "name": "string", "smartPlusAdId": "string", "adGroupId": "string", "metrics": { "spend": 0, "impressions": 0, "clicks": 0, "cpc": 0, "addToCart": 0, "initiateCheckout": 0, "addPaymentInfo": 0, "purchases": 0, "purchaseValue": 0, "roas": 0 } } ]}Get campaign analytics
Returns performance analytics for a whole campaign in one call: summary metrics, a daily timeline over the requested date range (summed across the campaign's ads), and optional demographic breakdowns. Breakdowns are fetched live from Meta at the campaign level (one call per dimension, no per-ad fan-out), so an agency dashboard gets campaign-level age/gender/etc. without summing thousands of per-ad reads. `campaignId` is the platform campaign id; pass `platform` when a campaign id could be ambiguous across platforms. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. Google adds searchImpressionShare, searchBudgetLostImpressionShare, searchRankLostImpressionShare, searchTopImpressionShare and searchAbsoluteTopImpressionShare under analytics.summary for the requested inclusive range. These ratios are queried together without daily segmentation and cached for 10 minutes. Unavailable values are null. analytics.impressionShareCache reports cachedAt and stale independently of synced metrics.
Get historical keyword metrics
Google Ads only. Runs Keyword Planner's generateKeywordHistoricalMetrics for up to 1,000 exact keywords: historical search volume, competition and top-of-page bid ranges, plus averageCpcMicros when includeAverageCpc is set. Rows come back verbatim; counters are int64s encoded as strings, bid/CPC values are micros of the account currency.