{"id":"90033bdc-8aa2-4161-9094-c50f14008b5c","entityType":"agent","slug":"clawhub-chrischall-eventbrite-mcp","name":"eventbrite-mcp","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-eventbrite-mcp","canonicalPath":"/agent/clawhub-chrischall-eventbrite-mcp","generatedAt":"2026-10-10T13:40:58.193Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":null},"description":"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.5K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:eventbrite-mcp","sourceUrl":"https://clawhub.ai/chrischall/eventbrite-mcp","homepage":"https://clawhub.ai/chrischall/skills/eventbrite-mcp","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/eventbrite-mcp","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/eventbrite-mcp","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"eventbrite-mcp technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":null},"stars":null,"forks":null,"downloads":1469,"packageName":null,"latestVersion":"1.1.8","tractionLabel":"1.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T11:19:36.973Z","lastCrawledAt":"2026-10-10T11:19:36.973Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T11:19:36.973Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.8","createdAt":"2026-10-09T23:24:33.865Z","changelog":"- Removed the file skill-card.md. - No changes to the skill’s functionality or documentation beyond file removal.","fileCount":5,"zipByteSize":7387},{"version":"1.1.7","createdAt":"2026-10-07T13:37:02.781Z","changelog":"- Removed the sample file skill-card.md. - No functional or documentation changes to the skill's behavior or interface.","fileCount":5,"zipByteSize":7432},{"version":"1.1.6","createdAt":"2026-10-05T02:47:59.614Z","changelog":"- Removed the skill-card.md file. - No changes to functionality or documentation.","fileCount":5,"zipByteSize":7440},{"version":"1.1.5","createdAt":"2026-10-03T01:40:25.694Z","changelog":"- Removed the skill-card.md file. - No changes to functionality or documentation otherwise.","fileCount":5,"zipByteSize":7432},{"version":"1.1.4","createdAt":"2026-09-28T13:55:38.785Z","changelog":"- Replaced all references to the \"Transporter\" extension with \"ContextMint Bridge\". - Updated setup instructions to use ContextMint Bridge, including install and verification details. - Clarified that ContextMint Bridge is the new name for the fetchproxy extension and included source and release verification steps. - Adjusted fpx exit code guidance to reference ContextMint Bridge instead of Transporter. - Removed the obsolete file skill-card.md.","fileCount":5,"zipByteSize":7370},{"version":"1.1.3","createdAt":"2026-09-25T15:52:36.032Z","changelog":"- Removed the skill-card.md file. - No changes to functionality or documentation outside of file cleanup.","fileCount":5,"zipByteSize":7182},{"version":"1.1.2","createdAt":"2026-09-23T21:40:21.230Z","changelog":"- Removed the file skill-card.md. - No other changes to functionality or documentation.","fileCount":5,"zipByteSize":7313},{"version":"1.1.1","createdAt":"2026-09-23T15:45:51.570Z","changelog":"- Removed the sample file skill-card.md. - No feature or behavior changes; documentation and core functionality remain unchanged.","fileCount":5,"zipByteSize":7385}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:eventbrite-mcp","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:eventbrite-mcp` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/eventbrite-mcp before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T13:40:58.190Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-eventbrite-mcp/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":null},"readme":"Skill: eventbrite-mcp\n\nOwner: chrischall\n\nSummary: Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\n\nTags: latest:1.1.8\n\nVersion history:\n\nv1.1.8 | 2026-10-09T23:24:33.865Z | auto\n\n- Removed the file skill-card.md.\n- No changes to the skill’s functionality or documentation beyond file removal.\n\nv1.1.7 | 2026-10-07T13:37:02.781Z | auto\n\n- Removed the sample file skill-card.md.\n- No functional or documentation changes to the skill's behavior or interface.\n\nv1.1.6 | 2026-10-05T02:47:59.614Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or documentation.\n\nv1.1.5 | 2026-10-03T01:40:25.694Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or documentation otherwise.\n\nv1.1.4 | 2026-09-28T13:55:38.785Z | auto\n\n- Replaced all references to the \"Transporter\" extension with \"ContextMint Bridge\".\n- Updated setup instructions to use ContextMint Bridge, including install and verification details.\n- Clarified that ContextMint Bridge is the new name for the fetchproxy extension and included source and release verification steps.\n- Adjusted fpx exit code guidance to reference ContextMint Bridge instead of Transporter.\n- Removed the obsolete file skill-card.md.\n\nv1.1.3 | 2026-09-25T15:52:36.032Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or documentation outside of file cleanup.\n\nv1.1.2 | 2026-09-23T21:40:21.230Z | auto\n\n- Removed the file skill-card.md.\n- No other changes to functionality or documentation.\n\nv1.1.1 | 2026-09-23T15:45:51.570Z | auto\n\n- Removed the sample file skill-card.md.\n- No feature or behavior changes; documentation and core functionality remain unchanged.\n\nv1.1.0 | 2026-09-20T02:58:03.158Z | auto\n\n- Removed the sample skill card file (skill-card.md).\n- No user-facing or functional changes; documentation and core instructions remain unchanged.\n\nv1.0.0 | 2026-09-17T23:37:42.893Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or other documentation.\n\nv0.3.3 | 2026-09-15T19:27:40.328Z | auto\n\n- Removed the sample file skill-card.md.\n- No changes to functionality or documentation apart from file removal.\n\nv0.3.2 | 2026-09-14T14:06:57.742Z | auto\n\neventbrite-mcp 0.3.2\n\n- Removed the sample file skill-card.md.\n- No user-facing changes to functionality or documentation.\n\nv0.3.1 | 2026-09-10T17:49:09.324Z | auto\n\n- Removed the file skill-card.md.\n- No user-facing functionality or documentation changes in this version.\n- Package remains focused on shell access to Eventbrite data using documented APIs and the fpx browser bridge.\n\nv0.3.0 | 2026-09-04T22:32:44.854Z | auto\n\n- Removed the sample file skill-card.md.\n- No changes to core functionality or documentation.\n\nv0.2.0 | 2026-08-29T13:54:02.591Z | auto\n\n- Removed the file skill-card.md to reduce duplication and streamline documentation.\n- No changes to user-facing features or APIs.\n- Documentation in SKILL.md remains unchanged.\n\nv0.1.3 | 2026-08-28T21:07:12.037Z | auto\n\n- Removed sample file: skill-card.md\n- No changes to core functionality or usage\n- Documentation and references remain unchanged\n\nv0.1.2 | 2026-08-09T21:02:22.723Z | auto\n\n- Removed the sample file skill-card.md.\n- No functional or documentation changes in core files.\n\nv0.1.1 | 2026-08-06T00:42:58.584Z | auto\n\n- Removed the file skill-card.md.\n- No other functionality or documentation changes.\n\nv0.1.0 | 2026-07-30T17:25:47.789Z | auto\n\nInitial release providing shell access to Eventbrite data without an MCP server:\n\n- Supports querying your tickets, orders, organizations’ events, and attendees via OAuth token and documented API.\n- Enables public event discovery and search through browser bridge (`fpx`) for endpoints not covered by the standard API.\n- Provides setup instructions for both surfaces (curl/token and fpx/browser).\n- Includes ready-to-run examples and rules for API usage, pagination, and security.\n- Documentation emphasizes read-only access; event creation and modification are not supported.\n\nArchive index:\n\nArchive v1.1.8: 5 files, 7387 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (1921b), SKILL.md (3507b), _meta.json (133b)\n\nFile v1.1.8:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup\n```\n\nRequires **ContextMint Bridge**\n(<https://github.com/nullnet-app/contextmint-bridge/releases> — load the chrome\nzip unpacked; use Chrome for now, Safari is not available yet) with site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\nContextMint Bridge is the fetchproxy extension renamed (same maintainer; source at <https://github.com/nullnet-app/contextmint-bridge> — build it, or verify a release zip with `shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in ContextMint Bridge), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.8\",\n  \"publishedAt\": 1791588273865\n}\n\nFile v1.1.8:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.8:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.8:skill-card.md\n\n## Description:\n\nHelps agents retrieve Eventbrite tickets, orders, organizer events and attendees, and discover public events using read-only requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Eventbrite users can look up their tickets and orders, review their organizations' events and attendees, and search for public events without an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Account tokens, browser cookies, and order or attendee details may be exposed in logs, commits, or shared transcripts.\n\nMitigation: Keep credentials and personal data out of logs, commits, and shared transcripts; give tools account access only when needed.\n\nRisk: Improvised API calls could change organizer data despite the skill's read-only scope.\n\nMitigation: Use only the documented read-only recipes; do not add write calls.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Eventbrite token API recipes](references/token-api.md)\n- [Eventbrite discovery recipes](references/discovery-api.md)\n- [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Guidance]\n\n**Output Format:** [Markdown with shell commands and JSON response examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only recipes; returned account data may include personal information.]\n\n## Skill Version(s):\n\n1.1.8 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.7: 5 files, 7432 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (1985b), SKILL.md (3507b), _meta.json (133b)\n\nFile v1.1.7:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup\n```\n\nRequires **ContextMint Bridge**\n(<https://github.com/nullnet-app/contextmint-bridge/releases> — load the chrome\nzip unpacked; use Chrome for now, Safari is not available yet) with site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\nContextMint Bridge is the fetchproxy extension renamed (same maintainer; source at <https://github.com/nullnet-app/contextmint-bridge> — build it, or verify a release zip with `shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in ContextMint Bridge), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.7\",\n  \"publishedAt\": 1791380222781\n}\n\nFile v1.1.7:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.7:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.7:skill-card.md\n\n## Description:\n\nHelps agents retrieve Eventbrite orders, tickets, organization events, attendees, and public event listings through read-only shell commands.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and event organizers use this skill to look up their Eventbrite orders, tickets, events, and attendees, or discover public events without running an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Eventbrite API tokens or browser-session cookies could be exposed.\n\nMitigation: Keep credentials out of logs and commits; prefer token-based access for scripts and grant browser-bridge access only when needed.\n\nRisk: Order and attendee responses may contain private contact and ticket details.\n\nMitigation: Limit displayed fields and avoid logging raw attendee, order, email, or barcode values.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Token API recipes](artifact/references/token-api.md)\n- [Event discovery recipes](artifact/references/discovery-api.md)\n- [Eventbrite API keys](https://www.eventbrite.com/platform/api-keys)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Guidance]\n\n**Output Format:** [Markdown with shell commands and JSON query examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only queries; returned account and attendee data may be sensitive.]\n\n## Skill Version(s):\n\n1.1.7 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.6: 5 files, 7440 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (2050b), SKILL.md (3507b), _meta.json (133b)\n\nFile v1.1.6:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup\n```\n\nRequires **ContextMint Bridge**\n(<https://github.com/nullnet-app/contextmint-bridge/releases> — load the chrome\nzip unpacked; use Chrome for now, Safari is not available yet) with site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\nContextMint Bridge is the fetchproxy extension renamed (same maintainer; source at <https://github.com/nullnet-app/contextmint-bridge> — build it, or verify a release zip with `shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in ContextMint Bridge), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.6\",\n  \"publishedAt\": 1791168479614\n}\n\nFile v1.1.6:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.6:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.6:skill-card.md\n\n## Description:\n\nProvides shell recipes to retrieve Eventbrite tickets, orders, organizational events and attendees, and to discover public events through a browser bridge.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Eventbrite users can retrieve their tickets and orders, inspect organizational events and attendees, and search for public events from a shell without an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: An Eventbrite token or signed-in browser session grants access to private account records.\n\nMitigation: Use this workflow only when comfortable granting that access; keep tokens and cookies private and do not log or commit them.\n\nRisk: Ticket, order, and attendee responses may disclose personal information.\n\nMitigation: Limit access to authorized read-only tasks and avoid logging or sharing raw outputs.\n\n## Reference(s):\n\n- [Eventbrite token API recipes](references/token-api.md)\n- [Eventbrite discovery recipes](references/discovery-api.md)\n- [Eventbrite API keys](https://www.eventbrite.com/platform/api-keys)\n- [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases)\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Guidance, Configuration instructions]\n\n**Output Format:** [Markdown with shell commands and JSON query examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only recipes; retrieved records may contain private account and attendee data.]\n\n## Skill Version(s):\n\n1.1.6 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.5: 5 files, 7432 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (2066b), SKILL.md (3507b), _meta.json (133b)\n\nFile v1.1.5:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup\n```\n\nRequires **ContextMint Bridge**\n(<https://github.com/nullnet-app/contextmint-bridge/releases> — load the chrome\nzip unpacked; use Chrome for now, Safari is not available yet) with site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\nContextMint Bridge is the fetchproxy extension renamed (same maintainer; source at <https://github.com/nullnet-app/contextmint-bridge> — build it, or verify a release zip with `shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in ContextMint Bridge), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1790991625694\n}\n\nFile v1.1.5:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.5:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.5:skill-card.md\n\n## Description:\n\nProvides shell recipes to query Eventbrite tickets, orders, organizer events and attendees, and discover public events through a browser bridge.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and event organizers use these recipes to read their Eventbrite tickets, orders, events and attendee details, or search public events from a shell without an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The browser bridge has Eventbrite site access and can use a signed-in session.\n\nMitigation: Install and pair the bridge only if comfortable granting it Eventbrite site access; use the skill's read-only recipes.\n\nRisk: Orders and attendee results can expose names and email addresses; tokens and cookies grant account access.\n\nMitigation: Keep results private and avoid logging or committing tokens, cookies, and attendee data.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Eventbrite token API recipes](references/token-api.md)\n- [Eventbrite discovery recipes](references/discovery-api.md)\n- [Eventbrite API keys](https://www.eventbrite.com/platform/api-keys)\n- [ContextMint Bridge source and releases](https://github.com/nullnet-app/contextmint-bridge)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Configuration instructions, Guidance]\n\n**Output Format:** [Markdown with shell examples and JSON query recipes]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only recipes; returned results may contain private attendee and account data.]\n\n## Skill Version(s):\n\n1.1.5 (source: server-resolved ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.4: 5 files, 7370 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (1923b), SKILL.md (3507b), _meta.json (133b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup\n```\n\nRequires **ContextMint Bridge**\n(<https://github.com/nullnet-app/contextmint-bridge/releases> — load the chrome\nzip unpacked; use Chrome for now, Safari is not available yet) with site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\nContextMint Bridge is the fetchproxy extension renamed (same maintainer; source at <https://github.com/nullnet-app/contextmint-bridge> — build it, or verify a release zip with `shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in ContextMint Bridge), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1790603738785\n}\n\nFile v1.1.4:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.4:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.4:skill-card.md\n\n## Description:\n\nProvides read-only shell recipes for Eventbrite orders, organizational events and attendees, and public event discovery through a browser bridge.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Eventbrite account holders use this skill to inspect their own tickets and orders, authorized organization events and attendees, and public event listings from a shell without an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Account tokens and browser-session cookies can expose Eventbrite account data.\n\nMitigation: Do not log or commit credentials; revoke tokens and bridge pairing when no longer needed.\n\nRisk: Orders and attendee exports may contain personal data.\n\nMitigation: Access only accounts and organizations you are authorized to use, and handle exports as personal data.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Eventbrite token API recipes](references/token-api.md)\n- [Eventbrite discovery recipes](references/discovery-api.md)\n- [ContextMint Bridge source and setup](https://github.com/nullnet-app/contextmint-bridge)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Guidance]\n\n**Output Format:** [Markdown with shell commands and JSON-query examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only recipes; returned account and attendee data may contain personal information.]\n\n## Skill Version(s):\n\n1.1.4 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 5 files, 7182 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (1885b), SKILL.md (3116b), _meta.json (133b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the Transporter popup\n```\n\nRequires the **Transporter** extension with Chrome site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in Transporter), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1790351556032\n}\n\nFile v1.1.3:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.3:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nGuides read-only Eventbrite queries for tickets, orders, organizer events and attendees, and public event discovery from a shell.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Eventbrite users can retrieve their tickets and orders, inspect their organizations' events and attendees, and find public events using read-only shell recipes.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Queries can expose private account data, including attendee records, orders, and email addresses.\n\nMitigation: Limit queries to needed data and avoid saving, logging, or sharing private results unless necessary.\n\nRisk: An OAuth token or signed-in browser session gives the workflow access to Eventbrite account data.\n\nMitigation: Use only with an account and session you intend to grant access to; keep tokens and cookies private and out of logs.\n\n## Reference(s):\n\n- [Eventbrite MCP release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Documented API recipes](artifact/references/token-api.md)\n- [Event discovery recipes](artifact/references/discovery-api.md)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Guidance]\n\n**Output Format:** [Markdown with shell examples and JSON query results]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only requests; account queries require an OAuth token or an authorized browser session.]\n\n## Skill Version(s):\n\n1.1.3 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.2: 5 files, 7313 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (2246b), SKILL.md (3116b), _meta.json (133b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the Transporter popup\n```\n\nRequires the **Transporter** extension with Chrome site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in Transporter), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1790199621230\n}\n\nFile v1.1.2:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.2:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nQuery Eventbrite from a shell for tickets, orders, organization events, attendees, and public event discovery using curl or a signed-in browser bridge.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, operators, and event organizers use this skill to compose read-only Eventbrite shell commands for account data, event details, attendee lists, orders, and public event search without running an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Eventbrite tokens, browser-session cookies, order details, attendee records, and email addresses can expose private account or event information.\n\nMitigation: Use the recipes only with authorized accounts, organizations, and events; avoid logging, sharing, or committing tokens, cookies, and API output.\n\nRisk: The browser bridge depends on a signed-in Eventbrite browser session and Chrome site access through the Transporter extension.\n\nMitigation: Pair only a trusted browser profile, keep browser access scoped to Eventbrite, and review generated shell commands before running them.\n\n## Reference(s):\n\n- [Eventbrite documented API recipes](references/token-api.md)\n- [Eventbrite discovery API recipes](references/discovery-api.md)\n- [Eventbrite API token setup](https://www.eventbrite.com/platform/api-keys)\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, API Calls, Configuration instructions, Guidance]\n\n**Output Format:** [Markdown with inline shell commands and jq examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only recipes; command output may include JSON containing private Eventbrite account, order, attendee, email, token, or cookie data.]\n\n## Skill Version(s):\n\n1.1.2 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.1: 5 files, 7385 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (2453b), SKILL.md (3116b), _meta.json (133b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the Transporter popup\n```\n\nRequires the **Transporter** extension with Chrome site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in Transporter), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1790178351570\n}\n\nFile v1.1.1:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.1:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.1:skill-card.md\n\n## Description:\n\nQuery eventbrite.com from a shell -- your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API).\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to compose read-only Eventbrite shell commands for account tickets, orders, organization events, attendees, public event lookup by id, and public event discovery/search.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Commands can expose private Eventbrite account, order, ticket, attendee, token, cookie, CSRF, or browser-session data.\n\nMitigation: Review each command before running it, avoid logging full responses, and treat tokens, cookies, CSRF values, attendee emails, orders, and tickets as sensitive.\n\nRisk: Browser-bridged discovery calls depend on an authenticated Eventbrite browser session and may access data through that session.\n\nMitigation: Prefer the documented token API for repeatable scripts, use fpx only when needed for discovery or session-authenticated reads, and keep the Eventbrite browser session limited to the intended account.\n\n## Reference(s):\n\n- [Eventbrite documented API recipes](references/token-api.md)\n- [Eventbrite discovery API recipes](references/discovery-api.md)\n- [Eventbrite skill page](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Publisher profile](https://clawhub.ai/user/chrischall)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline shell commands, curl/fpx examples, JSON request bodies, and jq filters]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only command recipes; may reference Eventbrite OAuth tokens, browser-session access through fpx, CSRF values, pagination, and endpoint-specific response handling.]\n\n## Skill Version(s):\n\n1.1.1 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.0: 5 files, 7232 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (2027b), SKILL.md (3116b), _meta.json (133b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the Transporter popup\n```\n\nRequires the **Transporter** extension with Chrome site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in Transporter), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1789873083158\n}\n\nFile v1.1.0:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.1.0:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.1.0:skill-card.md\n\n## Description:\n\nQuery eventbrite.com from a shell for tickets, orders, organization events, attendees, and public event discovery using documented Eventbrite token API calls and browser-bridged fpx requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and operators use this skill to query Eventbrite account, ticket, order, organization, attendee, and public event data from shell workflows without running an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can expose sensitive Eventbrite account, order, organization, attendee, token, cookie, and browser-bridge data to the agent.\n\nMitigation: Install only when that read access is acceptable, avoid logging or committing sensitive values and outputs, and keep tokens and cookies out of shared files.\n\nRisk: The documented Eventbrite API supports write operations that are outside this skill's stated scope.\n\nMitigation: Use the recipes as read-only queries and do not improvise create, update, or other write calls from this skill.\n\n## Reference(s):\n\n- [Eventbrite documented API curl recipes](references/token-api.md)\n- [Eventbrite discovery API fpx recipes](references/discovery-api.md)\n- [Eventbrite API token setup](https://www.eventbrite.com/platform/api-keys)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown with shell commands and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only Eventbrite query recipes using curl, jq, and fpx]\n\n## Skill Version(s):\n\n1.1.0 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.0: 5 files, 7256 bytes\n\nFiles: references/discovery-api.md (4316b), references/token-api.md (3845b), skill-card.md (2140b), SKILL.md (3116b), _meta.json (133b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the Transporter popup\n```\n\nRequires the **Transporter** extension with Chrome site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope; loop with\n  `?continuation=<token>` while `has_more_items` is true.\n- **fpx exit codes**: `2` bridge down (pair/approve in Transporter), `3` bot\n  wall (refresh a signed-in eventbrite.com tab), `4` upstream non-2xx.\n- **Read-only**: these recipes only read data. The documented API supports\n  organizer writes (create/update events etc.) but they are out of scope\n  here — don't improvise write calls from this skill.\n- Never log or commit the token or captured cookies.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1789688262893\n}\n\nFile v1.0.0:references/discovery-api.md\n\n# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>,<id>&expand=primary_venue,image,ticket_availability,event_sales_status,primary_organizer' \\\n  -p eventbrite | jq '.events[]'\n```\n\nEvent ids are the trailing digits in event URLs (`…-tickets-<id>`). For\nfull ticket-class detail prefer the documented API (`token-api.md`) —\n`/events/<id>/` works for any public event with just a token.\n\n## Your account data through the bridge (no token needed)\n\nThe www host proxies the documented v3 API with the browser session's auth,\nso the whole `token-api.md` surface also works session-authed via fpx —\nsame paths, `www.eventbrite.com` host (live-verified: `/api/v3/users/me/`):\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/users/me/orders/?expand=event&time_filter=current_future' \\\n  -p eventbrite | jq '.orders[] | {id, event: .event.name.text}'\n```\n\nPrefer the token + curl for scripts (no browser dependency); use this when\nno token is configured.\n\n## Gotchas\n\n- A non-JSON 2xx body from any of these = the WAF interstitial leaked\n  through — refresh a signed-in eventbrite.com tab and retry.\n- `log_requests` / `log_engagement` endpoints seen in captures are\n  analytics — don't call them.\n- The `?stable_id=` query param on the site's own search calls is a client\n  analytics uuid — omit it.\n\nFile v1.0.0:references/token-api.md\n\n# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery list response carries:\n\n```json\n{\"pagination\": {\"object_count\": 123, \"page_size\": 50, \"has_more_items\": true, \"continuation\": \"...\"}}\n```\n\nLoop with `?continuation=<token>` (repeat the original params) while\n`has_more_items` is true. `page_size` max is generally 100 for org-level\nlists, 50 elsewhere.\n\n## Errors\n\nNon-2xx bodies are JSON: `{\"status_code\": N, \"error\": \"CODE\",\n\"error_description\": \"...\"}`. Live-verified examples: bad token →\n`401 INVALID_AUTH`; missing CSRF (www host only) → `401 ACCESS_DENIED`.\n`404 NOT_FOUND` for unknown ids; `429` when rate-limited (token buckets:\n2,000 calls/hour per token by default).\n\n## No search here\n\n`GET /events/search/` was removed from this API (Dec 2019) — it now 404s.\nPublic event discovery only exists on the WAF-walled consumer surface; see\n`discovery-api.md` (fpx bridge).\n\nFile v1.0.0:skill-card.md\n\n## Description:\n\nQuery eventbrite.com from a shell for tickets, orders, organization events, attendees, and public event discovery using the documented token API and an fpx browser bridge.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and operators use this skill to compose read-only shell commands for Eventbrite account, organizer, attendee, order, and public discovery data without running an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can expose Eventbrite tokens, browser-session cookies, attendee emails, order details, and exported responses.\n\nMitigation: Use it for narrow read-only tasks, avoid broad attendee or order dumps unless necessary, and do not log, commit, or share tokens, cookies, attendee emails, order details, or exported responses.\n\nRisk: The fpx browser bridge may use a signed-in Eventbrite browser session to access account data.\n\nMitigation: Install only if comfortable granting the agent access to the Eventbrite token or signed-in browser session, and keep usage scoped to read-only queries.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Eventbrite documented API recipes](references/token-api.md)\n- [Eventbrite discovery API fpx recipes](references/discovery-api.md)\n- [Eventbrite API keys](https://www.eventbrite.com/platform/api-keys)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, configuration]\n\n**Output Format:** [Markdown with inline shell commands and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only Eventbrite command recipes using curl, jq, and fpx.]\n\n## Skill Version(s):\n\n1.0.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: eventbrite-mcp Owner: chrischall Summary: Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot. Tags: latest:1.1.8 Versio","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"npm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup"},{"language":"sh","snippet":"curl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq"},{"language":"sh","snippet":"curl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq"},{"language":"sh","snippet":"fpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'"},{"language":"sh","snippet":"CSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')"},{"language":"sh","snippet":"# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: eventbrite\ndescription: \"Query eventbrite.com from a shell — your tickets/orders, your organizations' events and attendees via the documented token API (curl), and public event discovery/search via the fpx browser bridge (the search API is WAF-walled and absent from the documented API). Use when you want Eventbrite data without an MCP server, in a script, or one-shot.\"\n---\n\n# Eventbrite access (curl + fpx)\n\nTwo surfaces, two tools — match the tool to reachability:\n\n1. **Documented API `https://www.eventbriteapi.com/v3`** — reachable\n   server-side with a personal OAuth token. Use plain `curl`. Covers your\n   identity, your orders/tickets, organizations you own (events, attendees,\n   orders), and any event **by id**. It has **no public event search** —\n   Eventbrite removed it from the documented API in 2019.\n2. **Consumer site API `https://www.eventbrite.com/api/v3/destination/…`** —\n   WAF-blocked for any server-side client (returns an HTML \"Whoops!\" page).\n   Public event **search/discovery** lives only here, so those calls route\n   through the user's signed-in browser tab with `fpx`.\n\n## One-time setup\n\n**Token (curl surface):** create a private token at\n<https://www.eventbrite.com/platform/api-keys> (free for any Eventbrite\naccount) and export it as `EVENTBRITE_TOKEN`.\n\n**Bridge (fpx surface):**\n\n```sh\nnpm install -g @fetchproxy/cli                  # provides `fpx`\nfpx profile add eventbrite --domain eventbrite.com\nfpx pair -p eventbrite    # prints a pair code → approve in the ContextMint Bridge popup\n```\n\nRequires **ContextMint Bridge**\n(<https://github.com/nullnet-app/contextmint-bridge/releases> — load the chrome\nzip unpacked; use Chrome for now, Safari is not available yet) with site access for\n`eventbrite.com` and an open (signed-in for account data) eventbrite.com tab.\nPairing persists after the first approval.\nContextMint Bridge is the fetchproxy extension renamed (same maintainer; source at <https://github.com/nullnet-app/contextmint-bridge> — build it, or verify a release zip with `shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256`).\n\n## Core calls\n\nToken surface — every request is:\n\n```sh\ncurl -sS \"https://www.eventbriteapi.com/v3/users/me/\" \\\n  -H \"Authorization: Bearer $EVENTBRITE_TOKEN\" | jq\n```\n\nBridge surface — stdout is data only, ready for `jq`:\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v3/destination/events/?event_ids=<id>&expand=event_sales_status,primary_venue' \\\n  -p eventbrite | jq '.events[0]'\n```\n\nReady-to-run request bodies and `jq` recipes: `references/token-api.md`\n(curl surface) and `references/discovery-api.md` (fpx surface, incl. event\nsearch). Read the relevant reference before composing a call — the search\nbody shape and the resolve-location-first rule live there.\n\n## Rules\n\n- **Resolve places before searching**: destination search takes place ids,\n  not free-text locations — autocomplete first (see `discovery-api.md`).\n- **Pagination**: v3 responses carry a `pagination` envelope;"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"eventbrite-mcp\",\n  \"version\": \"1.1.8\",\n  \"publishedAt\": 1791588273865\n}"},{"path":"references/discovery-api.md","content":"# Eventbrite discovery API (`www.eventbrite.com/api/v3/destination/…`) — fpx recipes\n\nPublic event search/discovery. WAF-blocked server-side; every call here goes\nthrough the fpx bridge (`-p eventbrite`). Request shapes below were captured\nlive from the site's own network traffic (2026-07-30, web_app discover\nv10.14.65).\n\n## CSRF (search POST only)\n\nGETs need nothing extra. The search POST requires the Django CSRF header,\nwhose value is the `csrftoken` cookie (32 chars, JS-readable). Read it\nthrough the bridge — the profile must declare the cookie scope (see SKILL.md\nsetup):\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\n```\n\nIf the cookie is absent, load any eventbrite.com page in the browser first.\n\n## Resolve a place id first\n\nSearches take internal place ids (e.g. Charlotte NC = `85981333`), never\nplace names. The site itself resolves locations via Google Places, but the\nscriptable route is the SSR page store: fetch the browse page for the\nlocation slug and pull `placeId` out of the embedded `__SERVER_DATA__`:\n\n```sh\n# slug format: <state>--<city> (US) or <country>--<city>\nfpx get 'https://www.eventbrite.com/d/co--denver/events/' -p eventbrite \\\n  | grep -oE '\"placeId\":\"[0-9]+\"' | head -1\n```\n\nThe same SSR page embeds the full first page of results in\n`search_data.events` — for a quick \"what's on in <city>\" that GET alone may\nbe all you need.\n\n## Event search\n\n```sh\nCSRF=$(fpx cookies csrftoken -p eventbrite | jq -r '.csrftoken')\ncat > /tmp/eb-search.json <<'EOF'\n{\n  \"browse_surface\": \"search\",\n  \"event_search\": {\n    \"q\": \"blues\",\n    \"places\": [\"85981333\"],\n    \"dates\": [\"current_future\"],\n    \"dedup\": true,\n    \"page\": 1,\n    \"page_size\": 20\n  },\n  \"expand.destination_event\": [\n    \"primary_venue\", \"image\", \"ticket_availability\",\n    \"event_sales_status\", \"primary_organizer\"\n  ]\n}\nEOF\nfpx post-json 'https://www.eventbrite.com/api/v3/destination/search/' @/tmp/eb-search.json \\\n  -p eventbrite -H \"X-CSRFToken: $CSRF\" -H \"X-Requested-With: XMLHttpRequest\" \\\n  | jq '.events.results[] | {id, name, start: .start_date, venue: .primary_venue.name, url}'\n```\n\nBody knobs (all inside `event_search`, all optional except you want at least\n`q` or `places`):\n\n- `q` — keyword text.\n- `places` — array of place-id strings (resolve first, above).\n- `dates` — array; `\"current_future\"` plus optionally one of `\"today\"`,\n  `\"tomorrow\"`, `\"this_weekend\"`; or `date_range: {from, to}` (ISO dates).\n- `tags` — category/format filters: `\"EventbriteCategory/<id>\"` (103 =\n  Music …), `\"EventbriteSubCategory/<id>\"`, `\"EventbriteFormat/<id>\"`. Ids\n  match the documented API's `/categories/` etc. (see token-api.md).\n- `online_events_only` — bool.\n- `price` — `\"free\"` or `\"paid\"`.\n- `page`, `page_size` (site uses 20), `dedup: true`.\n\nResponse: `{events: {pagination: {object_count, page_count, continuation},\nresults: [...]}, ...}` — paginate by incrementing `page`.\n\n## Event detail by id (GET, no CSRF)\n\n```sh\nfpx get 'https://www.eventbrite.com/api/v"},{"path":"references/token-api.md","content":"# Eventbrite documented API (`eventbriteapi.com/v3`) — curl recipes\n\nAuth on every call: `-H \"Authorization: Bearer $EVENTBRITE_TOKEN\"`.\nPersonal token: <https://www.eventbrite.com/platform/api-keys>.\nAll endpoints end with a trailing slash — omitting it 301s.\n\n> Verification status (2026-07-30): `eventbriteapi.com` reachability and the\n> 401 error envelope are live-verified. Endpoint shapes were live-verified\n> through the session-authed www-host variant of the same v3 API\n> (`www.eventbrite.com/api/v3/…`): `/users/me/`, `/users/me/orders/`\n> envelope, `/users/me/organizations/` envelope, `/categories/`, and\n> `/events/<id>/?expand=venue,ticket_availability` on a public event.\n> `/ticket_classes/`, `/description/`, `/attendees/`, `/venues/`,\n> `/subcategories/`, `/formats/` follow the official API reference but\n> weren't exercised — eyeball the first response before building on a field.\n\nShorthand used below:\n\n```sh\neb() { curl -sS \"https://www.eventbriteapi.com/v3$1\" -H \"Authorization: Bearer $EVENTBRITE_TOKEN\"; }\n```\n\n## Identity\n\n```sh\neb /users/me/ | jq '{id, name, email: .emails[0].email}'\n```\n\n## Your tickets / orders (attendee side)\n\n```sh\n# upcoming orders with the event expanded\neb '/users/me/orders/?expand=event&time_filter=current_future' \\\n  | jq '.orders[] | {id, status, event: .event.name.text, start: .event.start.local}'\n\n# one order with attendees (barcode-level detail)\neb '/orders/<order_id>/?expand=attendees' | jq\n```\n\n`time_filter`: `all` | `current_future` | `past`.\n\n## Organizations you belong to (organizer side)\n\n```sh\neb /users/me/organizations/ | jq '.organizations[] | {id, name}'\n\n# events for an org: status live|draft|started|ended|completed|canceled|all\neb '/organizations/<org_id>/events/?status=live&order_by=start_asc' \\\n  | jq '.events[] | {id, name: .name.text, start: .start.local, url}'\n\n# attendees / orders across the org\neb '/organizations/<org_id>/attendees/?status=attending' | jq '.attendees[] | {profile: .profile.name, email: .profile.email, event_id}'\neb '/organizations/<org_id>/orders/' | jq '.orders[] | {id, email, status}'\n```\n\n## Any event by id (works for public events, not just yours)\n\n```sh\neb '/events/<event_id>/?expand=venue,organizer,ticket_availability' \\\n  | jq '{name: .name.text, start: .start.local, end: .end.local, venue: .venue.name, is_free, status, url}'\n\neb '/events/<event_id>/ticket_classes/' | jq '.ticket_classes[] | {name, free, cost: .cost.display, on_sale_status}'\neb '/events/<event_id>/description/' | jq -r .description   # full HTML description\neb '/events/<event_id>/attendees/' | jq                     # your own events only\n```\n\nEvent ids are the long digits in any event URL (`…-tickets-<event_id>`).\n\n## Reference data\n\n```sh\neb /categories/ | jq '.categories[] | {id, name}'\neb /subcategories/ | jq '.subcategories[] | {id, name}'\neb /formats/ | jq '.formats[] | {id, name}'\neb '/venues/<venue_id>/' | jq '{name, address: .address.localized_address_display}'\n```\n\n## Pagination\n\nEvery "},{"path":"skill-card.md","content":"## Description:\n\nHelps agents retrieve Eventbrite tickets, orders, organizer events and attendees, and discover public events using read-only requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Eventbrite users can look up their tickets and orders, review their organizations' events and attendees, and search for public events without an MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Account tokens, browser cookies, and order or attendee details may be exposed in logs, commits, or shared transcripts.\n\nMitigation: Keep credentials and personal data out of logs, commits, and shared transcripts; give tools account access only when needed.\n\nRisk: Improvised API calls could change organizer data despite the skill's read-only scope.\n\nMitigation: Use only the documented read-only recipes; do not add write calls.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/eventbrite-mcp)\n- [Eventbrite token API recipes](references/token-api.md)\n- [Eventbrite discovery recipes](references/discovery-api.md)\n- [ContextMint Bridge](https://github.com/nullnet-app/contextmint-bridge)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Guidance]\n\n**Output Format:** [Markdown with shell commands and JSON response examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only recipes; returned account data may include personal information.]\n\n## Skill Version(s):\n\n1.1.8 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1719,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T11:19:36.973Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:40:58.193Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}