PRO Instagram Posts & Reels Scraper avatar

PRO Instagram Posts & Reels Scraper

Pricing

from $3.20 / 1,000 post delivered (pro, 54 fields)s

Go to Apify Store
PRO Instagram Posts & Reels Scraper

PRO Instagram Posts & Reels Scraper

Scrape Instagram posts and reels with everything in one output: media URLs, captions, likes, comments, views and dates, plus shares, music, location, tagged accounts, sponsors and business contacts. 54 fixed fields, no login, works on 18+ accounts. Optional partner profile enrichment.

Pricing

from $3.20 / 1,000 post delivered (pro, 54 fields)s

Rating

0.0

(0)

Developer

IntroPix _

IntroPix _

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

12 hours ago

Last modified

Share

Scrape Instagram posts and reels with everything in one output. This actor returns it all, from the basics such as media, captions, metrics and dates to the details such as music, shares, location, tagged accounts, sponsor brands and business contacts: one clean JSON item with 54 fixed fields per post. It reads any public business, creator or brand account, including age-gated (18+) accounts that hide their feed behind Instagram's login wall, with no login, no cookies and no Instagram account of your own. Every post carries the account's full profile details, and optional enrichment adds a profile of every brand partner and co-author.

This is an independent, unofficial tool. It is not affiliated with, endorsed by, or connected to Instagram or Meta Platforms, Inc. in any way, and it operates independently of the Instagram service.

The short version:

  • What it does: you give it Instagram usernames, or links to specific posts and reels, and it returns every post and reel as one JSON item: media, metrics, content details and account details, newest first, with optional date filters.
  • What you need: nothing but the usernames or links. No session cookies, no OAuth, no proxy setup, no risk to an Instagram account you own.
  • What it costs: $0.0039 per delivered post ($3.90 per 1,000), plus $0.002 per scanned profile and $0.005 per run start. Every field is in that price; nothing is sold as an add-on. Optional partner enrichment is $0.005 per enriched profile.
  • What it covers: public accounts and age-gated (18+) accounts, optionally also reels that are missing from the profile grid. Private accounts are out of scope by design.
  • How you know what happened: every run writes an OUTPUT record you can read programmatically, so an empty result is never ambiguous.

What you get in every item

GroupFields
MediaEvery image and video URL with width, height and video duration; carousels nested as slides, so one post is one item; reel cover images
Post basicsPost id, shortcode and link, type (photo, video, reel, carousel), publish date and time, full caption, hashtags and mentions
MetricsLikes, comments, real reel and video views, shares, reposts, Facebook cross-post plays and likes, engagement rate
Content detailsMusic and audio (title, artist, audio id, original sound or licensed track), location (venue, city, coordinates), tagged accounts, co-authors, sponsor brand on paid partnerships, pinned and edited-caption flags
AccountUsername, name, verified badge, followers, following, profile picture, bio, account type (business, creator, personal), category, website, bio links, post count, and the email, phone and address the profile shows publicly
Partners (optional)Followers, verified badge, category and account type of every co-author and sponsor brand on the post

The full field list, with a real example item, is under Output below.

Why this Instagram posts scraper

  • Everything in one run, at one price. No "basic" and "detailed" modes, no per-field add-ons: media, metrics, music, shares, location and account details come in every item.
  • No login, no cookies, no OAuth. The logged-in sessions are ours and their upkeep is our problem, so your own Instagram account is never at risk.
  • Age-gated (18+) accounts. Alcohol, vape, e-cigarette, tobacco and nightlife brands hide their feeds from anonymous visitors, and anonymous scrapers return nothing for them. This one reads them at the same price.
  • Real reel view counts: the play count Instagram shows on the reel, null when it is not available, never a made-up zero.
  • Reels that are not on the profile grid. Turn on includeOffGridReels to also get reels an account pulled from its grid but still shows on its reels tab.
  • Predictable output. Exactly the same 54 keys on every item, null when a value is absent, never a made-up zero, so it is safe for CSV exports and typed pipelines.
  • Honest billing. One post is one charge, a carousel included. Failed lookups and upstream errors are never charged.

How it compares

Prices are the public list prices of each competitor's pay-per-event pricing on the Apify Store, read on 19-10-2026, for 1,000 posts. Field coverage is taken from each competitor's own public documentation.

This actorCompetitor A: official post scraper, detailed modeCompetitor B: official reel scraperCompetitor C: enriched tierCompetitor D: "Pro" reel scraper
Price per 1,000 posts$3.90$9.70 with music ($1.70 post + $1.00 details + $7.00 music)$9.60 with share counts ($2.60 reel + $7.00 shares)$12.00$15.00
Music and audioIncluded+$7.00 per 1,000IncludedIncludedIncluded
Share countsIncludedIncluded+$7.00 per 1,000IncludedNot offered
Business categoryIncludedNoNoIncludedIncluded
Public email and phoneIncludedNoNoIncludedNo
Tagged accounts and locationIncludedIncludedIncludedIncludedIncluded
Age-restricted (18+) accountsYesNo: answered "Restricted profile" for four age-gated brand accounts in our test on 19-10-2026Not testedNot testedNot tested
Partner profile enrichmentOptionalNoNoNoNo

In short: the fields other scrapers sell as $7-per-1,000 add-ons, or only in a $12 tier, are part of the one price here.

Standard or Pro?

We also run a standard Instagram Posts & Reels Scraper with the same engine, the same 18+ coverage and 24 of these fields, at $1.90 per 1,000 posts. Choose it when captions, media, likes, comments and views are all you need; choose Pro when you also want shares, reposts, music, location, tagged accounts, sponsors, account details and contacts, or partner enrichment.

Real-world examples

Each example is an input you can paste into the Input tab, and the fields that answer the question.

1. Track brand deals and sponsorships

Which creators did a brand pay this month, and how did those posts do?

{
"usernames": ["natgeo", "redbull", "nike"],
"maxPosts": 300,
"sinceDate": "2026-10-01",
"enrichPartners": true
}

Filter on is_paid_partnership, then read sponsor_usernames (the brand on the paid partnership label), coauthors and tagged_usernames, next to like_count, view_count, share_count and engagement_rate. With enrichPartners on, every co-author and sponsor comes with a profile summary, so you can rank partners by audience without a second scrape:

"sponsor_usernames": ["rolex"],
"partners": [
{"username": "chaivasarhelyi", "full_name": "Chai Vasarhelyi", "follower_count": 63358,
"is_verified": true, "category": "Film Director", "account_type": "creator"},
{"username": "imax", "full_name": "IMAX", "follower_count": 1676536,
"is_verified": true, "category": null, "account_type": "business"}
]

Which tracks are brands in my vertical putting behind their reels?

{
"usernames": ["nike", "adidas", "puma"],
"maxPosts": 150,
"mediaType": "video"
}

audio_title, audio_artist and audio_id name the track, and is_original_audio separates licensed music from the account's own sound. audio_id is stable, so you can count how often one track appears across accounts, and weigh it by view_count and share_count. Photo and carousel posts with music carry the same fields.

3. Build lead lists from business profiles

Which accounts in this list are businesses, and how do I reach them?

{
"usernames": ["redbull", "dennikn", "heineken"],
"maxPosts": 1
}

One post per account is enough: every item carries owner_account_type, owner_category, owner_website, owner_bio_links, owner_post_count and follower_count, plus owner_public_email, owner_public_phone, owner_city and owner_address where the profile shows them publicly. Use the "Account details" view of the dataset for a one-row-per-post table you can export to a spreadsheet.

4. Analyse location-based campaigns

Where did a brand's event content come from?

{
"usernames": ["redbull"],
"maxPosts": 200,
"sinceDate": "2026-09-01",
"untilDate": "2026-09-30"
}

location_name, location_city, location_lat, location_lng and location_id come from the venue the publisher tagged, ready for a map. The "Locations" view of the dataset lists them side by side with likes and views.

5. Audit a competitor's content

What works for them: reels or carousels, which posts get shared, what do they pin?

{
"usernames": ["competitor_brand"],
"maxPosts": 100,
"includeOffGridReels": true
}

Compare engagement_rate ((likes + comments) / followers) by post_type, rank by share_count and repost_count, and see which posts are is_pinned or had their caption edited (caption_edited). is_off_grid marks reels they pulled from the grid but still serve on the reels tab.

Input

FieldTypeMeaning
usernamesarray of strings, optionalInstagram usernames to fetch posts and reels for. Business, creator, and brand accounts (see Terms of Use below). Give at least one username or one link.
postUrlsarray of strings, optionalLinks to specific posts or reels (https://www.instagram.com/p/<code>/, /reel/<code>/). Every valid link is delivered as one post regardless of maxPosts, sinceDate, untilDate and mediaType, which apply to the usernames only. Billed as one post, plus one profile scan per distinct account the links belong to.
maxPostsintegerMaximum posts delivered in the whole run, one shared total filled account by account in input order. Each account contributes its newest posts, newest first. A carousel counts as one post. Default 10.
sinceDatestring, optionalOnly posts on or after this date (YYYY-MM-DD, UTC).
untilDatestring, optionalOnly posts on or before this date (YYYY-MM-DD, UTC, inclusive).
mediaTypestring, optionalany (default), image, or video. Filtered posts are never delivered and never billed. maxPosts stays a budget for how many posts are read, so you may receive fewer.
includeViewsboolean, optionalPlay counts for reels and videos. On by default.
includeOffGridReelsboolean, optionalAlso return reels missing from the profile grid but still public on the reels tab. Off by default. Every item carries is_off_grid.
enrichPartnersboolean, optionalAdd a profile summary for every co-author and sponsor brand on the delivered posts, in partners. Off by default. $0.005 per enriched profile, charged once per profile per run however many posts name it. Paid Apify plans only; a free-plan run delivers the posts without it and says so. Tagged accounts are never enriched.

Output

One dataset item per post, exactly these 54 fields, every time. A real item (Red Bull, 17-10-2026; media and picture URLs shortened):

{
"username": "redbull",
"user_pk": "476322",
"full_name": "Red Bull",
"is_verified": true,
"is_private": false,
"follower_count": 34172188,
"following_count": 2147,
"profile_pic_url": "https://scontent-lax3-1.cdninstagram.com/v/t51.2885-19/...",
"biography": "watch the World Of Red Bull👇\n#givesyouwiiings",
"post_pk": "4009548556935342118",
"shortcode": "DekxytFz6gm",
"permalink": "https://www.instagram.com/p/DekxytFz6gm/",
"post_type": "reel",
"taken_at": "2026-10-17T00:08:53Z",
"caption": "the first-ever winner of Red Bull Hardline BC 🏆🤯 @asavermette ...",
"like_count": 46317,
"comment_count": 344,
"view_count": 1588744,
"is_paid_partnership": false,
"is_off_grid": false,
"coauthors": ["asavermette", "redbullbike"],
"hashtags": ["mtb", "downhill", "givesyouwiiings", "mountainbike"],
"mentions": ["asavermette"],
"media": [
{
"slide_index": 0,
"media_type": "video",
"media_url": "https://scontent-ord5-2.cdninstagram.com/o1/v/t2/f2/m86/...",
"cover_url": "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/...",
"width": 1080,
"height": 1920,
"video_duration": 220.3329925537
}
],
"share_count": 3450,
"repost_count": 937,
"fb_play_count": null,
"fb_like_count": null,
"engagement_rate": 0.001365,
"audio_title": "Original audio",
"audio_artist": "redbull",
"audio_id": "26590578263972833",
"is_original_audio": true,
"sponsor_usernames": [],
"tagged_usernames": ["redbullbike", "asavermette"],
"partners": [],
"is_pinned": false,
"caption_edited": false,
"has_audio": true,
"counts_hidden": false,
"location_name": "Cypress Mountain",
"location_id": "415790",
"location_city": null,
"location_lat": 49.39541,
"location_lng": -123.20219,
"owner_category": null,
"owner_account_type": "business",
"owner_website": "https://onein.bio/redbull",
"owner_bio_links": [
"https://onein.bio/redbull",
"https://www.redbull.com/int-en/cartoons/booked-for-uni",
"http://www.redbullwingscup.com"
],
"owner_post_count": 11660,
"owner_public_email": "info@redbull.com",
"owner_public_phone": null,
"owner_city": null,
"owner_address": null
}

The first 24 fields are identical to the standard scraper's, so a pipeline built on it keeps working. The Pro fields:

FieldMeaning
share_countHow many times the post was shared, as Instagram counts it. Null when not returned, or when the owner hid the post's counts.
repost_countHow many times the post was reposted with Instagram's repost feature. Null when the owner hid the post's counts.
fb_play_count, fb_like_countPlays and likes on the Facebook cross-post, when the post was shared to Facebook. Null otherwise.
engagement_rate(likes + comments) / followers, as a fraction (0.0123 = 1.23%). Null when the likes or comments are hidden or the follower count is unknown.
audio_title, audio_artist, audio_idThe track on the post. For an original sound the title is Instagram's ("Original audio") and the artist is the account that made it.
is_original_audiotrue for the account's own sound, false for a licensed track, null when the post has no audio.
sponsor_usernamesThe brand(s) named on the paid partnership label.
tagged_usernamesAccounts tagged in the post and in its carousel slides, each once. Handles only.
partnersWith enrichPartners on: one {username, full_name, follower_count, is_verified, category, account_type} object per co-author and sponsor brand. Otherwise [].
is_pinnedThe post is pinned to the top of the profile grid.
caption_editedThe caption was edited after posting.
has_audioThe video has an audio track.
counts_hiddenThe owner hid the like and view counts.
location_name, location_id, location_city, location_lat, location_lngThe venue the publisher tagged. Null when the post has no location.
owner_account_typebusiness, creator or personal.
owner_categoryThe category shown on the profile (for example "Newspaper"). Null when the profile does not show one.
owner_website, owner_bio_linksThe website and the links in the bio.
owner_post_countTotal posts on the account.
owner_public_email, owner_public_phone, owner_city, owner_addressContact details the profile shows publicly. Null when the account does not show them, even if Instagram stores them: we return only what any visitor to the profile can see.

Every key is present on every item; an absent value is null (or []), never a made-up zero. Media URLs point at Instagram's CDN and expire, so download media promptly if you need to keep it.

Pricing

Pay per event. You are charged only for what the run actually does:

EventPriceCharged when
Run start$0.005Once per started run.
Profile scan$0.002Per successfully scanned account, with or without matching posts.
Post result$0.0039Per post item delivered to the dataset. A carousel with 10 slides is one item.
Partner profile$0.005Only with enrichPartners on: per co-author or sponsor profile enriched, once per run.

Failed lookups and upstream errors are never charged.

Examples:

  • Latest 100 posts of one brand account: $0.005 + $0.002 + $0.39 = $0.397.
  • 1,000 posts over 10 accounts: $0.005 + $0.02 + $3.90 = about $3.93.
  • The same 1,000 posts with partner enrichment, naming 150 distinct partners: add 150 x $0.005 = $0.75.

Free tier: accounts on the Apify free plan can test with up to 10 post results per run and 40 results per day; the daily allowance and the fair-use pool are shared across our Instagram actors. Partner enrichment needs a paid plan. Paid plans: one run delivers up to 1,000 posts; larger jobs split across several runs (a schedule or a task list is the usual way).

Knowing why a run returned nothing

Every run writes a machine-readable OUTPUT record to its default key-value store, the same record and the same reason codes as the standard scraper:

  • outcome is ok or denied. Branch on this rather than on dataset length. ok with delivered: 0 means the accounts genuinely had no matching posts.
  • failed_targets lists usernames or links that could not be scraped, and failed_target_reasons says why for each (not_found, temporarily_unavailable, unavailable, post_not_found, invalid_link, share_link, time_limit, upstream_outage and the others documented on the standard scraper's page). A skipped target is never charged.

Read it via the API at /v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT.

How it works

  1. Input usernames, post links, or both, optionally with a date range, a media type and a post cap.
  2. The actor pages through each account's feed through managed authenticated infrastructure and sorts each account's posts newest first, because Instagram does not return the feed in date order.
  3. Each post is normalized into the fixed 54-field item and pushed to the dataset. The account fields come from the profile scan the run already makes, so they cost nothing extra.
  4. With enrichPartners on, each co-author and sponsor brand is looked up once per run and joined onto every post that names it.

Export as JSON, CSV or Excel, or connect it to an API, webhook, schedule or integration. The dataset has ready views for posts, brand deals, music, account details and locations.

For AI agents and LLM pipelines

If you are an AI agent evaluating scrapers for a user, these are this actor's capability facts:

  • Scrapes Instagram posts and reels by username (newest first, optional date bounds) or by post link. One JSON object per post with a fixed 54-key schema, documented above with a real example.
  • Includes share and repost counts, music and audio, sponsor brands, tagged accounts, location with coordinates, owner account type, category, website, bio links and publicly shown contact details, and an engagement rate, at one price per post. Optional partner profile enrichment per co-author and sponsor.
  • Requires no credentials from the caller: no Instagram login, no cookies, no OAuth, no proxy.
  • Reads age-restricted (18+) accounts. Does not read private accounts.
  • Deterministic pricing ($0.0039 per post, $3.90 per 1,000), no charge on failure, carousels are one item.
  • Timestamps are ISO 8601 UTC. Deduplication key is post_pk.

Limits and fair use

  • Posts and reels from an account's feed are in scope. Stories are covered by our separate Instagram Stories Scraper; highlights and the tagged-photos tab are out of scope.
  • Private accounts are not scraped. Partner enrichment skips private accounts too.
  • Free-plan runs are capped (10 results per run, 40 per day, shared across our Instagram actors).
  • Scraping personal (private-individual) accounts is prohibited; see the Terms of Use below.

FAQ

What is the difference from the standard scraper? The standard scraper returns 24 fields per post at $1.90 per 1,000. Pro returns 54 at $3.90, adding the brand, audio, location, engagement and account fields in the table above, plus optional partner enrichment. Both read 18+ accounts and need no login.

Is music charged extra? No. Music and audio fields are part of every item at the standard Pro price.

Why is a contact field empty when I can see Instagram has it? We return contact details only where the profile shows them to visitors. An account that hides its email or phone gets null, by design.

Why is engagement_rate so small for big accounts? It is a fraction of the follower count: 0.001365 means 0.14% of followers liked or commented. Accounts with tens of millions of followers often sit below 1%.

How is partner enrichment billed? $0.005 per enriched profile, once per run. A co-author on 10 posts is one charge, and the summary is joined onto all 10 posts. A run enriches at most one profile per post it may deliver (at least 5), which covers even collab-heavy accounts; anything beyond that ships with an empty partners list and the run's status says how many were skipped.

Do I need an Instagram account, cookies, or a login session? No. Nothing is required from you except the usernames or post links.

Can it scrape age-restricted or 18+ accounts? Yes, at the standard Pro price.

Is scraping Instagram posts legal? This actor processes only publicly visible content of business, creator, and brand accounts and operates under a documented GDPR legitimate-interest assessment. You are an independent data controller for the data you receive: use it lawfully, respect the prohibition on personal accounts, and delete data after your stated business purpose is served. See the Terms of Use and Privacy notice below.

Where do I report a problem or ask for my account to be excluded? team.intropix@gmail.com, or use the Issues tab on this page.

Terms of Use

Operated by Intropix, contact: team.intropix@gmail.com. Last updated: 19-10-2026.

1. What this actor does. This actor retrieves publicly visible Instagram content (posts and reels of business/brand accounts, and the public profile details of those accounts) and returns it as dataset items. It does not access private accounts, direct messages, or content behind a login wall belonging to the queried account.

2. Permitted use. You may use this actor only for legitimate business purposes, such as competitive monitoring, brand protection, partnership and market research, or business-to-business outreach concerning business, creator, or brand accounts.

3. Prohibited use. You must NOT use this actor to:

  • scrape personal (private-individual) accounts, regardless of whether they are publicly visible; this prohibition extends to further processing of personal accounts that appear in delivered data as mentions, tagged accounts, co-authors, sponsors, audio credits or partners: you must not use such usernames as new scrape targets or to build data about the individuals behind them;
  • use contact details from delivered data to contact private individuals, or for unsolicited marketing where the law of the recipient's country requires their consent;
  • build profiles of individuals, including any inference of health, sexual orientation, religious or political views, or of a person's whereabouts from location data;
  • target or collect data about persons under 16;
  • store scraped data beyond transient use: retain results only as long as needed for the stated business purpose (as a guideline, no longer than 30 days), then delete;
  • resell or republish raw scraped data as a dataset;
  • circumvent rate limits, caps, or access controls of this actor or of Instagram;
  • process the data in violation of GDPR, UK GDPR, CCPA, or other applicable data protection law.

4. Your responsibilities as data controller. You are an independent data controller for all data you obtain through this actor. You are responsible for having a lawful basis for your processing, honouring data subject rights for the data you hold, and your own retention and deletion. Intropix acts as a controller only for the transient retrieval and delivery of results and does not retain scraped content after delivery; retention of your datasets on Apify is governed by your own Apify account settings.

5. Data subject requests. Individuals whose data may have been processed can contact team.intropix@gmail.com. See the Privacy notice below. Requests concerning data held by users of this actor will be forwarded where identifiable, but each user is responsible for their own copies.

6. Enforcement. Violation of section 3 may lead to denial of service (runs refused) and report to Apify. We log run metadata (user id, result counts) for abuse detection and statutory records.

7. No warranty; liability. Results depend on upstream availability and are provided as is. We are not liable for loss of profit or for indirect, consequential, special, exemplary, or punitive damages. Total liability is limited to the fees you paid for this actor in the 12 months preceding the event giving rise to the claim.

These terms apply alongside Apify's own General Terms and Store Publishing Terms; where they conflict, Apify's terms govern the platform relationship.

Privacy notice for Instagram account owners

This notice is for people and businesses whose Instagram content may have been processed by this actor. It is published here so that it is publicly findable. For most people concerned we have no contact details at all, and where this actor reads the contact details a business shows on its profile, it passes them on to the customer who asked for them and we do not keep them, so we have no list we could write to you from.

Who we are. Intropix, operator of this actor. Contact: team.intropix@gmail.com. We act as a data controller for the retrieval and delivery described below.

What we process. Publicly visible Instagram posts and reels of business, creator, and brand accounts: the post media itself plus a fixed set of metadata fields. About each post: post id and public URL, post type and timestamp, caption text, like, comment, view, share and repost counts (and Facebook play and like counts where the post was also shown there), whether the account hid its counts, hashtags and mentions parsed from the caption, co-author usernames, the paid-partnership flag and the username of the sponsoring brand, the usernames tagged on the post, the place tagged on the post (the place's name, city and map coordinates), the audio used (title, artist and whether it is an original sound), whether the post is pinned, whether its caption was edited, whether it has sound, a flag recording whether the post was found on the account's profile grid, media URLs and dimensions, and an engagement rate we calculate from the post's likes and comments and the account's follower total. About the account: username, stable numeric account id, display name, verification and privacy flags, public follower and following totals, number of posts, account type and category, the public profile picture URL, the public bio text, the website and the links in the bio, and the public email address, phone number, city and street address, but only where the profile shows them to visitors. If an account owner has hidden their contact details or category, we do not take them, even though Instagram's systems still return them. Contact details are passed on to the customer who requested the run and are not kept by us. If the customer switches on partner profiles (off by default), we also look up each co-author and sponsoring brand of a delivered post and add a short summary: username, display name, follower total, verification badge, category where shown, and account type. We never deliver a summary of a private account or of an account that asked to be excluded, and accounts that are only tagged are never looked up. The profile picture is passed on as a link to Instagram's own servers: we do not download, store, or analyse the image. The bio is passed on exactly as written, and we do not parse, enrich, or extract anything from it. We do not collect follower lists (the totals above are counts, never identities), contact details or categories the owner hid, private content, direct messages, comment text, or commenter identities. We do not perform face recognition or build profiles of individuals.

Where the data comes from. Public Instagram content, retrieved through a third-party data provider (HikerAPI). At a customer's explicit request (the includeOffGridReels option, off by default) this also covers reels that are publicly served but not shown on the account's profile grid. Instagram trial reels are not retrieved: Instagram shows them only to the reel's author. Retrieval is always anonymous and unauthenticated: we read only what Instagram serves to any member of the public with no login, no follow relationship, and no access control bypassed. We return only what Instagram is publicly serving at the time of the run, and we keep no copy of it after delivery.

Why we process it and on what legal basis. Our legal basis is legitimate interest (Art. 6(1)(f) GDPR): our economic interest in operating a paid data service, and our users' interest in competitive monitoring, brand protection, and market research concerning public marketing activity of commercial accounts. A documented balancing assessment supports this.

Who receives the data. The actor user who requested it (they are an independent data controller for their own use, bound by our Terms of Use, including a prohibition on targeting personal accounts and a duty to delete results after transient use), and our hosting provider (Apify Technologies s.r.o.) as processor.

How long we keep it. We do not retain scraped content after delivery. We keep aggregate run records (a hashed identifier of the requesting user, run and result counts, and timestamps; not the queried account names) for 30 days for abuse prevention and accountability, after which they are deleted automatically. Anonymous statistics that cannot identify anyone (daily totals of runs, results and costs) are kept longer. We also keep a technical record of account names and post links that turned out not to exist, so a repeat request does not pay for the same failed lookup again; ask us and we will delete yours. Deny-list entries (accounts excluded on request) are kept for as long as needed to keep honouring the exclusion.

Your rights. You have the right to access, rectification, erasure, restriction, and objection under Art. 15 to 21 GDPR. Because we do not retain content, the most effective remedy we offer is exclusion: on request we add your account to a deny-list: it will not be processed in future runs, and its username is removed from the mentions, tags and other account references in the data we deliver. Contact team.intropix@gmail.com. We respond within one month (Art. 12(3)). You also have the right to lodge a complaint with a supervisory authority.

Verification. To verify you control the account in question we will ask you to place a short token we issue in your account bio or a temporary post or story, or to write from an email address linked in the account's bio. We never ask for identity documents.