{
  "openapi": "3.0.1",
  "info": {
    "title": "Event Scraper: Resident Advisor, Luma, Eventbrite & DICE",
    "description": "Scrape live events from Resident Advisor, Luma, Eventbrite and DICE with one Actor, in one normalized schema. Pick any combination of sources per run instead of running four separate scrapers with four different output shapes. Filter by date, genre, and price.",
    "version": "0.0",
    "x-build-id": "l6xkKUiKyjavfYuE9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fkhhb~eventcollator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fkhhb-eventcollator",
        "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/fkhhb~eventcollator/runs": {
      "post": {
        "operationId": "runs-sync-fkhhb-eventcollator",
        "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/fkhhb~eventcollator/run-sync": {
      "post": {
        "operationId": "run-sync-fkhhb-eventcollator",
        "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",
        "properties": {
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which platform(s) to scrape in this run. Leave empty to run all four. Selecting more than one merges their results into a single normalized dataset.",
            "items": {
              "type": "string",
              "enum": [
                "resident_advisor",
                "luma",
                "eventbrite",
                "dice"
              ],
              "enumTitles": [
                "Resident Advisor (ra.co)",
                "Luma (lu.ma)",
                "Eventbrite",
                "DICE (dice.fm)"
              ]
            },
            "default": [
              "resident_advisor",
              "luma",
              "eventbrite",
              "dice"
            ]
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Used by Luma, Eventbrite and DICE. Luma: the lu.ma/<slug> city slug (e.g. \"berlin\") - only works for Luma's own curated hub cities. Eventbrite: the Eventbrite city name (e.g. \"berlin\"), any city Eventbrite itself covers. DICE: a city name from the small known-hub-cities table in src/sources/dice.js (e.g. \"Berlin\", \"Munich\", \"Hamburg\") - if your city isn't in that table, use `diceCityId` instead. Not used for Resident Advisor - use `areas`."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Eventbrite only, required if \"eventbrite\" is in `sources`: the country name as Eventbrite's own URLs spell it (e.g. \"germany\", \"united-states\")."
          },
          "areas": {
            "title": "Areas (Resident Advisor only)",
            "type": "array",
            "description": "Required if \"resident_advisor\" is in `sources`: areas in countryCode/areaUrlName format, e.g. \"de/berlin\" - the exact format ra.co itself uses in its own URLs (ra.co/events/de/berlin). You can list several to pull multiple areas in one run.",
            "items": {
              "type": "string"
            }
          },
          "diceCityId": {
            "title": "DICE city id override (advanced)",
            "type": "string",
            "description": "DICE's internal city id has no public name-search endpoint, so only a small hand-verified set of cities work via `city` above. If yours isn't in that set, open dice.fm/browse/<your-city>-<id> in a browser and paste the id here (the number after the last \"-\" in the URL) to scrape any DICE hub city directly."
          },
          "dateFrom": {
            "title": "Date from",
            "type": "string",
            "description": "Only return events starting on or after this date/time (ISO 8601, e.g. \"2026-10-01\"). Applied server-side for Resident Advisor; applied to every source's already-fetched results otherwise (see the README - not every source's API supports a native date filter)."
          },
          "dateTo": {
            "title": "Date to",
            "type": "string",
            "description": "Only return events starting on or before this date/time (ISO 8601). Same filtering behavior as `dateFrom`."
          },
          "maxItemsPerSource": {
            "title": "Max items per source",
            "type": "integer",
            "description": "Maximum number of events to return from EACH selected source (for Resident Advisor, per area). Resident Advisor is internally capped at 100 regardless of this value - a real, verified limit of its own API, not a limitation of this Actor (see the README). DICE is capped by that city's own default browse-page size (commonly ~30) - this only ever truncates, it can't make DICE paginate further.",
            "default": 50
          },
          "enrichEventDetails": {
            "title": "Enrich event details (Luma only)",
            "type": "boolean",
            "description": "Fetch each Luma event's detail page for a full plain-text description and real category tags. One extra request per event - slower, and only affects Luma.",
            "default": false
          },
          "genreFilter": {
            "title": "Genre / tag filter",
            "type": "array",
            "description": "Optional. Only keep events whose genres, tags, or lineup contain at least one of these terms (case-insensitive substring match), e.g. [\"techno\", \"house\"]. Applied client-side across all sources after fetching, since not every source's API supports server-side genre filtering.",
            "items": {
              "type": "string"
            }
          },
          "freeOnly": {
            "title": "Free events only",
            "type": "boolean",
            "description": "Only keep events resolved as free (price.isFree === true). Because price coverage is incomplete for some sources (see the README, especially Eventbrite), this can under-return - an event with unknown price is excluded, not assumed free.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (Eventbrite only)",
            "type": "object",
            "description": "Only used for the Eventbrite source, which requires a residential-capable proxy to get past its bot-protection wall (see the README). Leave empty to use Apify's RESIDENTIAL proxy group automatically. Resident Advisor, Luma and DICE do not need a residential proxy and ignore this field."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}