{
  "openapi": "3.0.1",
  "info": {
    "title": "Events Finder - Luma, Eventbrite & Meetup Tech Events",
    "description": "Discover and rank tech, AI, and founder events across Luma, Eventbrite, and Meetup. LLM scores each event against your intent prompt and dedupes across scheduled runs. Export data, run via API, schedule and monitor runs, or integrate with other tools.",
    "version": "0.1",
    "x-build-id": "4qFj4gXthfqmLF3ky"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/luis.pinto~events-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-luis.pinto-events-finder",
        "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/luis.pinto~events-finder/runs": {
      "post": {
        "operationId": "runs-sync-luis.pinto-events-finder",
        "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/luis.pinto~events-finder/run-sync": {
      "post": {
        "operationId": "run-sync-luis.pinto-events-finder",
        "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": [
          "cities",
          "categories",
          "prompt"
        ],
        "properties": {
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "Cities the Actor scans on each source. Internally normalized to Luma city slugs, Eventbrite location paths, and Meetup location queries. Accepts common English names: 'Lisbon', 'Berlin', 'San Francisco', 'New York', 'London'. Trade-off: more cities means longer runs and more API credit consumed. Recommended: 1 to 3 cities per watch.",
            "default": [
              "Lisbon"
            ],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Which event categories to scan. The Actor maps each category to the right filters per source (Eventbrite category IDs, Luma discovery tags, Meetup keywords), and the LLM uses them as priors when scoring relevance. Pick 1 to 3 to keep results focused. Selecting all dilutes scoring quality. Recommended: 'AI/ML' plus 'Founders/Startup' for tech founders.",
            "items": {
              "type": "string",
              "enum": [
                "AI/ML",
                "Web3/Crypto",
                "Founders/Startup",
                "Dev/Engineering",
                "Product",
                "Design",
                "Growth/Marketing",
                "Networking",
                "Investing"
              ],
              "enumTitles": [
                "🤖 AI / ML",
                "🪙 Web3 / Crypto",
                "🚀 Founders / Startup",
                "💻 Dev / Engineering",
                "📦 Product",
                "🎨 Design",
                "📈 Growth / Marketing",
                "🤝 Networking",
                "💰 Investing"
              ]
            },
            "default": [
              "AI/ML"
            ]
          },
          "dateFrom": {
            "title": "Date from",
            "type": "string",
            "description": "Earliest event start date the Actor will include, in ISO format (YYYY-MM-DD). Events starting before this date are dropped. Leave empty to default to today. Example: '2026-06-01'."
          },
          "dateTo": {
            "title": "Date to",
            "type": "string",
            "description": "Latest event start date the Actor will include, in ISO format (YYYY-MM-DD). Events starting after this date are dropped. Leave empty to default to dateFrom plus 30 days. Recommended: a 14 to 60 day window. Narrower windows mean fewer false positives, wider windows surface high-value events earlier. Example: '2026-07-01'."
          },
          "prompt": {
            "title": "Intent prompt",
            "type": "string",
            "description": "Free-text description of the events you actually want to attend. The LLM scores each scraped event against this prompt and only events scoring above minScore are emitted. Be specific. Include audience, size, format, vibe. Example: 'AI engineering meetups with under 100 people where founders and senior engineers attend; prefer in-person evening events over webinars.'"
          },
          "persona": {
            "title": "Your persona",
            "enum": [
              "Generalist",
              "Founder",
              "Engineer",
              "PMM",
              "Product",
              "Investor",
              "Designer",
              "Marketer"
            ],
            "type": "string",
            "description": "Who is attending. Used by the LLM as a prior alongside the prompt to weigh organizers and topics. Pick the closest match. The prompt always overrides. Recommended: 'Founder' for a company runner, 'Engineer' for IC eng meetups.",
            "default": "Generalist"
          },
          "minScore": {
            "title": "Minimum relevance score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "LLM relevance score below which events are dropped. The scorer rates each event 0 to 100 against the prompt and persona. Default 60 is a balanced threshold. Lower (40) for early discovery when you want to see more borderline events. Higher (80) for tight, high-signal Slack or Notion feeds.",
            "default": 60
          },
          "maxEventsPerSource": {
            "title": "Max events per source",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Per-source cap on how many events the Actor scrapes before scoring. Higher means more thorough discovery but longer runs and more credits consumed. Recommended: 50 for normal runs, 10 for cheap daily watches, 200 for one-off backfills.",
            "default": 50
          },
          "openRouterModel": {
            "title": "OpenRouter model",
            "type": "string",
            "description": "OpenRouter model identifier used by the scorer. The Actor calls the public OpenRouter Apify Actor (sxck9mShRCfmMOZ8S) with this model. Cheaper models keep run costs near zero; smarter models produce better matchReasons. Recommended for Apify Store default: 'openai/gpt-4o-mini'. Other options: 'anthropic/claude-haiku-4-5', 'google/gemini-flash-1.5', 'meta-llama/llama-3.3-70b-instruct'.",
            "default": "openai/gpt-4o-mini"
          },
          "openRouterApiKey": {
            "title": "OpenRouter API key (optional)",
            "type": "string",
            "description": "Optional OpenRouter API key. If set, the sub-Actor uses the user's own OpenRouter account and the LLM cost is billed directly (cheaper at scale). If empty, the sub-Actor's default billing applies. Check the OpenRouter Actor README for its current contract. Leave empty for the simplest setup."
          },
          "dedupStoreName": {
            "title": "Dedup store name",
            "type": "string",
            "description": "Name of the named Key-Value Store used to remember which events have already been emitted. The Actor only emits events whose stable ID is not already in this store. Use different names for different watch profiles (for example 'events-lisbon-ai', 'events-berlin-founders'). Default fits most users.",
            "default": "events-finder-seen"
          },
          "notionConnector": {
            "title": "Notion Connector (optional)",
            "type": "string",
            "description": "An Apify MCP Connector to the Notion workspace. When set, the Actor appends each new event as a row in a database under the page specified below. Create one in Apify Console > Settings > API & Integrations > MCP Connectors. Notion's MCP URL is either https://mcp.notion.com/mcp or https://api.notion.com/mcp. Apify injects the Notion credentials server-side. The Actor never sees a token. Leave empty to skip Notion sync."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "URL of the Notion page where the events database lives. On the first run the Actor creates an 'Events Finder Inbox' database under this page. Subsequent runs append rows there. Share this page with the Apify integration (page menu > Connections > add the Apify integration). Example: https://www.notion.so/your-workspace/Events-Inbox-1a2b3c4d. Required when notionConnector is set."
          },
          "maxNotifyEvents": {
            "title": "Max events per Notion sync",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Hard cap on how many top-scored events to push to Notion per run. The dataset always contains all new events. This only limits writes to Notion. Notion handles hundreds of rows fine. The cap exists to keep run time predictable. Recommended: 50.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}