setlist-fpx
Query and update setlist.fm from a shell without running the setlist-mcp server — search/read concert setlists, artists, venues, cities, and users via plain curl against the public REST API (an x-api-key header), and toggle "I was there" attendance on a setlist via the authenticated website, using an fpx-captured session cookie. Use when you want setlist.fm data or want to mark/unmark attendance without the MCP, in a script, or on a machine where the MCP isn't installed.
Rank
62
Safety
84
Downloads
1.7k
Updated
Oct 10, 2026
Version
1.1.8
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.
Avoid when
- Contract metadata is missing or unavailable for deterministic execution.
Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing
Public facts
Every fact links back to the source it came from.
- Vendor
- Clawhubvendor · observed Oct 10, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 10, 2026
- Adoption signal
- 1.7K downloadsadoption · observed Oct 10, 2026
- Latest release
- 1.1.8release · observed Oct 9, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist-fpx- Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:setlist-fpx` 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/setlist-fpx before using production credentials.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/snapshot"
Documentation
CLAWHUB
148,432 characters of source documentation, loaded on request.
Extracted files
5 files captured from the source.
SKILL.md
---
name: setlist-fpx
description: >-
Query and update setlist.fm from a shell without running the setlist-mcp
server — search/read concert setlists, artists, venues, cities, and users
via plain curl against the public REST API (an x-api-key header), and
toggle "I was there" attendance on a setlist via the authenticated website,
using an fpx-captured session cookie. Use when you want setlist.fm data or
want to mark/unmark attendance without the MCP, in a script, or on a
machine where the MCP isn't installed.
---
# setlist.fm via curl + fpx (no MCP)
setlist.fm is **hybrid**: reads and writes use two different surfaces.
- **Reads** — a documented public REST API (`api.setlist.fm/rest`) keyed by
an **`x-api-key` header**. Plain `curl`, no browser, no fpx.
- **Writes** — the only mutation setlist.fm offers is the site's "I was
there" attendance toggle, and it exists **only on the logged-in website**
(`www.setlist.fm`, server-rendered Apache Wicket), not the REST API. There's
no login form to script — the credential is your browser's session cookie.
`fpx` lifts that cookie out of your signed-in tab **once**; every actual
request afterward is plain `curl` carrying it. No bridge round-trip per call.
This is the same data/actions the `setlist_*` MCP tools expose, reached with
`curl` instead of a running server.
## Part 1 — reads (curl + API key)
### One-time setup
Apply for a free key at <https://www.setlist.fm/settings/api>, non-commercial
use only (see API terms below), then:
```sh
export SETLIST_API_KEY=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```
### Core call
```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/artists?artistName=Radiohead' \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
| jq '.artist[] | {name, mbid, url}'
```
`Accept: application/json` is required — the API serves XML otherwise.
Optional `Accept-Language: en|es|fr|de|pt|tr|it|pl` localizes city/country
names. Standard tier is **~2 req/sec, 1440/day** — a 429 means slow down.
**Dates are `dd-MM-yyyy` on the wire** (NOT ISO) for `date` search params and
`lastUpdated` (`yyyyMMddHHmmss`); `eventDate` comes back the same way in
responses — convert both directions yourself (the MCP does this for you via
`dmyToIso`/`isoToDmy`; a shell one-liner: `date -j -f '%Y-%m-%d' '+%d-%m-%Y'`
on macOS).
The full request catalog (all 15 read endpoints, params, and `jq` projections)
is in `references/rest-api.md`.
### The one rule: chain ids, don't guess them
Every entity is keyed by an id you get from a search: artists by **`mbid`**
(MusicBrainz id), setlists by **`setlistId`**, venues by **`venueId`**,
cities by **`geoId`**. Search first, then feed the id into the matching
`get`/`setlists` endpoint. Got a setlist.fm URL instead of an id? The id is
the trailing hex token before `.html`, e.g.
`.../setlist/.../...-4ba8a766.html` → `4ba8a766` — no fetch needed.
### Attribution (compliance, not optional)
The API terms require a **followable l_meta.json
{
"ownerId": "kn700jq4sjtf2anb0rk3ft4p7n856872",
"slug": "setlist-fpx",
"version": "1.1.8",
"publishedAt": 1791588521698
}references/attendance-write.md
# Attendance write walkthrough (fpx cookie + curl)
Mirrors `setlist-mcp`'s `setlist_mark_attended` / `setlist_unmark_attended`
tools exactly (`src/tools/attendance.ts`, `src/web-client.ts`). There is no
JSON API for this — you're driving the same server-rendered Apache Wicket
page a signed-in browser would.
Prereqs: `SETLIST_API_KEY` set (Part 1) and `COOKIE`/`UA` captured per
`SKILL.md` Part 2.
## Step 0 — resolve the setlist's canonical URL
You need the setlist's public page path. Either you already have a
setlist.fm URL (skip to step 1), or resolve it via the API using the
`setlistId`:
```sh
SETLIST_ID=63de4613
META=$(curl -s "https://api.setlist.fm/rest/1.0/setlist/$SETLIST_ID" \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json')
URL=$(echo "$META" | jq -r '.url') # e.g. https://www.setlist.fm/setlist/.../...-4ba8a766.html
PATH_ONLY=$(echo "$URL" | sed -E 's#https?://[^/]+##') # /setlist/.../...-4ba8a766.html
```
## Step 1 — fetch the page, authenticated
```sh
HTML=$(curl -s "https://www.setlist.fm$PATH_ONLY" \
-H "Cookie: $COOKIE" -H "User-Agent: $UA")
```
**Check you're actually signed in** before going further — a logged-out page
links to sign-in instead of showing the attendance control:
```sh
echo "$HTML" | grep -qE 'href="/(signin|login)\b' && echo "SESSION EXPIRED — re-capture the cookie" >&2
```
## Step 2 — find the attendance control
The control is an `<a>` tag with a `wicketAjaxGet('...')` onclick and a
`title` of either:
- `"Add this setlist to your attended shows."` → **not** currently attended
- `"Remove this setlist from your attended shows."` → **currently** attended
Extract both the per-render AJAX URL and the current state with `perl`
(installed on macOS by default). For each `<a>` tag, check for
`wicketAjaxGet(...)` and `title="..."` independently within the same
800-char window — same as `src/tools/attendance.ts`'s `parseAttendance()` —
rather than requiring `title=` to appear before `onclick=`, since real
markup doesn't guarantee that ordering. Entity-decode the URL the same way
`decodeEntities()` does: `&` plus numeric character references
(`&#x..;` hex and `&#..;` decimal), which a plain grep would mangle:
```sh
read -r AJAX_URL CURRENTLY_ATTENDED < <(
echo "$HTML" | perl -0777 -ne '
while (/<a\b(.{0,800})/gs) {
my $seg = $1;
next unless $seg =~ /wicketAjaxGet\(\s*[\x27"]([^\x27"]+)[\x27"]/;
my $url = $1;
next unless $seg =~ /title="([^"]*attended shows[^"]*)"/;
my $attended = $1 =~ /remove/i ? 1 : 0;
$url =~ s/&/&/g;
$url =~ s/&#x([0-9a-fA-F]+);/chr(hex($1))/ge;
$url =~ s/&#(\d+);/chr($1)/ge;
print "$url $attended\n";
last;
}
'
)
```
If `$AJAX_URL` is empty: the control genuinely isn't on the page (rare — a
layout change, or you hit a bot-rate-limit page) — re-check step 1's
logged-out test first, since that's the far more common cause.
## Step 3 — decide: no-op, dry-run, or toggle
```sh
DESIRED=1references/rest-api.md
# setlist.fm REST API — read endpoints for curl
Base URL: `https://api.setlist.fm/rest` · every call: `-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json'`.
Optional: `-H "Accept-Language: en"` (one of `en es fr de pt tr it pl`) to localize city/country names.
All 15 read endpoints below are exactly what `setlist-mcp`'s tools call — same paths, same params.
---
## Artists
### 1. Search artists
```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/artists' \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
--get --data-urlencode 'artistName=Radiohead' --data-urlencode 'sort=relevance' \
| jq '.artist[] | {name, mbid, url}'
```
Params: `artistName`, `artistMbid`, `sort` (`sortName` default | `relevance`), `p` (page, default 1).
### 2. Get artist by mbid
```sh
curl -s "https://api.setlist.fm/rest/1.0/artist/$MBID" \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' | jq
```
### 3. Artist's setlists (most recent first)
```sh
curl -s "https://api.setlist.fm/rest/1.0/artist/$MBID/setlists?p=1" \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
| jq '.setlist[] | {id, eventDate, venue: .venue.name, city: .venue.city.name, songCount, hasSongs}'
```
`songCount`/`setCount`/`hasSongs` are annotations the MCP adds by walking the
response locally (not native API fields) — derive them yourself if you need
them: `songCount = ([.sets.set[].song[]?] | length)`.
---
## Setlists
### 4. Search setlists
Provide at least one filter. `date` is `dd-MM-yyyy` (NOT ISO); `lastUpdated`
is `yyyyMMddHHmmss` UTC.
```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/setlists' \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
--get \
--data-urlencode 'artistName=Radiohead' \
--data-urlencode 'date=28-08-2025' \
--data-urlencode 'cityName=Charlotte' \
| jq '.setlist[] | {id, url, venue: .venue.name, eventDate}'
```
Other params: `artistMbid`, `venueName`, `venueId`, `cityId`, `state`,
`stateCode`, `countryCode`, `tourName`, `year`, `p`. Omit the artist and pass
`venueName`/`venueId` + `date` to list every performer at a venue that day.
### 5. Get setlist by id
```sh
curl -s "https://api.setlist.fm/rest/1.0/setlist/$SETLIST_ID" \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' | jq
```
Songs live in `.sets.set[].song[]`; a `set` may have `encore` (1 = first
encore) and `name` (e.g. an acoustic set). A `song` may carry `tape: true`
(pre-recorded, not performed), `cover` (original artist), `with` (guest), and
`info` (a note like "acoustic").
### 6. Get a specific historical version
```sh
curl -s "https://api.setlist.fm/rest/1.0/setlist/version/$VERSION_ID" \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' | jq
```
---
## Venues
### 7. Search venues
```sh
curl -s 'https://api.setlist.fm/rest/1.0/search/venues' \
-H "x-api-key: $SETLIST_API_KEY" -H 'Accept: application/json' \
--get --data-urlencode 'name=The Fillmore' --data-urskill-card.md
## Description: Guides agents in searching and reading setlist.fm concert data with its REST API and updating a user's attendance through an authenticated browser session, without running an MCP server. This skill is ready for commercial/non-commercial use. ## Publisher: [chrischall](https://clawhub.ai/user/chrischall) ### License/Terms of Use: MIT-0 ## Use Case: Developers and other setlist.fm users can use this skill to look up artists, setlists, venues, cities, and users from a shell, or mark and unmark their attendance at a show. The free setlist.fm API key is restricted to non-commercial use under the site's API terms. ### Deployment Geography for Use: Global ## Known Risks and Mitigations: Risk: A captured setlist.fm session cookie can enable account actions if disclosed. Mitigation: Treat the cookie like a password; keep it out of logs, shell history, commits, and shared transcripts, and use the bridge only if you trust it with your session. Risk: Blindly toggling attendance can undo the intended state. Mitigation: Check the current state, dry-run before sending the toggle, and re-fetch the page to verify the result. ## Reference(s): - [setlist-fpx release on ClawHub](https://clawhub.ai/chrischall/skills/setlist-fpx) - [setlist.fm API key and terms](https://www.setlist.fm/settings/api) - [REST API read endpoints](references/rest-api.md) - [Attendance update walkthrough](references/attendance-write.md) - [ContextMint Bridge releases](https://github.com/nullnet-app/contextmint-bridge/releases) ## Skill Output: **Output Type(s):** [Guidance, Shell commands, Configuration instructions] **Output Format:** [Markdown with shell command examples] **Output Parameters:** [1D] **Other Properties Related to Output:** [REST reads require an API key; attendance changes require an authenticated setlist.fm session and confirmation of the current state.] ## Skill Version(s): 1.1.8 (source: ClawHub release evidence) ## Ethical Considerations: Users 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.
AionUi
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!
activepieces
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
cherry-studio
AI productivity studio with smart chat, autonomous agents, and 300+ assistants.
CopilotKit
The Frontend for Agents & Generative UI. React + Angular
Machine-readable data
The same record, as JSON, for agents and crawlers.
{
"facts": [
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/chrischall/skills/setlist-fpx",
"sourceUrl": "https://clawhub.ai/chrischall/skills/setlist-fpx",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-10T04:36:06.054Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-10T04:36:06.054Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.7K downloads",
"href": "https://clawhub.ai/chrischall/setlist-fpx",
"sourceUrl": "https://clawhub.ai/chrischall/setlist-fpx",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-10T04:36:06.054Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "1.1.8",
"href": "https://clawhub.ai/chrischall/setlist-fpx",
"sourceUrl": "https://clawhub.ai/chrischall/setlist-fpx",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-10-09T23:28:41.698Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-setlist-fpx/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 1.1.8",
"description": "- Removed the redundant file skill-card.md; no user-facing or functional changes. - No changes to feature set or documentation. - Version update for housekeeping and file cleanup.",
"href": "https://clawhub.ai/chrischall/setlist-fpx",
"sourceUrl": "https://clawhub.ai/chrischall/setlist-fpx",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-10-09T23:28:41.698Z",
"isPublic": true
}
]
}Record generated Oct 10, 2026.
