Find Paid Partnership Posts on Any Instagram Profile
List the paid partnership and branded posts on any public Instagram profile, and the brands behind them, using Instagram Post Scraper and Python.
The actor referenced in this article. Pay only for results delivered.
Brands want to know which creators and publishers their competitors pay, and agencies want to know how much of a creator’s feed is already sponsored before they pitch. On Instagram that information sits in a small paid partnership line above each post and in the caption, one post at a time. Checking a hundred posts by hand means opening a hundred posts and reading every caption to the end.
Try it live: Instagram Post Scraper: Photos, Carousels, Likes, No Login. Pay per result delivered. Failed and empty results are never charged.
The Instagram Post Scraper returns every post on a public profile, photos, carousels and videos, as one row each, with the paid partnership flag, the coauthors, the tagged accounts and the full caption. A short filter over those fields gives you the list, and catches branded posts that the flag alone misses.
What you get and who it is for
| Field | What it tells you |
|---|---|
isPaidPartnership | True when the post carries Instagram’s paid partnership flag |
coauthorProducers | Accounts credited as collab partners; a brand often shows up here |
taggedUsers | Accounts tagged on the post or on any of its slides |
caption, mentions, hashtags | Disclosure text such as “Presented by” or #ad, and the brand’s handle |
type | Image, Sidecar (a carousel) or Video |
likesCount, commentsCount | How the sponsored posts did next to the rest of the feed |
timestamp, url | When the post went up and where to open it |
This is for brand managers checking which accounts a competitor sponsors, influencer agencies measuring how sponsored a creator’s feed already is, and compliance teams checking that branded posts carry a disclosure.
The input
{
"usernames": ["natgeo"],
"maxPostsPerProfile": 300,
"newerThan": "3 months"
}
- There is no input option for paid partnerships. The flag is on every row, so the filtering happens after the run.
newerThanstops reading a profile at the first post older than the window, andmaxPostsPerProfile(10 to 300) is the ceiling; whichever comes first ends that profile. natgeo put 14 posts on its grid in five days, October 1 to October 6, 2026, so three months of that account is a couple of hundred posts, inside the cap.postTypesis left at its default of all three types. Sponsored content can be a photo, a carousel or a video, and in our sample the flagged posts were single photos.usernamestakes up to 500 profiles per run, so a whole list of creators or publishers can go in one run.
What the output looks like
[
{
"inputUrl": "natgeo",
"shortCode": "DeEsdp9ISZf",
"url": "https://www.instagram.com/p/DeEsdp9ISZf/",
"type": "Image",
"caption": "Presented by @Rolex. Conservation ecologist and Rolex National Geographic Perpetual Planet Explorer...",
"hashtags": ["Rolex", "AfricaEarthsWildHome", "PerpetualPlanet"],
"likesCount": 31489,
"commentsCount": 77,
"timestamp": "2026-10-04T13:02:58.000Z",
"ownerUsername": "natgeo",
"coauthorProducers": [],
"taggedUsers": [],
"isPaidPartnership": true
},
{
"inputUrl": "natgeo",
"shortCode": "DeE0VYSFMHJ",
"url": "https://www.instagram.com/reel/DeE0VYSFMHJ/",
"type": "Video",
"caption": "A simple branch becomes a fishing rod in the hands of these resourceful chimpanzees...",
"mentions": ["Rolex", "DisneyPlus", "hulu"],
"likesCount": 32086,
"commentsCount": 131,
"timestamp": "2026-10-04T16:00:03.000Z",
"ownerUsername": "natgeo",
"coauthorProducers": ["rolex"],
"taggedUsers": ["rolex"],
"isPaidPartnership": false
}
]
Both rows come from our run on natgeo and nasa on October 7, 2026, which read the 12 newest posts of each. Of natgeo’s 12 posts, 9 had “Presented by @Rolex” in the caption, but only 2 carried the paid partnership flag, both single photos like the first row. The second row, a reel, has Rolex as coauthor and tagged account and the same caption line near its end, yet isPaidPartnership is false. Counting the flag alone would have found 2 of the 9 Rolex posts, which is why the script below checks three signals.
Run it in Apify Console
- Open https://apify.com/themineworks/instagram-post-scraper and click Try for free.
- In Instagram profiles, replace the prefilled natgeo and nasa with the profiles you want to check.
- Set Max posts per profile to 300 and Only posts newer than to 3 months. Leave Post types with all three selected, Skip pinned posts on, and Proxy as it is.
- Click Start and wait for the run to finish in the Output tab.
- Click Export and download CSV, JSON or Excel. In the sheet, filter
isPaidPartnershipto true, then search the caption column for “presented by”, “#ad” and “sponsored”.
Run it from Python
Install the client with pip install apify-client. The script flags a post when it has the paid partnership flag, a disclosure phrase in the caption, or a coauthor that is not one of the profile’s own sister accounts, and writes the flagged posts to a CSV.
import csv
import re
from collections import Counter
from apify_client import ApifyClient
PROFILES = ["natgeo"]
SISTER_ACCOUNTS = {"natgeoscience", "natgeotv", "natgeodocs", "natgeosociety", "natgeobooks"}
DISCLOSURE = re.compile(r"presented by|paid partnership|sponsored by|#ad\b|#sponsored", re.I)
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/instagram-post-scraper").call(run_input={
"usernames": PROFILES,
"maxPostsPerProfile": 300,
"newerThan": "3 months",
})
flagged, total = [], 0
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("_type") == "info":
continue # the run summary row, never billed
total += 1
caption = item.get("caption") or ""
partners = [u.lower() for u in item.get("coauthorProducers", [])
if u.lower() not in SISTER_ACCOUNTS and u != item["inputUrl"]]
reasons = []
if item.get("isPaidPartnership"):
reasons.append("flag")
if DISCLOSURE.search(caption):
reasons.append("caption")
if partners:
reasons.append("coauthor")
if not reasons:
continue
mentions = [m.lower() for m in item.get("mentions", [])]
flagged.append({
"profile": item["inputUrl"],
"posted": item["timestamp"][:10],
"url": item["url"],
"type": item["type"],
"owner": item["ownerUsername"],
"reasons": "+".join(reasons),
"brand_guess": (partners or mentions or [""])[0],
"likes": item["likesCount"],
"comments": item["commentsCount"],
"caption": caption[:200].replace("\n", " "),
})
with open("paid_partnerships.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["profile", "posted", "url", "type", "owner",
"reasons", "brand_guess", "likes", "comments", "caption"])
writer.writeheader()
writer.writerows(flagged)
print(f"{len(flagged)} of {total} posts show a partnership signal")
print("by reason:", Counter(r for row in flagged for r in row["reasons"].split("+")))
print("by brand:", Counter(row["brand_guess"] for row in flagged).most_common(5))
On the 12 natgeo posts from our October 7 sample, the same logic flags 9 posts: 9 by caption, 2 by flag and 1 by coauthor, all pointing at rolex. Treat rows flagged only by coauthor as leads to review by hand, since collabs between friends, teams or sister accounts are common and most are not paid.
Run the audit every month
In Apify Console, save the input as a task with newerThan set to 30 days, open Schedules, create a schedule with the cron expression 0 8 1 * * (08:00 on the first of each month) and add the task. The schema has no “only new posts” option; the 30 day window does that job, and reading stops at the first older post, so you pay only for the month’s posts. Apify’s Google Sheets integration can send each month’s dataset to a sheet, and Make, Zapier, n8n or a webhook can post the flagged rows to Slack or your own system when the run finishes.
What it costs
The price is $1.49 per 1,000 posts on the Bronze plan, $1.29 on Silver, and $0.99 on Gold, Platinum and Diamond, plus a flat $0.005 run start fee per run. A carousel costs the same as a single photo.
An audit of 10 profiles with 100 posts each in the window is 1,000 posts: $1.49 on Bronze, $1.29 on Silver and $0.99 on Gold, plus one $0.005 start fee. A monthly recheck of a single profile at natgeo’s pace, about 80 posts a month, comes to about $0.12 on Bronze plus the start fee.
Limits worth knowing
- The flag only catches posts where Instagram shows the paid partnership label. Our natgeo sample shows branded posts without it, so read caption and coauthor matches as leads, not proof. A model reading the caption catches wordings a phrase list misses, and social posts are a common input for that kind of LLM work.
- There is no field that names the sponsor behind the flag. The brand has to come from
coauthorProducers,mentionsor the caption. - Hashtag, keyword and location search need a login, which this actor never uses. You cannot search all of Instagram for #ad; give profiles or post links.
- You get like and comment counts, not comment text, and no view counts for video posts. For reel views, use Instagram Reel Scraper.
- Private accounts return no posts. They are listed in the run’s
OUTPUTrecord and not charged.
Related
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Can I filter for paid partnerships in the input? +
No. There is no input filter for it. Every row carries isPaidPartnership as true or false, so you filter the dataset after the run.
Does the paid partnership flag tell me which brand paid? +
Not as a separate field. In the flagged natgeo posts we checked, the brand was in the caption, mentions and hashtags. When a brand is credited as a collab partner, it also appears in coauthorProducers.
Does this work for reels too? +
Reels and videos on a profile's grid come back as type Video with the same isPaidPartnership field. If you also want play counts, Instagram Reel Scraper returns the same flag for reels.
What happens with private profiles? +
They return no posts and are not charged. The run's OUTPUT record lists them with the status private.
Export Every Image and Caption From Instagram Carousel Posts
Export every slide image link, slide type and caption from Instagram carousel posts to a CSV, by profile or by post link, with Instagram Post Scraper.
Export a Creator's Instagram Reels With Play Counts to a Spreadsheet
Export one creator's reels with plays, likes, comments, length and audio to a CSV, then compute median plays to vet them, with Instagram Reel Scraper.
Track Competitor Instagram Reels Weekly With View Counts
Log every new reel your competitors post each week, with plays, likes and audio, using Instagram Reel Scraper on a weekly Apify schedule.
Benchmark LinkedIn Post Engagement Across Company Pages
Compare reactions and comments per post across LinkedIn company pages, scaled by follower count, with the LinkedIn Company Posts Scraper. No login.