# Partiful Events Scraper & Monitor (`luminar/partiful-events-scraper-monitor`) Actor

Collect deliberately public Partiful events from supported Explore cities or exact URLs, enrich public details, and track reliable NEW, UPDATED and confirmed ENDED changes.

- **URL**: https://apify.com/luminar/partiful-events-scraper-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.15 / 1,000 partiful events

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Collect public Partiful events from supported Explore cities or exact public event URLs, export stable event records, and safely track NEW, UPDATED, and confirmed ENDED changes. The smallest useful run needs only the default New York Explore scope.

### 🚀 Start in 60 seconds

1. Choose **Collect events**.
2. Keep `nyc` or select another supported Explore city.
3. Start with 25 Core rows.
4. Run the Actor and open the Overview dataset view.

```json
{"workflow":"collect","exploreSlugs":["nyc"],"detailLevel":"core","maxResults":25,"maxResultsPerTarget":50,"maxBuyerChargeUsd":1}
```

### 🎯 Choose the right workflow

| Goal | Workflow | Result |
|---|---|---|
| Build a city feed or event list | Collect events | Current public event rows |
| Watch a stable public scope | Track changes | NEW, UPDATED, and carefully confirmed ENDED rows |
| Enrich known public events | Collect + Detailed | One public event page per delivered event |

### 📦 What you get

Each event keeps a stable Partiful event ID and canonical URL, with source-published title, description, dates, location, cover, organizer, public RSVP counts, and ticket signals when available. A free coverage row explains whether the requested public window completed, was capped, filtered, partial, blocked, or failed.

Representative synthetic fixture:

```json
{"recordType":"event","stableId":"partiful:event:public-event-example","eventId":"public-event-example","url":"https://partiful.com/e/public-event-example","title":"Community event","city":"New York","interestedCount":120,"sourceName":"Partiful"}
```

![Actual Partiful public-events Dataset preview](./assets/readme/partiful-events-dataset.png)

### 🎛️ Input guide

- `workflow`: return current events or compare a repeat run.
- `exploreSlugs`: supported public Explore city pages: `nyc`, `la`, `sf`, `bos`, `dc`, `chi`, `lon`, `mia`, and `atx`.
- `eventUrls`: exact public `https://partiful.com/e/...` URLs. Private or phone-gated activity is not accessed.
- `detailLevel`: Core uses the public listing surface; Detailed opens each event's public page and uses one mutually exclusive detailed-event charge instead of the Core row charge.
- `keywordsAny` and `excludeKeywords`: deterministic post-filters. Filtered monitoring never infers removal.
- `stateNamespace`: separates independent monitoring baselines.
- `maxResults`, `maxResultsPerTarget`, and `maxDetailRequests`: hard caps; hitting a cap returns `CAPPED` and withholds removal decisions.
- `maxBuyerChargeUsd`: refuses the run when the active worst-case event price exceeds your ceiling.

### 💰 Pricing

The complete formula is: **verified target or monitoring scan + delivered Core, Detailed, or change rows**. On the Free plan, a 25-row Core collection is `$0.00005 + 25 × $0.00215 = $0.0538`; 25 Detailed rows are `$0.00005 + 25 × $0.00235 = $0.0588`. Failed or blocked source work is not charged, and coverage rows are free.

### ✅ Coverage you can trust

- `COMPLETE`: every requested public surface was exhausted within the declared scope.
- `CAPPED`: a declared result, request, byte, or runtime limit stopped traversal.
- `FILTERED`: the source walk completed, but filters make absence non-comparable.
- `PARTIAL`: useful rows exist, but at least one target failed or was blocked.
- `BLOCKED` and `FAILED`: never presented as empty.
- `EMPTY_CONFIRMED`: used only when the expected public surface positively confirms no public events.

Monitoring commits state only after confirmed delivery. An event becomes `ENDED` only after two comparable complete misses; capped, filtered, partial, blocked, or failed runs never remove it.

On the first Track changes run, the default **Create baseline only** setting stores the current comparable scope and returns no change rows. The next identical run compares against that baseline; choose **Return current events as NEW** only when you deliberately want first-run change rows and their row charges.

### 🔌 API and automation

Run the Actor from Apify Console or API and export JSON, CSV, Excel, XML, or HTML. After publication, you can separately create Tasks and Schedules for repeat city feeds or monitoring; no public Task or schedule is bundled with this Actor release.

### ⚠️ Not yet supported

- Private invitations, hidden locations, login-only content, attendee identities, phone-gated activity, messages, photos, comments, or RSVP actions.
- Arbitrary city search outside the supported public Explore city pages.
- Guaranteed ticket-price fields when Partiful does not publish them on the public page.

### ❓ FAQ and support

**Does this require a Partiful login?** No. It reads only deliberately public Partiful pages.

**Why are some fields null?** Public pages vary. Optional fields remain null instead of being guessed.

**What should I send with a support request?** Include the Apify run ID, input with secrets removed, and the coverage row.

# Actor input Schema

## `workflow` (type: `string`):

Collect returns current public event rows. Track changes creates or compares a baseline.

## `exploreSlugs` (type: `array`):

Choose supported Partiful slugs: nyc, la, sf, bos, dc, chi, lon, mia, or atx. Exact event URLs can be added below.

## `maxResults` (type: `integer`):

Maximum unique current events across all requested targets.

## `maxBuyerChargeUsd` (type: `number`):

The Actor refuses to start if the active worst-case event-price vector exceeds this amount.

## `eventUrls` (type: `array`):

Exact public https://partiful.com/e/... URLs. Private and phone-gated activity is never accessed.

## `keywordsAny` (type: `array`):

Keep events matching at least one term in the public title, description, city, location, or host.

## `excludeKeywords` (type: `array`):

Remove events matching any term.

## `firstRunBehavior` (type: `string`):

Used only when Workflow is Track changes. This choice does not add source work or runtime and does not change the monitoring-scan price. Seed only creates a Baseline with no paid change rows; Return current events as NEW emits Changes and each delivered row uses the change-row price.

## `stateNamespace` (type: `string`):

Separates independent baselines. Keep it unchanged for repeat runs of the same scope.

## `detailLevel` (type: `string`):

Detailed opens each public event page, adding source requests and runtime. In Collect, each successful Detailed row replaces the Core row charge; in Track changes, delivered changes use the change price while detail pages only add source work and runtime.

## `maxResultsPerTarget` (type: `integer`):

Maximum events kept from each Explore city or exact event target.

## `maxDetailRequests` (type: `integer`):

Used only by Detailed mode. Detailed maxResults cannot exceed this value.

## Actor input object example

```json
{
  "workflow": "collect",
  "exploreSlugs": [
    "nyc"
  ],
  "maxResults": 25,
  "maxBuyerChargeUsd": 1,
  "firstRunBehavior": "seed_only",
  "stateNamespace": "default",
  "detailLevel": "core",
  "maxResultsPerTarget": 50,
  "maxDetailRequests": 25
}
```

# Actor output Schema

## `dataset` (type: `string`):

All event, change, and coverage rows.

## `events` (type: `string`):

Buyer-focused public event fields.

## `changes` (type: `string`):

NEW, UPDATED, and confirmed ENDED change fields.

## `coverage` (type: `string`):

Completeness and monitoring safety.

## `runSummary` (type: `string`):

Counts, field coverage, limits, and billing events.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "workflow": "collect",
    "exploreSlugs": [
        "nyc"
    ],
    "maxResults": 25,
    "maxBuyerChargeUsd": 1,
    "firstRunBehavior": "seed_only",
    "stateNamespace": "default",
    "detailLevel": "core",
    "maxResultsPerTarget": 50,
    "maxDetailRequests": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/partiful-events-scraper-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "workflow": "collect",
    "exploreSlugs": ["nyc"],
    "maxResults": 25,
    "maxBuyerChargeUsd": 1,
    "firstRunBehavior": "seed_only",
    "stateNamespace": "default",
    "detailLevel": "core",
    "maxResultsPerTarget": 50,
    "maxDetailRequests": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("luminar/partiful-events-scraper-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "workflow": "collect",
  "exploreSlugs": [
    "nyc"
  ],
  "maxResults": 25,
  "maxBuyerChargeUsd": 1,
  "firstRunBehavior": "seed_only",
  "stateNamespace": "default",
  "detailLevel": "core",
  "maxResultsPerTarget": 50,
  "maxDetailRequests": 25
}' |
apify call luminar/partiful-events-scraper-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luminar/partiful-events-scraper-monitor"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7eHGws5CtBFVWqTrK/builds/5kFREtcxyRvyMxF5N/openapi.json
