{
  "openapi": "3.0.1",
  "info": {
    "title": "Meetup Events Scraper — Whole City, Groups, Past RSVPs",
    "description": "Every public Meetup event in a city, not just the first page of a keyword search: date, venue and coordinates, RSVP and waitlist counts, fee, host and group. Plus group profiles with member counts and past events with the attendance each one drew.",
    "version": "0.1",
    "x-build-id": "I9Z7dOBaqLA3qnE7h"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/chorelet~meetup-events-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-chorelet-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/chorelet~meetup-events-scraper/runs": {
      "post": {
        "operationId": "runs-sync-chorelet-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/chorelet~meetup-events-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-chorelet-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": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "events",
              "groups",
              "group-history"
            ],
            "type": "string",
            "description": "`events` — public events in a city (leave keywords empty to sweep the whole city). `groups` — group profiles with member counts, founded date, organiser and rating. `group-history` — past events of specific groups with the attendance each one drew.",
            "default": "events"
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "Plain place names, `City, Country` or `City, State, Country`: `Berlin, Germany`, `New York`, `Austin, TX, USA`, `Tbilisi, Georgia`. Meetup resolves each one itself — no geocoding key, no coordinates. Used by the `events` and `groups` modes.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Each keyword is a separate search, e.g. `python`, `startup`, `board games`. **Leave this empty in `events` and `groups` mode to sweep the whole city** — keyword search returns only a few dozen events (or 200 groups) per city, the sweep returns hundreds. In `group-history` mode keywords filter the past events by title, description or topic.",
            "items": {
              "type": "string"
            }
          },
          "groupUrlnames": {
            "title": "Groups (for past events)",
            "type": "array",
            "description": "Group URLs or bare urlnames for `group-history` mode: `https://www.meetup.com/python-users-berlin-pub/` or `python-users-berlin-pub`.",
            "items": {
              "type": "string"
            }
          },
          "radius": {
            "title": "Search radius",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Miles around the city centre. Meetup snaps this to its own bands, so 10 and 20 usually return almost the same set.",
            "default": 25
          },
          "startsAfter": {
            "title": "Starts after",
            "type": "string",
            "description": "Absolute `2026-10-01` or relative `2 days`. Empty = from now on. For `group-history` use a past offset: `1 year ago` or `-6 months`."
          },
          "startsBefore": {
            "title": "Starts before",
            "type": "string",
            "description": "Absolute `2026-12-31` or relative `30 days`. Meetup's own city feed reaches about a month ahead, so a longer window will not add events."
          },
          "onlyNew": {
            "title": "Only new since the last run",
            "type": "boolean",
            "description": "Saves only events and groups that earlier runs did not return — Meetup's search repeats the same listings every run, so this is what turns a schedule into a feed of what was announced since. The state is kept in a key-value store on your own account, and rows it skips are never charged or looked up for details.",
            "default": false
          },
          "watchKey": {
            "title": "Watch key (advanced)",
            "type": "string",
            "description": "Which saved state to continue. Empty = one state per task, so two schedules of this Actor never overwrite each other. Set it by hand to share one state between tasks, or change it to start over.",
            "default": ""
          },
          "eventType": {
            "title": "Event type",
            "enum": [
              "any",
              "physical",
              "online"
            ],
            "type": "string",
            "description": "Keep only in-person or only online events.",
            "default": "any"
          },
          "minAttendees": {
            "title": "Minimum attendees",
            "minimum": 0,
            "type": "integer",
            "description": "Drop events with fewer RSVPs than this. Use it to skip the long tail of events nobody signed up for.",
            "default": 0
          },
          "sweepCategories": {
            "title": "Widen the sweep across topic categories",
            "type": "boolean",
            "description": "After the plain city sweep, run it again once per Meetup topic category (Technology, Music, Sports & Fitness, …). Finds a few dozen extra events per category at the cost of one pass each — slow, so leave it off unless you need full coverage.",
            "default": false
          },
          "categories": {
            "title": "Only these topic categories",
            "type": "array",
            "description": "Limit the widened sweep to specific categories by name or url key: `technology`, `career-business`, `social-activities`, `music`, `art-culture`, `games`, `health-wellbeing`, `sports-fitness`. Empty = all 20.",
            "items": {
              "type": "string"
            }
          },
          "maxEvents": {
            "title": "Max events per city or group",
            "minimum": 1,
            "type": "integer",
            "description": "Meetup's city feed tops out at roughly 500 upcoming events per city, whatever you put here.",
            "default": 500
          },
          "maxGroups": {
            "title": "Max groups per city",
            "minimum": 1,
            "type": "integer",
            "description": "The keyword-free city sweep reaches past 2,000 groups for a large city. A keyword search is capped by Meetup at 200 groups per term.",
            "default": 500
          },
          "fetchEventDetails": {
            "title": "Fetch per-event details",
            "type": "boolean",
            "description": "One extra request per event: how to find the venue, guest policy, waitlist mode, recurring-series id, map link, and the full group profile (founded date, organiser, rating, join mode). Charged separately.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}