{
  "openapi": "3.0.1",
  "info": {
    "title": "Roblox Scraper - Games, Catalog, Users & Communities",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "Tq0rZRH0L83Zifu8a"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~roblox-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-roblox-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~roblox-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-roblox-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~roblox-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-roblox-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. Mode",
            "enum": [
              "games",
              "catalog",
              "users",
              "groups",
              "url"
            ],
            "type": "string",
            "description": "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.",
            "default": "games"
          },
          "gameQueries": {
            "title": "Experience searches or ids",
            "type": "array",
            "description": "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.",
            "default": [
              "blox fruits"
            ],
            "items": {
              "type": "string"
            }
          },
          "catalogKeyword": {
            "title": "Catalog keyword",
            "type": "string",
            "description": "Optional free-text search, for example \"dominus\", \"valkyrie\", \"headphones\". Leave blank to browse the chosen category."
          },
          "catalogCategory": {
            "title": "Catalog category",
            "enum": [
              "all",
              "accessories",
              "clothing",
              "avatarAnimations",
              "heads"
            ],
            "type": "string",
            "description": "Which slice of the marketplace to browse. Only these categories are served to a signed-out request. A pasted listing link carries its own category.",
            "default": "all"
          },
          "userQueries": {
            "title": "Usernames, ids or profile links",
            "type": "array",
            "description": "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. The sample username is ignored when Username search is filled in.",
            "default": [
              "builderman"
            ],
            "items": {
              "type": "string"
            }
          },
          "userKeyword": {
            "title": "Username search",
            "type": "string",
            "description": "Optional. Search the player directory for this text and return every matching profile, not just the first page of matches."
          },
          "groupQueries": {
            "title": "Community names, ids or links",
            "type": "array",
            "description": "One entry per community (group). Each entry can be a community name, a numeric community id or a roblox.com community link. A plain name is looked up with the public community search and must match a community name exactly (ignoring case); otherwise the entry is skipped with a warning in the log that lists close matches, and the run fails if no entry resolves. A link to anything other than a community is skipped with a warning.",
            "default": [
              "7"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchGroupMembers": {
            "title": "Also return community members",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "urls": {
            "title": "Roblox links",
            "type": "array",
            "description": "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 (a sale type, sort order, creator or off-sale flag written in the link itself wins over the matching field).",
            "default": [
              "https://www.roblox.com/discover?Keyword=obby",
              "https://www.roblox.com/games/920587237/Adopt-Me",
              "https://web.roblox.com/games/2753915549",
              "https://www.roblox.com/catalog?Keyword=dominus",
              "https://www.roblox.com/catalog?Category=11&Keyword=hat&salesTypeFilter=2&SortType=3",
              "https://www.roblox.com/catalog/browse.aspx?CatalogContext=1&Keyword=cap",
              "https://www.roblox.com/catalog/1028606/Red-Baseball-Cap",
              "https://www.roblox.com/bundles/1/Man",
              "https://www.roblox.com/users/156/profile",
              "https://www.roblox.com/users/1",
              "https://www.roblox.com/user.aspx?id=2",
              "https://www.roblox.com/groups/7/Roblox-Fan-Group",
              "https://www.roblox.com/communities/1200769/x",
              "https://www.roblox.com/groups/group.aspx?gid=1"
            ],
            "items": {
              "type": "string"
            }
          },
          "minPlaying": {
            "title": "Minimum live players",
            "minimum": 0,
            "type": "integer",
            "description": "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": {
            "title": "Sale type",
            "enum": [
              "any",
              "collectibles",
              "limited",
              "premium"
            ],
            "type": "string",
            "description": "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, unless a pasted /catalog?Keyword=... listing link carries its own salesTypeFilter, in which case the link's value is used.",
            "default": "any"
          },
          "catalogSortType": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "favorited",
              "priceLowToHigh",
              "priceHighToLow",
              "bestselling",
              "recentlyPublished"
            ],
            "type": "string",
            "description": "How the marketplace orders the results before they are returned. It applies to every marketplace search, unless a pasted /catalog?Keyword=... listing link carries its own SortType, in which case the link's value is used.",
            "default": "relevance"
          },
          "catalogCreatorName": {
            "title": "Creator name",
            "type": "string",
            "description": "Only marketplace items made by this creator (user or group name). Leave empty for any creator. It applies to every marketplace search, unless a pasted /catalog?Keyword=... listing link carries its own CreatorName, in which case the link's value is used."
          },
          "catalogIncludeUnavailable": {
            "title": "Include off-sale items",
            "type": "boolean",
            "description": "Also return marketplace items that are not currently for sale. It applies to every marketplace search, unless a pasted /catalog?Keyword=... listing link carries its own includeNotForSale, in which case the link's value is used.",
            "default": false
          },
          "minPrice": {
            "title": "Minimum price (Robux)",
            "minimum": 0,
            "type": "integer",
            "description": "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": {
            "title": "Maximum price (Robux)",
            "minimum": 0,
            "type": "integer",
            "description": "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": {
            "title": "Fetch full details",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "maxItems": {
            "title": "Max items (total, default 20, 0 = up to 1,000,000)",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "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 = up to the maximum of 1,000,000 records (or the natural end of each listing). Larger values are lowered to 1,000,000.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "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.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "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": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "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 (live player count, visits, favourites, member and follower counts, sampled live server statistics, scrape time) are excluded from change detection, so a record whose only difference is one of them counts as unchanged; those fields are still returned with their current value. Prices, off-sale status and stock are compared. The marketplace fields mainImage, itemCreatedUtc, quantityLimitPerUser, itemStatus, bundledItems, isRecolorable and isFreeItem are returned but not compared, so a change in only those fields does not mark a record UPDATED (price, which isFreeItem follows, lowest price, off-sale status and stock are compared). You can exclude more fields with the ignore setting below. State is kept separately for each mode, search and detail setting; use State key to name or deliberately share a campaign.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "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": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "changeScope": {
            "title": "Change scope (incremental mode only)",
            "enum": [
              "all",
              "priceStock"
            ],
            "type": "string",
            "description": "All fields (default) compares every field except the built-in excluded ones and your own ignore list. Price and stock only narrows marketplace items to price, lowest price, off-sale status and remaining stock, so other edits (description, favourites) no longer mark an item UPDATED. Other record kinds are unaffected. A narrowed scope keeps its own stored baseline.",
            "default": "all"
          },
          "compactUpdates": {
            "title": "Compact UPDATED rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. When on, an UPDATED row carries only its identity fields, the current value of each changed field and the change details. NEW rows stay complete. A compacted UPDATED row is billed the detail-enrichment event only when a changed field it carries came from the extra detail lookups.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after missed scans (incremental mode only)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "0 (default) marks a record EXPIRED after the first complete scan that does not find it. Set 2 or more to wait for that many complete scans in a row before marking it EXPIRED. Only applies with Emit expired records on.",
            "default": 0
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional, incremental mode only. Field names to leave out when deciding whether a record changed, for example likeRatio or creator.name. Dotted paths reach nested fields and apply to every item of a list. The fields are still returned; they are just not compared and never appear in changedFields. Changing this list does not mark records as updated.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "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": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}