# Roblox Scraper: Games, Catalog, Users & Communities (`abotapi/roblox-scraper`) Actor

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.

- **URL**: https://apify.com/abotapi/roblox-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Roblox Scraper

Pull structured data out of Roblox (roblox.com) in one place: experiences with their live player counts, visits, likes and creator, marketplace items with resale prices and price history, player profiles with follower and connection counts, and communities with their roles and full member rosters. Give it a keyword, an id, or just paste links, and it returns clean, flat JSON rows you can load straight into a sheet, a warehouse, or a dashboard. Built-in incremental mode makes it a monitoring tool as well as a one-off extractor: schedule it daily and get back only what actually changed.

### Why This Scraper?

- **Five sources in one actor**, not five separate tools: experiences, marketplace catalog, game passes, users and communities all return through the same dataset with a `kind` column.
- **Up to 40 fields per record**, including the numbers people actually track: live players, total visits, likes and dislikes with a derived like ratio, favourites, lowest resale price, recent average price, 30 points of price history, total quantity for limited items, follower and connection counts, and community member counts by role.
- **Six link shapes accepted verbatim.** Paste an experience page, a marketplace item, a bundle, a game pass, a profile or a community and the actor works out what each one is. A listing link returns the whole result set, not just the first screen.
- **Incremental change tracking built in.** Every record is classified NEW, UPDATED, REAPPEARED, UNCHANGED or EXPIRED against the previous run of the same search, with the exact list of fields that moved.
- **Resume a large pull** from a previous run id without paying for rows you already have.
- **Honest limits.** A run that gets refused fails loudly instead of quietly reporting an empty result, so a scheduled job never silently returns nothing.
- **Costs scale with what you keep.** The base record set carries no surcharge; only the optional extra detail data does, and only for the records that actually received it.

### Data You Get

> Sample shape, values are illustrative placeholders, not from a live record.

#### Experiences (`kind: "game"`)

| Field | Example |
|---|---|
| `recordId` | `game-00000001` |
| `id` / `universeId` | `00000001` |
| `rootPlaceId` | `00000002` |
| `url` | `https://www.roblox.com/games/00000002/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` |
| `iconUrl` | `https://tr.rbxcdn.com/00000000/512/512/Image/Png` |
| `sampledServerCount` | `100` |
| `sampledServerPlayers` | `1200` |
| `avgServerFps` / `avgServerPing` | `59.5` / `150.0` |
| `mediaImageCount` / `mediaVideoCount` | `5` / `1` |
| `badges` | `[{ "id": 0, "name": "Sample Badge", "awardedCount": 1000 }]` |

#### Marketplace items (`kind: "catalogItem"`) and game passes (`kind: "gamePass"`)

| Field | Example |
|---|---|
| `recordId` | `catalog-Asset-00000001` |
| `itemType` | `Asset` (or `Bundle`) |
| `url` | `https://www.roblox.com/catalog/00000001/Sample-Item` |
| `name` / `description` | `Sample Item` / `Item description text.` |
| `categoryName` / `categoryGroup` | `Head Accessories` / `accessories` |
| `creatorName` / `creatorType` | `Sample Creator` / `User` |
| `price` / `lowestPrice` / `lowestResalePrice` | `0` / `100000` / `100000` |
| `recentAveragePrice` | `110000` |
| `salesCount` / `totalQuantity` / `numberRemaining` | `1000` / `10000` / `0` |
| `favoriteCount` | `100000` |
| `itemRestrictions` | `["Limited"]` |
| `isLimited` / `isLimitedUnique` / `isCollectible` | `true` / `false` / `true` |
| `hasResellers` / `isOffSale` | `true` / `true` |
| `priceHistory` | `[{ "date": "2026-01-01T00:00:00Z", "value": 110000 }]` |
| `thumbnailUrl` | `https://tr.rbxcdn.com/00000000/420/420/Hat/Png` |

#### Users (`kind: "user"`)

| Field | Example |
|---|---|
| `recordId` | `user-00000001` |
| `url` | `https://www.roblox.com/users/00000001/profile` |
| `name` / `displayName` | `SampleUser` / `Sample User` |
| `description` | `Profile description text.` |
| `createdAt` | `2010-01-01T00:00:00.000Z` |
| `hasVerifiedBadge` / `isBanned` | `false` / `false` |
| `friendsCount` / `followersCount` / `followingCount` | `50` / `100000` / `25` |
| `robloxBadges` | `["Veteran", "Bricksmith"]` |
| `createdExperiencesCount` / `createdExperiences` | `2` / `[{ "name": "Sample Experience", "placeVisits": 10000 }]` |
| `avatarHeadshotUrl` | `https://tr.rbxcdn.com/00000000/150/150/AvatarHeadshot/Png` |

#### Communities (`kind: "group"`) and their members (`kind: "groupMember"`)

| Field | Example |
|---|---|
| `recordId` | `group-00000001` / `groupmember-00000001-00000002` |
| `url` | `https://www.roblox.com/groups/00000001/Sample-Community` |
| `name` / `description` | `Sample Community` / `Community description text.` |
| `memberCount` | `1000000` |
| `ownerUsername` / `ownerDisplayName` | `SampleOwner` / `Sample Owner` |
| `publicEntryAllowed` | `true` |
| `shoutBody` / `shoutPoster` | `Sample announcement.` / `SampleOwner` |
| `roleCount` / `roles` | `5` / `[{ "name": "Member", "rank": 1, "memberCount": 999000 }]` |
| `groupExperiencesCount` / `groupExperiences` | `3` / `[{ "name": "Sample Experience", "placeVisits": 10000 }]` |
| `groupName` / `roleName` / `roleRank` (member rows) | `Sample Community` / `Member` / `1` |

Every record also carries `kind`, `scrapedAt`, and, in incremental mode, `changeType`, `changedFields`, `firstSeenAt` and `lastSeenAt`.

### How to Use

**Search experiences by keyword**

```json
{
  "mode": "games",
  "gameQueries": ["tycoon", "obby"],
  "minPlaying": 500,
  "maxItems": 100,
  "fetchDetails": true
}
```

**Look up specific experiences by id or link**

```json
{
  "mode": "games",
  "gameQueries": [
    "994732206",
    "https://www.roblox.com/games/2753915549/Blox-Fruits"
  ],
  "maxItems": 0
}
```

**Track limited items and their resale prices**

```json
{
  "mode": "catalog",
  "catalogCategory": "accessories",
  "catalogSalesType": "collectibles",
  "catalogSortType": "priceHighToLow",
  "minPrice": 1000,
  "fetchDetails": true,
  "maxItems": 200
}
```

**Pull a community and its member roster**

```json
{
  "mode": "groups",
  "groupQueries": ["7", "https://www.roblox.com/communities/4199740/Example"],
  "fetchGroupMembers": true,
  "maxItems": 5000
}
```

**Paste any mix of links**

```json
{
  "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",
    "https://www.roblox.com/discover?Keyword=simulator"
  ],
  "maxItems": 50
}
```

**Monitor the same search daily and get only the changes**

```json
{
  "mode": "catalog",
  "catalogSalesType": "collectibles",
  "incrementalMode": true,
  "stateKey": "limiteds-watch",
  "emitExpired": true,
  "maxItems": 0
}
```

### 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 | | Keywords, experience ids, place ids or experience links. One search per entry. |
| `catalogKeyword` | string | | 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 | | Usernames, user ids or profile links. |
| `userKeyword` | string | | Return every profile in the player directory matching this text. |
| `groupQueries` | array | | Community ids or community links. |
| `fetchGroupMembers` | boolean | `false` | Also return one row per community member with their role and rank. |
| `urls` | array | | Roblox links for URL mode, including the discover and catalog listing pages. |
| `minPlaying` | integer | | 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` / `maxPrice` | integer | | Robux price floor and 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. |
| `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 | | 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 | | 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. |
| `proxy` | object | Apify proxy | Connection settings. The default works on every Apify plan. |
| `mcpConnectors` | array | | Optional MCP connectors to also receive the results. |
| `notionParentPageUrl` | string | | Notion page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items sent to each connector. Does not affect the dataset. |

#### A note on incremental mode and live numbers

Two kinds of number behave very differently between two runs. Counters that grow, such as visits, favourites, member counts, follower counts and resale prices, are treated as real changes: if one of them moves, the record comes back as UPDATED with that field named in `changedFields`. Instantaneous gauges, specifically the live player count (`playing`) and the sampled live server statistics, are excluded from change detection, because they move every minute and would otherwise mark every record as changed on every run. Those fields are still returned with their current value on every row.

### Output Example

> Sample shape, values are illustrative placeholders, not from a live record.

```json
{
  "kind": "game",
  "recordId": "game-00000001",
  "id": 1,
  "universeId": 1,
  "rootPlaceId": 2,
  "url": "https://www.roblox.com/games/00000002/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": ["visits", "favoritedCount"],
  "firstSeenAt": "2026-01-01T00:00:00.000Z",
  "lastSeenAt": "2026-01-02T00:00:00.000Z",
  "scrapedAt": "2026-01-02T00:00:00.000Z"
}
```

### Send results into your apps (MCP connectors)

Results can optionally be piped into the apps you already use through Model Context Protocol connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in `mcpConnectors`. For Notion, also set `notionParentPageUrl` and each item becomes a page under it. 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.

### Plan Requirement

The actor needs an Apify account and uses the standard Apify proxy settings shown in the input. No additional credential or subscription is required.

### Known Limits

- Roblox does not publish the list of game passes for an experience to a signed out request. Individual game passes are still returned when you paste their link or id in URL mode.
- The marketplace serves four categories to a signed out request: all, accessories, clothing and avatar animations. Other category names are rejected by the source.
- `sampledServerCount`, `sampledServerPlayers`, `avgServerFps` and `avgServerPing` describe a sample of up to 100 currently running public servers, not every server of the experience.
- Community member rosters can run into the millions of rows. Keep `maxItems` set unless you intend to pull the whole roster.

# Actor input Schema

## `mode` (type: `string`):

games = search or look up experiences. catalog = search the avatar marketplace. users = look up or search players. groups = look up communities and, optionally, their members. url = paste roblox.com links and let the scraper work out what each one is.

## `gameQueries` (type: `array`):

One entry per search. Each entry can be a keyword ("tycoon", "blox fruits"), a numeric experience or place id, or a roblox.com experience link. Keywords are searched, ids and links are looked up directly.

## `catalogKeyword` (type: `string`):

Optional free-text search, for example "dominus", "valkyrie", "headphones". Leave blank to browse the chosen category.

## `catalogCategory` (type: `string`):

Which slice of the marketplace to browse. Roblox only serves these four to a signed-out request.

## `userQueries` (type: `array`):

One entry per user. Each entry can be a username, a numeric user id, or a roblox.com profile link. Usernames are resolved to ids automatically.

## `userKeyword` (type: `string`):

Optional. Search the player directory for this text and return every matching profile, not just the first page of matches.

## `groupQueries` (type: `array`):

One entry per community (group). Each entry can be a numeric community id or a roblox.com community link.

## `fetchGroupMembers` (type: `boolean`):

Return one extra row per member (username, display name, role and rank) alongside the community record. Large communities have millions of members, so keep Max items set unless you really want the whole roster.

## `urls` (type: `array`):

One or more roblox.com links. Supported: experience pages (/games/...), marketplace items (/catalog/...), bundles (/bundles/...), game passes (/game-pass/...), user profiles (/users/.../profile), communities (/groups/... or /communities/...), and the listing pages /discover?Keyword=... and /catalog?Keyword=... which return their whole result set. Multi-link supported. The search fields of the other modes are ignored, with one exception: the Filters and sort fields below still apply, so a player floor drops experiences returned by these links and the marketplace controls shape a pasted /catalog?Keyword=... listing search.

## `minPlaying` (type: `integer`):

Only keep experiences with at least this many players in-game at the moment the run reads them. Leave empty to keep every result. It applies to every experience the run returns, whether it came from an Experiences search or from a pasted experience or /discover link.

## `catalogSalesType` (type: `string`):

Narrow to a sale type. Collectibles are the limited and limited-unique items that can be resold, and they are the ones that carry resale prices and price history. It applies to every marketplace search, whether built from the Marketplace catalog fields above or from a pasted /catalog?Keyword=... listing link.

## `catalogSortType` (type: `string`):

How the marketplace orders the results before they are returned. It applies to every marketplace search, whether built from the Marketplace catalog fields above or from a pasted /catalog?Keyword=... listing link.

## `minPrice` (type: `integer`):

Only return marketplace items priced at or above this. Leave empty for no floor. It applies to every marketplace search, whether built from the Marketplace catalog fields above or from a pasted /catalog?Keyword=... listing link.

## `maxPrice` (type: `integer`):

Only return marketplace items priced at or below this. Leave empty for no ceiling. It applies to every marketplace search, whether built from the Marketplace catalog fields above or from a pasted /catalog?Keyword=... listing link.

## `fetchDetails` (type: `boolean`):

Add the extra per-record data: live server statistics, media counts and badges for experiences; resale price, sales and price history for marketplace items; connection, follower and following counts plus created experiences for users; roles and community experiences for communities. Adds extra requests per record and is billed as a detail-enrichment surcharge. Turn off for a lighter run that returns only the base fields. Community members, game passes and bundles are always returned complete and are never charged the surcharge.

## `maxPages` (type: `integer`):

How many result pages to read per search target. 0 (default) means unlimited: reading stops naturally once the source reports no further page, or sooner once Max items is reached. Set a number only for an explicit page cap below that natural stop.

## `maxItems` (type: `integer`):

The sole soft cap on the run: stop after this many records across all searches. Defaults to 20 so a run stays small unless you raise it. 0 = unlimited (bounded only by the natural end of each listing).

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large pull without returning or charging for records already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns everything as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Values that move on their own between runs (the live player count and the sampled live server statistics) are excluded from change detection, so a record whose only difference is its live player count counts as unchanged; those fields are still returned with their current value. State is kept separately for each mode, search and detail setting; use State key to name or deliberately share a campaign.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key from the mode, search and detail settings, so different searches never mix state.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search: not when Max items capped it, not when Resume was used, and not when any request was refused. This returns, and bills, extra rows.

## `proxy` (type: `object`):

The source limits how many requests a single address may make in a short window, so a proxy is what keeps a larger run moving. The default works on every Apify plan, including the free one, and no premium group is ever selected for you.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title plus key fields), not the full JSON; the complete record always stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "games",
  "gameQueries": [
    "blox fruits"
  ],
  "catalogCategory": "all",
  "userQueries": [
    "builderman"
  ],
  "groupQueries": [
    "7"
  ],
  "fetchGroupMembers": false,
  "urls": [
    "https://www.roblox.com/discover?Keyword=obby"
  ],
  "catalogSalesType": "any",
  "catalogSortType": "relevance",
  "fetchDetails": true,
  "maxPages": 0,
  "maxItems": 20,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "games",
    "gameQueries": [
        "blox fruits"
    ],
    "catalogCategory": "all",
    "userQueries": [
        "builderman"
    ],
    "groupQueries": [
        "7"
    ],
    "fetchGroupMembers": false,
    "urls": [
        "https://www.roblox.com/discover?Keyword=obby"
    ],
    "catalogSalesType": "any",
    "catalogSortType": "relevance",
    "fetchDetails": true,
    "maxPages": 0,
    "maxItems": 20,
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/roblox-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "games",
    "gameQueries": ["blox fruits"],
    "catalogCategory": "all",
    "userQueries": ["builderman"],
    "groupQueries": ["7"],
    "fetchGroupMembers": False,
    "urls": ["https://www.roblox.com/discover?Keyword=obby"],
    "catalogSalesType": "any",
    "catalogSortType": "relevance",
    "fetchDetails": True,
    "maxPages": 0,
    "maxItems": 20,
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/roblox-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "games",
  "gameQueries": [
    "blox fruits"
  ],
  "catalogCategory": "all",
  "userQueries": [
    "builderman"
  ],
  "groupQueries": [
    "7"
  ],
  "fetchGroupMembers": false,
  "urls": [
    "https://www.roblox.com/discover?Keyword=obby"
  ],
  "catalogSalesType": "any",
  "catalogSortType": "relevance",
  "fetchDetails": true,
  "maxPages": 0,
  "maxItems": 20,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/roblox-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/roblox-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CLeS2VDy89n05tgRe/builds/XtrccLJZdCe4vxQ4e/openapi.json
