{
  "openapi": "3.0.1",
  "info": {
    "title": "Meetup Event Scraper — Groups, Organizers & RSVP Leads",
    "description": "Scrape upcoming public Meetup events by keyword and city: title, date, description, venue, RSVP count, the hosting group with its public rating, and the organizer. Deep pagination past Meetup's own totalCount, server-side date/RSVP/format filters. No login, no API key.",
    "version": "0.1",
    "x-build-id": "BFvml8eE6qlHOLQ38"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~meetup-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-meetup-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/scrapersdelight~meetup-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-meetup-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/scrapersdelight~meetup-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-meetup-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": {
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "What to search Meetup for — e.g. `tech`, `startup`, `yoga`, `book club`, `artificial intelligence`. A keyword is required: Meetup's search needs one, so an empty keyword scrapes nothing. Measured on 12 keyword+city searches (1,124 events), a single keyword+city returns 51–191 events."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Any place text Meetup can geocode: `New York, NY`, `Austin, TX`, `London, UK`, `Berlin, Germany`, `Toronto`. **Qualify ambiguous names** — measured live, a bare `London` resolved to London, Ontario and a bare `Berlin` resolved to Berlin, Connecticut. The resolved place is logged and stored on every row as `searchLocation`, so a bad match is visible in your data rather than hidden. Leave empty and the run defaults to New York, NY."
          },
          "startUrls": {
            "title": "Or paste Meetup find URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Run the search on meetup.com in your browser, copy the address bar, paste it here — e.g. `https://www.meetup.com/find/?keywords=hiking&location=us--co--Denver`. The keyword and place are read straight out of the URL, and each pasted URL is an extra search on top of the Keyword/Location above. **Only `/find/` search URLs carry a keyword**; group (`/my-group/`) and single-event URLs are not supported and the run logs a warning naming the URL it skipped.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "eventType": {
            "title": "Event format",
            "enum": [
              "ANY",
              "PHYSICAL",
              "ONLINE",
              "HYBRID"
            ],
            "type": "string",
            "description": "Filtered by Meetup server-side, so narrowing costs you nothing extra. Measured on 1,124 events: 58.9% in-person, 40.8% online, 0.3% hybrid — online rows have no venue address, so pick In-person if you need street addresses.",
            "default": "ANY"
          },
          "startDate": {
            "title": "Starting on or after",
            "type": "string",
            "description": "Only events starting on or after this date. Meetup publishes **upcoming events only**, so a past date is ignored and the run logs that it used \"now\" instead. Leave empty for \"from now on\".",
            "default": ""
          },
          "endDate": {
            "title": "Starting on or before",
            "type": "string",
            "description": "Only events starting on or before this date — e.g. set it 7 days out to build a \"what's on this week\" feed. A date in the past can never match anything, so the run stops with an error instead of handing you an empty dataset.",
            "default": ""
          },
          "minRsvpCount": {
            "title": "Minimum RSVPs",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Drop events below this attendance. Meetup applies it server-side, so it cuts your bill rather than adding to it. Calibration from 1,124 measured events: median RSVP count is 3, 27.5% have 10+, and only 2.7% have 50+ — a floor of 50 will leave you very few rows. 0 = no floor.",
            "default": 0
          },
          "radiusMiles": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Distance from the resolved location's center. 0 = Meetup's own default radius, which is what the measured numbers on this page were collected with.",
            "default": 0
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "RELEVANCE",
              "DATETIME"
            ],
            "type": "string",
            "description": "How Meetup orders the result set before pagination. Relevance is Meetup's default. Soonest-first is what you want when you cap `maxResults` and only care about the next few days.",
            "default": "RELEVANCE"
          },
          "maxResults": {
            "title": "Max results (total)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Hard stop across all searches — **this is your cost ceiling**. You are billed $0.0009 per event delivered, so 100 events = $0.09 and 1,000 = $0.90. Duplicate events are dropped before billing and never count against it. A keyword+city search yielded 51–191 events in the measured sample, so 100 usually covers one city.",
            "default": 100
          },
          "maxResultsPerSearch": {
            "title": "Max results per search",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Per keyword+location cap, so one busy city cannot eat the whole budget when you run several searches. 0 = no per-search cap (only the total above applies).",
            "default": 0
          },
          "searches": {
            "title": "Multiple searches (keyword + location pairs)",
            "type": "array",
            "description": "For running many keyword/city combinations in one go: `[{\"keyword\":\"startup\",\"location\":\"Austin, TX\"},{\"keyword\":\"yoga\",\"location\":\"San Francisco, CA\"}]`. These are added to — not instead of — the Keyword/Location fields above. Leave empty unless you need more than one search.",
            "default": []
          },
          "lat": {
            "title": "Latitude (skip geocoding)",
            "type": "string",
            "description": "Exact latitude, e.g. `51.45`. Supply it together with Longitude to bypass the geocoder entirely — the fix for an ambiguous city name. Overrides the Location field for every search in the run.",
            "default": ""
          },
          "lon": {
            "title": "Longitude (skip geocoding)",
            "type": "string",
            "description": "Exact longitude, e.g. `-0.24`. Must be supplied together with Latitude — one without the other stops the run with an error rather than silently searching the wrong place.",
            "default": ""
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Meetup's public GraphQL endpoint is not walled, so the cheap datacenter rung is the default: measured 2026-08-12 through Apify Proxy, 43 requests returned 42 clean 200s with a single proxy-level 502 that the fresh-session retry recovered, and 12 of 12 keyword+city searches returned events. Residential is not required and only makes a run cost more.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}