npx skills add ...
npx skills add apify/awesome-skills --skill apify-influencer-brand-collabs
npx skills add apify/awesome-skills --skill apify-influencer-brand-collabs
Discover Instagram brand–creator partnerships by chaining Apify Actors. Use when the user asks who collabs with a brand, which brands a creator has done paid posts for, wants to audit an influencer's branded-content history, or wants to scope a brand's sponsorship roster.
Surface Instagram branded-content partnerships by chaining four Apify Actors against Meta's Ad
Library. Distilled from the production influencer-brand-collabs mini-tool.
Don't use for: organic mentions or tags (use a hashtag/mentions scraper), TikTok or YouTube collabs (different platforms), generic competitor ads (query Meta Ad Library directly).
@adidas or https://www.instagram.com/adidas/Direction (brand vs creator) is detected empirically. Do not ask.
| # | Actor | Purpose | Required |
|---|---|---|---|
| 1 | apify/instagram-profile-scraper | Resolve the target's Facebook fbid | ✓ |
| 2 | apify/brand-collaboration-scraper | Pull branded-content posts from Meta's Ad Library | ✓ |
| 3 | apify/instagram-post-scraper + apify/instagram-reel-scraper | Engagement metrics | optional |
| 4 | apify/instagram-profile-scraper (again) | Enrich the result-side partners | optional |
Call each via mcp__claude_ai_Apify__call-actor. Use mcp__claude_ai_Apify__fetch-actor-details
first if you've never run one of these and want the exact input schema.
Grab fbid from the first item. No fbid → can't query Ad Library → stop and tell the user.
Most common cause: private account.
Date range = the lookback window (default 90 days, ending today).
Schema is fixed: every item has creator (always the influencer side) and brandPartners[0]
(always the brand side). Do not try to infer direction from these fields.
Count how often the target username appears on each side of the results:
creator side → target is the influencer; results are the brandsbrandPartners side → target is the brand; results are the creators⚠️ Do not use
isBusinessAccountto infer this. It's unreliable — e.g.@fifaworldcupis a business account but appears as the creator of its own branded content.
Split collab URLs by type:
/reel/... → reel scraper/p/... or /tv/... → post scraperMatch back to collabs via shortcode in the URL: /(p|reel|tv)/([A-Za-z0-9_-]+).
Engagement formula: likesCount + commentsCount + (videoViewCount ?? videoPlayCount ?? 0).
Run the two scrapers in parallel — they're independent.
Collect unique usernames from the side that is not the target. Then:
Only enrich the side the user actually cares about. The input handle is already known.
After aggregation, surface:
For who-questions, the partner list alone is enough. Metrics only matter for which-was-best-questions.
Strip Instagram's _u/ and _n/ deep-link prefixes before extracting the handle:
These slugs are not usernames — skip them:
explore, reels, stories, direct, accounts, about, p, reel, tv, tags,
locations, _u, _n.
fbid. Bail early with a clear message._u/),
confirm the account actually runs branded content. Meta only indexes ads they've classified as
branded content.isBusinessAccount.Full 4-actor run: ~3–5 minutes, a few cents of Apify compute. Order of magnitude:
| Enrichment | Actors run | Approx time |
|---|---|---|
| None | 2 | 1–2 min |
| + Content | 3–4 | 2–4 min |
| + Profiles | +1 | +30–60 s |
If the user just needs a partner list, skip both toggles.
Production route this skill was distilled from:
mini-tools-main/src/app/api/tools/influencer-brand-collabs/route.ts — full transformation logic,
error handling, and slimmed display shapes for each scraper's output.
// actor: apify/instagram-post-scraper
{ "username": ["<post urls>"], "resultsLimit": 1, "dataDetailLevel": "basicData" }
// actor: apify/instagram-reel-scraper
{ "username": ["<reel urls>"], "resultsLimit": 1 }// actor: apify/instagram-profile-scraper
{ "usernames": [<unique result-side usernames>] }/instagram\.com\/(?:_u\/|_n\/)?([A-Za-z0-9_.]+)/i