DEV Community

Intropix-team
Intropix-team

Posted on AI-assisted

How do you check that influencers actually posted the Instagram stories you paid for? (Python)

The contract said: two stories in launch week, tag the brand, use the link sticker, show the paid partnership label. Checking it meant asking creators for screenshots, which arrived late, cropped, or not at all. And by the time anyone noticed a missing link, the story had expired.

How we solved it

We built the Instagram Stories Scraper on Apify (disclosure: it's ours). It reads a creator's live stories with no Instagram login, and each story comes back with mentions, link_urls, coauthors and is_paid_partnership. Stories last 24 hours, so a run every 12 hours sees each one at least once. The input:

{
  "usernames": ["creator_one", "creator_two", "creator_three"],
  "maxResults": 200
}
Enter fullscreen mode Exit fullscreen mode

maxResults is one total for the run, so set it well above what the creators post in a day; you pay per delivered story, not per slot. Then each story is checked against the brief:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
BRAND, DOMAIN = "yourbrand", "yourbrand.com"

run = client.actor("intropix/instagram-stories-scraper").call(run_input={
    "usernames": ["creator_one", "creator_two", "creator_three"],
    "maxResults": 200})

for s in list(client.dataset(run["defaultDatasetId"]).iterate_items()):
    tagged = BRAND in s["mentions"] or BRAND in s["coauthors"]
    linked = any(DOMAIN in u for u in s["link_urls"])
    labelled = s["is_paid_partnership"] is True
    print(s["username"], s["story_pk"], s["taken_at"],
          "OK" if tagged and linked and labelled else
          f"tagged={tagged} linked={linked} labelled={labelled}")
Enter fullscreen mode Exit fullscreen mode

We append each run's items to a JSONL file, deduplicated on story_pk, and download media_url in the same job, because that link expires with the story.

What came out

A real story item, trimmed (National Geographic, 16-07-2026):

{
  "username": "natgeo",
  "story_pk": "3942549043641043661",
  "taken_at": "2026-07-16T13:28:11Z",
  "expiring_at": "2026-07-17T13:28:11Z",
  "media_type": "image",
  "is_paid_partnership": false,
  "link_urls": [],
  "mentions": ["disneyparks", "disneyland"],
  "coauthors": []
}
Enter fullscreen mode Exit fullscreen mode

Run against the brief, this one would print tagged=False linked=False labelled=False. The per-creator count of OK lines against the contracted number is the report we sent the client.

Cost

Ten creators, two runs a day, 30 stories a day seen twice: 2 x ($0.005 + 10 x $0.002) + 60 x $0.0025 = $0.20 a day.

The caveat

Only live stories are visible. A story posted and deleted between two runs is never seen, and story views and reach are not public, so you still need the creator's own insights for those.

For the feed side of the same check, the paid partnership label on posts and reels, see tracking brand deals with the PRO Instagram Posts & Reels Scraper, or use the standard Instagram Posts & Reels Scraper at $1.90 per 1,000 posts when captions, likes, comments, views, dates and that label are enough.

The full field list, scheduling and CSV export are in How to scrape Instagram stories without login.

Top comments (1)

Collapse
 
shuttlewright profile image
Shuttlewright •

The expired-story problem is why verification has to be a contract term, not a favour. Two clauses that end the screenshot chase: the creator posts within a stated window and the brand can check the live story in that window, and the creator sends the story's own analytics screenshot within 24 hours of expiry as part of final payment. Most working creators can already pull these, so the clause costs them little, and the ones who resist it are telling you something. Automating the check is a nice backup; the contract is what makes the backup rarely needed.