Roblox Scraper: Games, Catalog, Users & Communities
Pricing
from $1.00 / 1,000 records
Roblox Scraper: Games, Catalog, Users & Communities
Scrape Roblox experiences, marketplace items, users and communities. Player counts, visits, likes, genre, creator, resale prices and price history, limited status, follower counts, community members and roles. Search, ids or pasted links, with incremental change tracking for scheduled runs.
Pricing
from $1.00 / 1,000 records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
5
Monthly active users
4 days ago
Last modified
Categories
Share
Roblox Scraper: Experiences, Marketplace, Players & Communities
Roblox Scraper turns Roblox into a clean, flat JSON feed. Get experiences with their live player counts, visits, likes and creator, marketplace items with resale prices and price history, game passes, player profiles with follower and connection counts, and communities with their roles and full member rosters. Give it a keyword, an id, or paste links, and it works out what each one is. Built-in incremental mode makes it a monitoring tool as well as a one-off extractor, and results can also be piped into your own apps.
Why This Scraper?
- Five sources, one dataset. Experiences, marketplace items, game passes, players and communities all return through the same dataset with a
kindcolumn, instead of five separate tools. - Deep experience data. Live player count, total visits, favourites, likes and dislikes with a derived like ratio, plus, with detail on, sampled live server stats, media counts and badges.
- Marketplace depth on demand. Resale price, recent average price, up to 30 points of price history and total quantity for limited items.
- Six link shapes accepted as-is. Paste an experience, marketplace item, bundle, game pass, profile or community link, or a discover or catalog listing page, and the actor works out what each one is.
- Incremental change tracking built in. Records are compared run over run and classified NEW, UPDATED, UNCHANGED or EXPIRED, with the exact fields that moved.
- Detail lookups protect the rest of the run. If the extra per-record lookups start coming back empty for many records in a row, they turn themselves off for the rest of that run, so the base records still come back.
- Honest failure. A refused run fails loudly instead of returning an empty dataset, and Resume continues one interrupted pull without paying twice for rows already collected.
Use Cases
- Player count and trend monitoring: track live players, visits and favourites for a watchlist of experiences over time.
- Limited item and resale tracking: watch marketplace collectibles for price, quantity and resale history changes.
- Community research: pull a community's member roster, roles and rank breakdown.
- Creator and catalog research: compare genres, creators, prices and player counts across many experiences or marketplace items at once.
- Player lookups: resolve usernames or profile links to follower, following and connection counts.
Data You Get
Sample shape, values are illustrative placeholders, not from a live record.
The table below shows an experience record (kind: "game"), the most detailed of the six kinds this actor returns.
| Field | Example |
|---|---|
kind | "game" (also "catalogItem", "gamePass", "user", "group", "groupMember") |
recordId | game-1 |
id / universeId | 1 |
rootPlaceId | 2 |
url | https://www.roblox.com/games/2/Sample-Experience |
name | Sample Experience |
description | Full experience description text. |
creatorName / creatorType | Sample Studio / Group |
genre / genreL1 / genreL2 | All / RPG / Action RPG |
playing | 1000 |
visits | 10000000 |
maxPlayers | 20 |
favoritedCount | 500000 |
upVotes / downVotes / likeRatio | 900000 / 100000 / 0.9 |
createdAt / updatedAt | 2020-01-01T00:00:00.000Z / 2026-01-01T00:00:00.000Z |
iconUrl | https://tr.rbxcdn.com/00000000/512/512/Image/Png |
sampledServerCount / sampledServerPlayers | 100 / 1200 (when detail is on) |
avgServerFps / avgServerPing | 59.5 / 150.0 (when detail is on) |
mediaImageCount / mediaVideoCount | 5 / 1 (when detail is on) |
badges | [{ "id": 0, "name": "Sample Badge", "awardedCount": 1000 }] (when detail is on) |
scrapedAt | 2026-01-02T00:00:00.000Z |
changeType / changedFields | "UPDATED" / ["favoritedCount", "visits"] (incremental mode only) |
Marketplace item rows (kind: "catalogItem") carry itemType (Asset or Bundle), categoryName, price, lowestPrice, lowestResalePrice, itemRestrictions, isLimited, isLimitedUnique, hasResellers and thumbnailUrl, plus recentAveragePrice, salesCount and priceHistory for single assets when Fetch full details is on (bundles are never enriched). Game pass rows (kind: "gamePass", only reachable by pasting a game pass link in URL mode) carry price, productId, creatorId, creatorName, creatorType, creatorHasVerifiedBadge, isForSale, createdAt, updatedAt and iconImageAssetId. User rows (kind: "user") carry displayName, hasVerifiedBadge, friendsCount, followersCount, followingCount, robloxBadges, createdExperiencesCount and avatarHeadshotUrl. Community rows (kind: "group") carry memberCount, ownerUsername, publicEntryAllowed, shoutBody, roleCount, roles and groupExperiences, and community member rows (kind: "groupMember") carry groupName, roleName and roleRank for one member per row.
How to Use
- Pick a mode:
games(experiences),catalog(marketplace),users,groups, orurl(paste roblox.com links). - Fill in the search fields for that mode. The filter and sort fields below apply no matter which mode you picked.
- Set Max items to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search experiences by keyword:
{"mode": "games","gameQueries": ["tycoon", "obby"],"minPlaying": 500,"maxItems": 100}
Paste a mix of links:
{"mode": "url","urls": ["https://www.roblox.com/games/2753915549/Blox-Fruits","https://www.roblox.com/catalog/1365767/Valkyrie-Helm","https://www.roblox.com/users/156/profile"],"maxItems": 50}
Track limited items and their resale prices:
{"mode": "catalog","catalogCategory": "accessories","catalogSalesType": "collectibles","catalogSortType": "priceHighToLow","minPrice": 1000,"maxItems": 200}
Monitor the same search daily and get only the changes:
{"mode": "catalog","catalogSalesType": "collectibles","incrementalMode": true,"stateKey": "limiteds-watch","emitExpired": true,"maxItems": 0}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/roblox-scraper").call(run_input={"mode": "games", "gameQueries": ["tycoon"], "maxItems": 50})for record in client.dataset(run["defaultDatasetId"]).iterate_items():print(record["name"], record["playing"], record["visits"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/roblox-scraper').call({ mode: 'games', gameQueries: ['tycoon'], maxItems: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips every record id it already returned there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same search. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on), orEXPIRED, only after a run that scanned the whole tracked search end to end, was not capped by Max items, was not a Resume, and had no refused requests, and only withemitExpiredon.REAPPEAREDis not a normal outcome of running the same search twice: it only appears for a record that a previous complete scan already markedEXPIRED, and that later turns up again. Counters that grow, such as visits, favourites, member counts and resale prices, are treated as real changes; the live player count and the sampled live server stats are excluded from change detection because they move every minute, though they are still returned with their current value.stateKeynames or shares the stored state; leave it empty and the actor derives one from the mode and search, so different searches never mix state. - Combining Resume with Incremental mode is only allowed the first time a state key is used. Once that state key has tracked records from an earlier run, the run fails with a message asking you to drop Resume or pick a different State key.
How Max items is shared across multiple searches
When a run has more than one search target, several game queries, several user ids, and so on, the Max items budget is divided evenly across them, so one heavily-populated query does not use up the whole budget before the others are read.
Send results into your apps (MCP connectors)
Results can optionally be piped into the apps you already use through Model Context Protocol connectors. This is an extra delivery step after the scrape; the Apify dataset itself is never changed.
Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable or Apify), then select it in the mcpConnectors input field. For Notion, also set notionParentPageUrl to the page under which item pages should be created; other connectors receive a best-effort write.
The connector receives a condensed, human-readable summary per item: a title plus the key fields flattened to plain text, with nested objects collapsed to their main value and arrays trimmed to a few names. The complete record always stays in the Apify dataset, and selecting a connector never changes the dataset output. maxNotifyListings caps how many items are sent to each connector per run; it does not affect the dataset.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | select | games | games, catalog, users, groups or url. The search fields of the other modes are ignored; the filter and sort fields below apply whichever mode you run. |
gameQueries | array | none (prefill: ["blox fruits"]) | Keywords, experience ids, place ids or experience links. One search per entry. |
catalogKeyword | string | none | Free-text marketplace search. Superseded by a pasted marketplace listing link, which carries its own keyword. |
catalogCategory | select | all | all, accessories, clothing or avatarAnimations. Superseded by a pasted marketplace listing link, which carries its own category. |
userQueries | array | none (prefill: ["builderman"]) | Usernames, user ids or profile links. |
userKeyword | string | none | Search the player directory for this text and return every matching profile. |
groupQueries | array | none (prefill: ["7"]) | Community ids or community links. |
fetchGroupMembers | boolean | false | Also return one row per community member with their role and rank. |
urls | array | none (prefill: ["https://www.roblox.com/discover?Keyword=obby"]) | Roblox links for URL mode, including the discover and catalog listing pages. |
minPlaying | integer | none | Keep only experiences with at least this many players in game right now. Applies to every experience row, including one returned by a pasted link. |
catalogSalesType | select | any | any, collectibles (limited and resellable) or premium. Applies to every marketplace search, including one built from a pasted marketplace listing link. |
catalogSortType | select | relevance | relevance, favorited, priceLowToHigh or priceHighToLow. Applies to every marketplace search, including one built from a pasted marketplace listing link. |
minPrice | integer | none | Robux price floor for marketplace items. Applies to every marketplace search, including one built from a pasted marketplace listing link. |
maxPrice | integer | none | Robux price ceiling for marketplace items. Applies to every marketplace search, including one built from a pasted marketplace listing link. |
fetchDetails | boolean | true | Add the extra per-record data. Billed as a detail-enrichment surcharge, only for records that receive it and are actually delivered. |
maxPages | integer | 0 | Result pages per search target. 0 means read until the source runs out. |
maxItems | integer | 20 | Total records across all searches. 0 means unlimited. |
resumeFromRunId | string | none | Continue a previous run or dataset without repeating rows already collected. |
incrementalMode | boolean | false | Return only what changed since the last run of the same search. |
stateKey | string | none | Name an incremental monitoring campaign. |
emitUnchanged | boolean | false | Also return, and bill, records that did not change. |
emitExpired | boolean | false | Also return, and bill, records that are no longer found, only after a complete scan. |
proxy | object | Apify proxy | Connection settings. The default works on every Apify plan. |
mcpConnectors | array | none | Optional MCP connectors to also receive the results. |
notionParentPageUrl | string | none | Notion page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items sent to each connector. Does not affect the dataset. |
Output Example
Sample shape, values are illustrative placeholders, not from a live record.
{"kind": "game","recordId": "game-1","id": 1,"universeId": 1,"rootPlaceId": 2,"url": "https://www.roblox.com/games/2/Sample-Experience","name": "Sample Experience","description": "Full experience description text.","creatorId": 3,"creatorName": "Sample Studio","creatorType": "Group","creatorHasVerifiedBadge": true,"genre": "All","genreL1": "RPG","genreL2": "Action RPG","price": null,"playing": 1000,"visits": 10000000,"maxPlayers": 20,"favoritedCount": 500000,"upVotes": 900000,"downVotes": 100000,"likeRatio": 0.9,"createdAt": "2020-01-01T00:00:00.000Z","updatedAt": "2026-01-01T00:00:00.000Z","copyingAllowed": false,"createVipServersAllowed": true,"universeAvatarType": "MorphToR15","isContentRestricted": false,"iconUrl": "https://tr.rbxcdn.com/00000000/512/512/Image/Png","sampledServerCount": 100,"sampledServerPlayers": 1200,"avgServerFps": 59.5,"avgServerPing": 150.0,"mediaImageCount": 5,"mediaVideoCount": 1,"badges": [{ "id": 0, "name": "Sample Badge", "awardedCount": 1000, "winRatePercentage": 0.1 }],"changeType": "UPDATED","changedFields": ["favoritedCount", "visits"],"firstSeenAt": "2026-01-01T00:00:00.000Z","lastSeenAt": "2026-01-02T00:00:00.000Z","scrapedAt": "2026-01-02T00:00:00.000Z"}
Plan Requirement
The actor needs an Apify account. The default proxy connection works on every plan, and the actor never selects a premium proxy group for you: for a large or frequent run, picking a residential proxy group under Connection gives more headroom. No other credential or subscription is required.
FAQ
How much does it cost?
You're charged per record delivered in the dataset, plus a one-time charge when a run starts, plus an extra charge for a record whose full details were fetched and that is delivered to the dataset, when Fetch full details is on. A record suppressed as UNCHANGED never carries this extra charge, even if its details were fetched. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Roblox?
This actor reads the same public JSON endpoints Roblox's own pages call, without any credential. You are responsible for how you use the data: follow Roblox's terms and the laws that apply to you, and get legal advice before any commercial redistribution. Usernames, profile text and creator names can be personal data in some jurisdictions, so handle them accordingly.
Can I get only new or changed data on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Unchanged records are not returned or billed unless you turn on Emit unchanged, and Emit expired records only produces tombstones for items that vanished, and only after a run that scanned the tracked search completely.
Why did I never see a REAPPEARED record?
REAPPEARED is not a normal outcome of running the same search twice. It only appears for a record that a previous complete scan, with Emit expired records on, not capped, not resumed, nothing refused, already marked EXPIRED, and that later turns up again in a further run. If you have never turned on Emit expired records, or no run has ever scanned its whole tracked search end to end, REAPPEARED will never appear, and that is expected.
Why did my run fail instead of returning an empty dataset?
If every request to Roblox's endpoints is refused, the run stops with a clear message so "no matches for this search" is never confused with "nothing could be read". Re-run in a few minutes. A run also fails if the selected mode's required search field is empty, or if Resume is combined with Incremental mode on a state key that already has tracked records from an earlier run.
Why are some fields empty even though Fetch full details is on?
Game passes, community members and marketplace bundles are always returned complete from their listing page and never carry the extra detail fields, and are never charged the surcharge. For experiences, marketplace items, players and communities, if the extra lookups come back empty for many records in a row, they turn off for the rest of that run and the base fields still come back. The sampled live server numbers describe up to 100 currently running public servers, not every server of the experience.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each record into Notion, Linear or Airtable.
🔗 More scrapers you might like
Pair this actor with these related scrapers from the same team:
| 🧩 OK.ru Scraper Scrape public OK.ru users, groups, topics, posts, videos, games and greetings by keyword... | 🛒 itch.io Game, Review, Creator and Jam Scraper Scrape itch.io games by genre, tag, platform, price band or keyword, plus creator... |
| 🧩 Pikabu Scraper Scrape Pikabu (Пикабу): keyword search, hot/new/best feeds, communities, tags, full story... | 🧩 CrazyGames Scraper Scrape CrazyGames games with ratings, upvotes and downvotes, total plays and likes... |
| 🧩 TikTok Comments Scraper Scrape comments from TikTok videos using one or more video URLs or IDs. Extract comment... | 👗 SNKRDUNK Scraper Scrape SNKRDUNK (snkrdunk.com), Japan's sneaker and streetwear resale marketplace: JP and... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.