{
  "openapi": "3.0.1",
  "info": {
    "title": "Events Scraper: Eventbrite, Luma, Meetup",
    "description": "Search events by keyword and city on Eventbrite, Luma and Meetup, or paste organizer, calendar and group URLs, and get one normalized table with organizer, venue, price and attendance data, plus an only-new-events monitoring mode.",
    "version": "1.0",
    "x-build-id": "76uZxFcfgEHr0JDCO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/frank_conifer_af4~eventbrite-luma-meetup-events-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-frank_conifer_af4-eventbrite-luma-meetup-events-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/frank_conifer_af4~eventbrite-luma-meetup-events-scraper/runs": {
      "post": {
        "operationId": "runs-sync-frank_conifer_af4-eventbrite-luma-meetup-events-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/frank_conifer_af4~eventbrite-luma-meetup-events-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-frank_conifer_af4-eventbrite-luma-meetup-events-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",
        "properties": {
          "searches": {
            "title": "Searches (keyword + city)",
            "type": "array",
            "description": "A list of searches. Each one is an object with a city in \"location\" and an optional keyword in \"query\", for example {\"query\": \"AI\", \"location\": \"San Francisco\"}. Leave out \"query\" to get all events in that city. Add \"sources\": [\"luma\"] to a search to limit it to some sources. Every search runs once per source, and each source returns up to \"Max events per search and source\" events."
          },
          "startUrls": {
            "title": "Organizer, calendar, group or event URLs",
            "type": "array",
            "description": "Optional. One URL per line. Eventbrite: search pages (eventbrite.com/d/ca--san-francisco/ai/), organizer profiles (eventbrite.com/o/name-123456) and event pages. Luma: calendars (luma.com/your-calendar or lu.ma/calendar/cal-...), city pages (luma.com/sf) and event pages. Meetup: groups (meetup.com/group-name/), search pages (meetup.com/find/?keywords=...&location=...) and event pages. URLs are processed whatever you select in \"Sources\".",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which platforms the searches run on. Default: all three. Each selected source is one more search per keyword and city, so selecting fewer sources lowers both cost and run time.",
            "items": {
              "type": "string",
              "enum": [
                "eventbrite",
                "luma",
                "meetup"
              ],
              "enumTitles": [
                "Eventbrite",
                "Luma (lu.ma)",
                "Meetup"
              ]
            },
            "default": [
              "eventbrite",
              "luma",
              "meetup"
            ]
          },
          "maxEventsPerSearch": {
            "title": "Max events per search and source",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Upper limit of event rows per search per source (and per start URL). This caps your cost: each event row is one charged event. Example: 2 searches x 3 sources x 50 = at most 300 events.",
            "default": 50
          },
          "dateFrom": {
            "title": "Starting on or after",
            "type": "string",
            "description": "Only events starting on or after this date (in the event's local time). Use YYYY-MM-DD, or a relative value such as \"today\", \"tomorrow\", \"7 days\" or \"2 weeks\", which is handy for scheduled runs. Leave empty for all upcoming events."
          },
          "dateTo": {
            "title": "Starting on or before",
            "type": "string",
            "description": "Only events starting on or before this date. Same format as above, for example \"30 days\" for the next month."
          },
          "onlineFilter": {
            "title": "Online or in person",
            "enum": [
              "any",
              "online",
              "in_person"
            ],
            "type": "string",
            "description": "Any: all events. Online: online and hybrid events (Eventbrite then searches its global online listings instead of the city). In person: in-person and hybrid events.",
            "default": "any"
          },
          "freeOnly": {
            "title": "Free events only",
            "type": "boolean",
            "description": "Keep only events marked free. On Meetup an event counts as free when no fee is set.",
            "default": false
          },
          "includeDescription": {
            "title": "Include full description",
            "type": "boolean",
            "description": "Adds descriptionText (plain text) to every event. Meetup includes it at no extra cost. On Eventbrite and Luma it needs one extra small request per event, so turning it off makes those sources about twice as fast. Luma categories and capacity also come from that request.",
            "default": true
          },
          "onlyNewEvents": {
            "title": "Only new events since the last run",
            "type": "boolean",
            "description": "Monitoring mode. Event IDs per search and source are kept in the named key-value store below. Each run outputs (and charges) only events that were not returned before. The first run returns everything as the baseline. Schedule the Actor daily or weekly with the same searches and store.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps the seen event IDs between runs (only used with Only new events). Use a different name per watchlist to keep separate baselines. Lowercase letters, digits and hyphens.",
            "default": "events-state"
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "Optional. After the run, a JSON summary of the events found per search (new events in monitoring mode) is POSTed here, only when there is at least one event. The payload has a Slack-compatible text field, so a Slack incoming webhook URL works directly. Not charged."
          },
          "maxConcurrency": {
            "title": "Searches processed in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many search and source combinations run at the same time. Requests to any single site are always limited to about 2 per second, so values above 3 mostly help long lists of searches.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. All three sources work without a proxy, so direct requests are the default. A proxy can help if Luma or Meetup start rate-limiting your runs. Eventbrite rejects Apify datacenter proxy IPs, so the Actor automatically connects to Eventbrite directly when that happens."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}