{
  "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": "XtrccLJZdCe4vxQ4e"
  },
  "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.",
            "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"
            ],
            "type": "string",
            "description": "Which slice of the marketplace to browse. Roblox only serves these four to a signed-out request.",
            "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.",
            "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 ids or links",
            "type": "array",
            "description": "One entry per community (group). Each entry can be a numeric community id or a roblox.com community link.",
            "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.",
            "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",
              "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, whether built from the Marketplace catalog fields above or from a pasted /catalog?Keyword=... listing link.",
            "default": "any"
          },
          "catalogSortType": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "favorited",
              "priceLowToHigh",
              "priceHighToLow"
            ],
            "type": "string",
            "description": "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.",
            "default": "relevance"
          },
          "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 = unlimited)",
            "minimum": 0,
            "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 = unlimited (bounded only by the natural end of each listing).",
            "default": 20
          },
          "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 (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.",
            "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
          },
          "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
            }
          },
          "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}