Instagram & Polymarket scrapers, ready on Apify

Illustration: a scraper reads public web pages, with their pictures, text and charts, and turns them into dataset rows you can download as JSON, CSV or Excel.

Four scrapers that run on Apify. An Instagram scraper for profiles, posts, reels and hashtags, an Instagram profile scraper, an Instagram comment scraper with sentiment analysis, and a Polymarket scraper for prediction-market prices, order books and top holders. Fill in a form or send one API call, and download the data as JSON, CSV or Excel.

  • From $1.75 per 1,000 results
  • One flat rate for every Apify plan
  • Error rows are free
  • No login of yours needed

The four scrapers

Quick start

  1. Open the Actor on Apify from one of the links below. A free Apify account is enough to try it.
  2. Fill in the form, or switch the input to JSON and paste one of the examples on this page.
  3. Click Start. When the run finishes, open the Output tab to view the rows, or export them as JSON, CSV or Excel.
  4. Automate it through the Apify API, or schedule it in the Apify Console.

Instagram

Instagram Scraper

Profiles, posts, reels and comments from profile URLs, bare handles, post URLs and hashtag URLs, or from a hashtag search. You can mix the kinds in one run. Choose what comes back with resultsType.

Open on Apify

Input

FieldWhat it doesDefault
directUrlsProfile URLs (https://www.instagram.com/nasa/), handles (nasa), post or reel URLs, or hashtag URLs (/explore/tags/travel/).none
resultsTypedetails (the profile row), posts, reels or comments.posts
resultsLimitPer profile. Posts and reels up to 1,000; comments up to 5,000 per post.30
commentsPostLimitWith comments: how many recent posts to read comments from.12
search, searchLimitA hashtag or keyword (a leading # is fine) and how many of its posts to return. About 60 is what Instagram keeps per word for a logged-out visitor.none, 24
onlyPostsNewerThanA date (2026-07-01) or a span (3 days, 2 weeks).no cutoff
enrichPostsReads each post's own page for timestamp, likes, comment count, dimensions and tagged accounts.on
includeRelatedProfilesAlso returns the accounts Instagram suggests next to each profile.off
includeMediaUrlsAdds image and video URLs. Instagram signs them and they expire, so download promptly.off
addParentDataAdds ownerId and ownerFullName to every post row.off

Example input

{
  "directUrls": ["https://www.instagram.com/nasa/", "natgeo"],
  "resultsType": "posts",
  "resultsLimit": 30,
  "onlyPostsNewerThan": "2 weeks"
}

What a row holds

Post rows: shortCode, url, type, caption, hashtags, timestamp, likesCount, commentsCount, videoViewCount, ownerUsername and more. Profile rows: username, fullName, followersCount and the account's totals. Comment rows: text, ownerUsername, timestamp, likesCount, postUrl.

Instagram

Instagram Profile Scraper

Give it handles and get one row per account: followers, following, post count, biography, verification, category and engagement averages, with the latest posts nested inside the row.

Open on Apify

Input

FieldWhat it doesDefault
usernamesRequired. Handles (nasa) or profile URLs. Post, hashtag and place URLs are refused with a reason.none
resultsLimitHow many recent posts to nest in latestPosts (1 to 200). The account's totals don't depend on it.12
onlyPostsNewerThanDrops nested posts older than a date or span. The profile row is returned either way.no cutoff
enrichPostsCompletes each nested post with timestamp, likes, comment count, dimensions and tagged accounts.on
includeRelatedProfilesAlso returns the accounts Instagram suggests next to each profile.off
includeMediaUrlsAdds the signed, expiring image and video URLs to nested posts.off

Example input

{
  "usernames": ["nasa", "natgeo"],
  "resultsLimit": 12
}

What a row holds

username, fullName, biography, verified, followersCount, followsCount, postsCount, avgLikes, avgComments, avgVideoViews, engagementRatePct, url, collectedAt, and latestPosts as a list.

Instagram

Instagram Comment Scraper with Sentiment

Comments from post and reel URLs, or from an account's recent posts. Every comment arrives with a sentiment label and score at no extra charge. Only this listing sells sentiment.

Open on Apify

Input

FieldWhat it doesDefault
directUrlsRequired. Post or reel URLs (https://www.instagram.com/p/…/), one per line. A profile URL or handle reads that account's recent posts.none
resultsLimitComments per post, up to 5,000. You get that many, or every comment the post exposes when there are fewer.100
includeNestedCommentsKept for compatibility with other comment scrapers. It must stay off, because replies can't be read without a login.off

Example input

{
  "directUrls": ["https://www.instagram.com/p/Dc6zTucHTv8/"],
  "resultsLimit": 500
}

What a row holds

text, ownerUsername, timestamp, likesCount, postUrl, commentUrl, sentimentLabel (positive, neutral or negative) and sentimentScore. Comments are the slow part, at roughly one per second per post, so a large resultsLimit means a longer run.

Polymarket

Polymarket Scraper: Markets, Order Books & Top Holders

Two modes. Market list ranks open markets by 24-hour volume or liquidity, up to 10,000 per run. Market insight reads the markets you name in depth, one row each, read live when the run asks.

Open on Apify

Input

FieldWhat it doesDefault
modemarkets (a ranked list) or insight (markets in depth).markets
maxResultsList mode: how many markets, from the top of the ranking (1 to 10,000).100
sortByList mode: volume24hr or liquidity, highest first.volume24hr
includeClosedList mode: also admit resolved markets.off
marketsInsight mode: market URLs (https://polymarket.com/event/<event>/<market>), slugs or numeric ids, up to 500. An event URL works when the event holds a single market.none
bookDepthInsight mode: order-book levels per side and outcome (1 to 50).5
tradesLimitInsight mode: recent trades to include (0 to 500).15
holdersLimitInsight mode: top holders per outcome (0 to 20).10

Example inputs

{ "mode": "markets", "maxResults": 250, "sortBy": "volume24hr" }
{
  "mode": "insight",
  "markets": [
    "https://polymarket.com/event/nba-2027-champion/will-oklahoma-city-thunder-win-the-2027-nba-finals"
  ],
  "bookDepth": 5,
  "tradesLimit": 15,
  "holdersLimit": 10
}

What a row holds

Every row: question, url, eventTitle, outcomes, outcomePrices, volume, volume24h, liquidity, bestBid, bestAsk, spread, oneDayPriceChange, endDate. An insight row adds outcomeStats (order book and 24-hour open, close, low and high per outcome), openInterest, recentTrades and topHolders.

Run it through the API

Every Actor is also an API endpoint. Use your token from Apify Console › Settings › API & Integrations. This call runs an Actor and returns its rows in one response:

curl -X POST \
  "https://api.apify.com/v2/acts/JD1VgW5yGyRLTwWGr/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames": ["nasa"], "resultsLimit": 12}'

That id is the Instagram Profile Scraper. To call another Actor, change it in the URL: mf6PBXdXdL3j5RJBC for the Instagram Scraper, lX185UeTCz49FZGH4 for the Instagram Comment Scraper or hm8qX4h0fwBvx82jv for the Polymarket Scraper. The synchronous endpoint waits at most 300 seconds. For long runs, such as thousands of comments, start the run and read the dataset when it finishes. The Python client does both for you:

pip install apify-client

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hm8qX4h0fwBvx82jv").call(  # Polymarket Scraper
    run_input={"mode": "markets", "maxResults": 100}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["question"], row["volume24h"])

Pricing

Pay per result, one flat price for every Apify plan: $1.75 per 1,000 results for the Instagram scrapers and $2.20 per 1,000 results for the Polymarket scraper. Charges happen as rows land in your dataset. Set a spending limit on a run and it stops before the limit, never after it. Error rows, which explain why an input produced no data, are never charged.

You collectYou pay
100 Instagram posts$0.175
1,000 profiles$1.75
5,000 comments with sentiment$8.75
The top 1,000 Polymarket markets$2.20

One result is one dataset row: a profile, a post, a comment or a market. Apify platform usage is not charged on top. The Pricing tab of each Actor on Apify shows the current terms.

FAQ

Do I need an Instagram or Polymarket account?

No. The Actors read only what a logged-out visitor can see: public profiles, public posts and their comments, and Polymarket's public market data. They never log in, and they never post, like, follow or trade.

What about private Instagram accounts?

Their posts and comments aren't collected. Ask for the posts or comments of a private account, or of one with no posts, and you get a free error row that says so. The Profile Scraper still returns what a private account shows publicly: its name, follower counts and post count.

How fresh is the data?

Instagram rows carry collectedAt, the time the data was read. Polymarket rows are read live when your run asks for them.

Why did my run return error rows?

Every input that produced no data gets one row with an error code and an errorDescription in plain words. Examples: a link that isn't a profile or post, a private account, or a Polymarket event with several markets where you need to pick one. Error rows are free.

Can I use the data for anything I like?

Instagram rows can contain personal data, such as usernames and comment text. You are responsible for having a lawful basis to process it, for example under the GDPR, and for respecting the terms of the sites involved. Collect only what you need.

Where do I report a problem or ask for a feature?

Open the Issues tab of the Actor on Apify.