Campaign Post Checker · Brief Compliance & Post Metrics
Pricing
from $0.04 / post check
Campaign Post Checker · Brief Compliance & Post Metrics
Paste influencer post URLs from TikTok, Instagram, YouTube, Facebook and X plus your brief rules. Get one row per post: live or unavailable, publish date, author, views, likes, comments, #ad and paid-partnership signals, and pass, fail or unknown per rule with what is missing.
Pricing
from $0.04 / post check
Rating
0.0
(0)
Developer
David S
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Campaign Post Checker: brief compliance and post metrics for influencer campaigns
Campaign Post Checker takes a list of influencer post URLs from TikTok, Instagram, YouTube, Facebook and X, plus the rules from your campaign brief. For every post it returns one row: is the post still live, when it was published, who published it, views, likes, comments, shares, the platform's paid-partnership label, and a pass, fail or unknown result for each brief rule with a short list of what is missing.
This is an operational check, not evidence for a dispute and not legal advice. It tells your team which deliverables need a follow-up today. Disclosure rules differ between the FTC, the ASA, the UOKiK and other regulators, so every rule is configurable and the defaults are only a starting point.
What Campaign Post Checker does
- Checks that the post is live. Each row has
status:live,unavailable,unsupportedorerror. A post the platform does not show publicly isunavailablewithunavailableReason: "not_found"; on TikTok, Instagram, YouTube and X this covers deleted posts and also private or login-only ones, because the platform answers the same way. On Facebook a deleted post cannot be told apart from one behind a login, so the reason isunknown. - Reads the post the way a viewer sees it. Caption or description, publish time in UTC, author handle and name, links, hashtags, @mentions, video length and content type.
- Collects public metrics. Views, likes, comments, shares and saves as whole numbers. A metric the platform does not show is
null, never0, andmetricsAvailabilitysays which ones were provided. - Checks your brief. Required phrases and hashtags, @mentions, promo codes, links to your domain, disclosure text and its position, the platform's paid-partnership label, a publication window in your time zone, minimum video length and forbidden phrases.
- Explains every result. Each rule produces a check with what was expected, what was found, where it was found and why it failed or could not be confirmed.
Supported platforms and what is not covered
| Platform | Post types | Paid-partnership label | Metrics |
|---|---|---|---|
| TikTok | videos, photo posts | yes (is_paid_partnership), plus ad and commission labels | views, likes, comments, shares, saves |
| posts, carousels, reels | yes | views (video), likes, comments | |
| YouTube | videos, Shorts, live replays | "Includes paid promotion" label | views, likes, comments |
| posts, videos, reels | not provided | views (video), reactions, comments, shares | |
| X (Twitter) | posts | not provided | views, likes, replies, reposts, bookmarks |
Not covered in this version: Stories on any platform, LinkedIn, Threads, links in the profile bio, pinned comments, spoken mentions inside the video, and screenshots of the post. Story, LinkedIn and Threads URLs come back as unsupported and cost nothing. Private or login-only posts cannot be read: they come back as unavailable with reason not_found (charged as a check on TikTok, Instagram, YouTube and X) or unknown (Facebook, free).
How to check influencer campaign posts
- Open the Actor and paste your post URLs into Posts to check. Add
campaignId,deliverableIdandexpectedAuthorif you want them echoed back in each row. - Put the rules shared by the whole campaign into Brief rules. Override any rule for a single post with that item's own
rules. - Start the run. Results appear in the Overview table in input order; the Issues to follow up view lists what needs attention.
- Export results to CSV, Excel or JSON.
- Save the input as a task and schedule it for the campaign window.
Ready-made tasks
- Influencer campaign tracking: post status, metrics and #ad
- Instagram post insights by URL
- TikTok video analytics by URL
- YouTube video stats checker with paid promotion label
- Instagram reel views checker
- Tweet analytics by URL
- YouTube sponsorship checker
Brief rules example
{"items": [{ "url": "https://www.tiktok.com/@creator_handle/video/7400000000000000000", "deliverableId": "TT-01", "expectedAuthor": "@creator_handle" },{ "url": "https://www.instagram.com/reel/AbCdEfGhIjK/", "deliverableId": "IG-01", "rules": { "minDurationSec": 30 } }],"defaultRules": {"requiredHashtags": ["#brandname"],"requiredMentions": ["@brandname"],"promoCode": "GLOW20","mustLinkDomain": ["brand.com"],"disclosureText": ["#ad", "paid partnership"],"disclosurePosition": "firstNChars","firstN": 125,"disclosureFlag": true,"disclosureMode": "OR","publishedBetween": { "from": "2026-10-01", "to": "2026-10-15", "tz": "Europe/London" },"forbiddenPhrases": ["guaranteed results"]}}
Matching is case-insensitive and respects word boundaries by default, so #ad does not match #adventure and the code GLOW20 does not match GLOW2025. Text is normalized first (Unicode NFKC, zero-width characters removed, line breaks treated as spaces), so stylized letters and line breaks inside "paid partnership" still match.
Output example
Illustrative row (shortened):
{"deliverableId": "TT-01","platform": "tiktok","url": "https://www.tiktok.com/@creator_handle/video/7400000000000000000","status": "live","postedAt": "2026-10-13T11:46:48.000Z","author": { "handle": "creator_handle", "name": "Creator", "verified": null },"authorMatches": true,"hashtags": ["#ad", "#brandname", "#skincare"],"metrics": { "views": 7724, "likes": 1052, "comments": 12, "shares": 21, "saves": 166 },"flags": { "paidPartnership": true, "isAd": false, "eligibleForCommission": false },"compliance": {"result": "fail","missing": ["promo code GLOW20"],"checks": [{ "rule": "disclosure", "result": "pass", "severity": "critical", "expected": "disclosure text OR platform label", "found": "pass/pass", "where": "text, flags", "reason": null },{ "rule": "promoCode", "result": "fail", "severity": "major", "expected": "GLOW20", "found": null, "where": "text", "reason": "Promo code not found as a whole token (presence only; the code itself is not validated)." }]},"evidence": { "fetchedAt": "2026-10-15T10:00:02.000Z", "adapterVersion": "tiktok@1.0.0", "rulesVersion": "r-3f9c0d2a7b1e4c55", "contentHash": "sha256:…" }}
evidence records when the post was read, the parser and rules versions, and a hash of the post content; a changed contentHash between scheduled runs means the caption, links or labels changed.
How pass, fail and unknown are decided
- fail: at least one rule was checked and is not met, for example a missing hashtag or a forbidden phrase.
- unknown: nothing failed, but at least one rule could not be confirmed from the data. Typical cases: the brief requires a link and the post has no links (it may be in the bio, which is not checked), the post links through a shortener, or the brief requires a paid-partnership label on a platform that does not expose it.
- pass: every configured rule was confirmed.
A missing observation is never counted as a pass. Disclosure is reported twice: as text in the caption and as the platform label. disclosureMode: "OR" accepts either; "AND" requires both.
Monitoring schedule for the campaign window
Add an Apify schedule to your task. A common cadence is day 0, 7, 14, 30, 60 and 90 after publication. Every run is a fresh dated snapshot: compare metrics and spot posts that went from live to unavailable or whose caption changed.
Pricing
Pay per event: one post-check event per post that returns a result, that is a live post or an unavailable post the platform reports as not found. Reference price: $0.05 per check on the free Apify plan and $0.04 on paid plans; see the Pricing tab for your plan. Rows with error, unsupported or unavailable: unknown are free; duplicates are checked once.
Control your spend with the run's maximum cost. When it is reached, the remaining posts get statusReason: "run_budget_exhausted" and are not checked or charged.
On the free Apify plan, each run checks up to 10 posts; the rest get statusReason: "free_plan_run_limit" and cost nothing.
Integrations and API
Use the Apify API or send results to Google Sheets, Slack, n8n, Make and Zapier. AI agents can call the Actor through the Apify MCP server at mcp.apify.com.
What this actor does not do
- It does not give legal advice or decide whether a post complies with advertising law.
- It does not prove that a post stayed online between two checks; it records what was visible at the time of each check.
- It does not check spoken words in the video, images, or whether a promo code works at checkout.
- It does not follow shortened links to their destination.
FAQ
How do I check if an influencer post is still live?
Add the post URL to the input and run the Actor. A post that the platform reports as gone comes back as unavailable with reason not_found; a live post comes back as live with fresh metrics.
Can I check #ad and paid partnership disclosure?
Yes. The default rules look for #ad, #sponsored, #paidpartnership, "paid partnership", #gifted and "advertisement" in the caption, and you can require the platform's paid-partnership label as well. Both signals are reported separately.
Why is a result unknown instead of pass?
The Actor only passes what it can see in the post data. A link that may sit in the bio, a shortened link or a label that the platform does not expose leaves the rule unconfirmed, and the check says why.
Is the output enough to withhold payment from a creator?
Treat it as a dated operational record of what to follow up. For disputes, keep your own screenshots and contracts.
Legal & support
The Actor reads public post information: captions, public metrics, public profile handles and platform labels. It does not log in and does not read private messages or data behind a login. The caption is returned as published, so it can contain contact details the author chose to post, such as a business email. You decide what to keep and for how long, and you are responsible for using the results in line with platform terms, privacy law and your agreements with creators. Questions and bug reports: use the Issues tab on this page.