grouponlisted
Install: claude install-skill chrischall/groupon-mcp
# Groupon deals via curl
Groupon's consumer deal data comes from **one GraphQL endpoint** that answers a
plain server-side `curl` with **no cookies, no key, no login, no bot wall**:
```
POST https://www.groupon.com/mobilenextapi/graphql
-H 'content-type: application/json'
-H 'apollographql-client-name: mobilenextapi'
```
Requests are a **batched JSON array** of Apollo **persisted-query** operations
(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query
text — introspection is off and the server masks GraphQL errors as opaque 400
HTML, so you cannot hand-author queries). The response is a **JSON array**;
`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in
[`references/graphql-queries.md`](references/graphql-queries.md).
## The three operations
| Need | Op | Root field |
|------|----|-----------|
| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |
| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |
| Category taxonomy | `GetMainNavigation` | `.[0].data...` |
`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).
`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a
card's `.url` (`https://www.groupon.com/deals/<dealId>`).
## Two failure modes
- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.
- **`{"errors":[{