otc-curl
Query the On the Cheap network (charlotteonthecheap.com, milehighonthecheap.com and ~12 sister city sites) from the shell with curl and jq — daily local event listings with times/prices/venues, plus searchable articles on free and cheap things to do. Use when the user wants local event or deal data and the onthecheap MCP server is not available. Skill: otc-curl Owner: chrischall Summary: Query the On the Cheap network (charlotteonthecheap.com, milehighonthecheap.com and ~12 sister city sites) from the shell with curl and jq — daily local event listings with times/prices/venues, plus searchable articles on free and cheap things to do. Use when the user wants local event or deal data and the onthecheap MCP server is not available. Tags: latest:1.1.7 Version hi
Rank
62
Safety
84
Downloads
1.2k
Updated
Oct 11, 2026
Version
1.1.7
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/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 11, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 11, 2026
- Adoption signal
- 1.2K downloadsadoption · observed Oct 11, 2026
- Latest release
- 1.1.7release · observed Oct 9, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:otc-curl- Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.
- Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-otc-curl/snapshot"
Documentation
CLAWHUB
132,616 characters of source documentation, loaded on request.
Extracted files
4 files captured from the source.
SKILL.md
--- name: otc-curl description: Query the On the Cheap network (charlotteonthecheap.com, milehighonthecheap.com and ~12 sister city sites) from the shell with curl and jq — daily local event listings with times/prices/venues, plus searchable articles on free and cheap things to do. Use when the user wants local event or deal data and the onthecheap MCP server is not available. --- # On the Cheap via curl The "on the Cheap" sites are public WordPress sites with open REST APIs and no bot wall, so they are read directly with `curl` — **no API key, no login, no browser bridge**. Nothing needs installing beyond `curl` and `jq`. If the `onthecheap` MCP server is available, prefer its tools; they handle the date-format, truncation and category-id traps below for you. This skill is the fallback. ```bash # Pick a city — every site below works identically. BASE=https://www.charlotteonthecheap.com # charlotte # BASE=https://www.milehighonthecheap.com # denver # BASE=https://triangleonthecheap.com # raleigh/durham/chapel hill # also: atlanta, chicago, columbus, greaterseattle, kansascity, miami, # orlando, portlandliving, rva, southernmaine (all *onthecheap.com) UA='onthecheap-skill (+https://github.com/chrischall/onthecheap-mcp)' ``` ## Articles — JSON ```bash # Search (slim fields; drop _fields for full records). $EXPIRED is resolved below. curl -sA "$UA" "$BASE/wp-json/wp/v2/posts?search=free+museum&per_page=10&categories_exclude=$EXPIRED&_fields=id,slug,date,link,title,excerpt" | jq -r '.[] | "\(.date[0:10]) \(.title.rendered)"' # One article by slug curl -sA "$UA" "$BASE/wp-json/wp/v2/posts?slug=<slug>" | jq -r '.[0].content.rendered' # Filter ids curl -sA "$UA" "$BASE/wp-json/wp/v2/categories?per_page=100&orderby=count&order=desc&_fields=id,slug,count" | jq -r '.[] | "\(.id)\t\(.count)\t\(.slug)"' ``` **Always exclude the `expired` category — and look its id up first.** Retired deals are parked there (a third to two-thirds of a site's posts), so without the filter you show the user offers that no longer exist. **The id differs on every site** (`2`, `379`, `4483`, `6193`, `7803`, `16289`, …), so never hardcode one — an id from another site matches nothing and silently disables the filter: ```bash EXPIRED=$(curl -sA "$UA" "$BASE/wp-json/wp/v2/categories?slug=expired&_fields=id" | jq -r '.[0].id') curl -sA "$UA" "$BASE/wp-json/wp/v2/posts?per_page=10&categories_exclude=$EXPIRED&_fields=date,title,link" ``` Titles and excerpts come back HTML-entity-encoded (`’`, `—`). See `references/recipes.md` for a decode filter. ## Events — HTML Events are **not** in the REST API (`/wp-json/wp/v2/event` → 404); they are parsed from rendered HTML. Every city site uses the same markup and routing (the national hub, livingonthecheap.com, has no local calendar). ```bash # One day — note the US M-D-YYYY order curl -sLA "$UA" "$BASE/events/view-date/7-25-2026/" # One month curl -sLA "$UA" "$BASE/events/calendar/08-2026/" ```
_meta.json
{
"ownerId": "kn700jq4sjtf2anb0rk3ft4p7n856872",
"slug": "otc-curl",
"version": "1.1.7",
"publishedAt": 1791588526243
}references/recipes.md
# Ready-to-run recipes
All verified live on 2026-07-19. Set once:
```bash
BASE=https://www.charlotteonthecheap.com # or any sister site, see SKILL.md
UA='onthecheap-skill (+https://github.com/chrischall/onthecheap-mcp)'
# Resolve the "expired" category for THIS site — the id differs on every one
# (2, 379, 4483, 6193, 7803, 16289, …), so a hardcoded value silently matches
# nothing and serves dead deals as live.
EXPIRED=$(curl -sA "$UA" "$BASE/wp-json/wp/v2/categories?slug=expired&_fields=id" | jq -r '.[0].id // empty')
echo "expired category on this site: ${EXPIRED:-none}"
```
## Articles
### Search, formatted
```bash
curl -sA "$UA" "$BASE/wp-json/wp/v2/posts?search=free+concert&per_page=10&categories_exclude=$EXPIRED&_fields=id,slug,date,link,title,excerpt" \
| jq -r '.[] | "\(.date[0:10]) \(.title.rendered)\n \(.link)"'
```
### Decode HTML entities
WordPress leaves entities in rendered fields (`Bashes — free supplies`).
`jq` has no HTML decoder, so pipe through Python:
```bash
curl -sA "$UA" "$BASE/wp-json/wp/v2/posts?per_page=5&categories_exclude=$EXPIRED&_fields=date,title" \
| python3 -c 'import sys,json,html
for p in json.load(sys.stdin):
print(p["date"][:10], html.unescape(p["title"]["rendered"]))'
```
### Total match count
The count is in a header, not the body:
```bash
curl -sIA "$UA" "$BASE/wp-json/wp/v2/posts?search=free+museum&categories_exclude=$EXPIRED" | grep -i x-wp-total
```
### Filter by category and location
```bash
# Discover ids
curl -sA "$UA" "$BASE/wp-json/wp/v2/categories?per_page=100&orderby=count&order=desc&_fields=id,slug,count" | jq -r '.[] | "\(.id)\t\(.count)\t\(.slug)"'
curl -sA "$UA" "$BASE/wp-json/wp/v2/locations?per_page=100&orderby=count&order=desc&_fields=id,slug,count" | jq -r '.[] | "\(.id)\t\(.count)\t\(.slug)"'
# Kids events (4) in Lake Norman (6264), published this year
curl -sA "$UA" "$BASE/wp-json/wp/v2/posts?categories=4&locations=6264&after=2026-01-01T00:00:00&per_page=20&categories_exclude=$EXPIRED&_fields=date,title,link" \
| jq -r '.[] | "\(.date[0:10]) \(.title.rendered)"'
```
The `jq` one-liners above print titles exactly as WordPress returns them, so
entities show through (`Turtle & Tortoise`, `Birkdale Buds — free`).
Swap in the Python decoder from "Decode HTML entities" before showing titles to
a user.
**Term ids are per-site — always look them up rather than reusing these.** For
Charlotte (2026-07-19) they happened to be: categories `charlotte-kids` 4,
`charlotte-music` 35, `charlotte-food` 5, `festivals` 45, `museums` 13;
locations `center-city` 6276, `lake-norman` 6264, `south-end` 6260. The same
slugs carry completely different ids on Denver or Atlanta, so the discovery
commands above are the reliable path.
`after`/`before` compare against a full timestamp, so widen a bare date:
`after=YYYY-MM-DDT00:00:00`, `before=YYYY-MM-DDT23:59:59`. Without the time on
`before`, that day's own posts are dropped.
### Full text of one article
```bash
curl -skill-card.md
## Description: Find local events and inexpensive activities on On the Cheap city sites using public web pages and WordPress APIs when the onthecheap MCP server is unavailable. This skill is ready for commercial/non-commercial use. ## Publisher: [chrischall](https://clawhub.ai/user/chrischall) ### License/Terms of Use: MIT-0 ## Use Case: People and agents looking for free or inexpensive local events and deals can search On the Cheap city sites without the onthecheap MCP server. ### Deployment Geography for Use: Global ## Known Risks and Mitigations: Risk: Requests may go to an unintended city site. Mitigation: Check the city BASE value before running curl commands. Risk: Expired deals or incomplete or misdated event listings may mislead users. Mitigation: Resolve the site's expired category, confirm day-page dates, and fetch full day pages instead of treating the month grid as complete. ## Reference(s): - [otc-curl on ClawHub](https://clawhub.ai/chrischall/skills/otc-curl) - [On the Cheap extraction recipes](references/recipes.md) - [Charlotte on the Cheap](https://www.charlotteonthecheap.com) ## Skill Output: **Output Type(s):** [Text, Shell commands, Guidance] **Output Format:** [Markdown with bash examples and event or deal summaries] **Output Parameters:** [1D] **Other Properties Related to Output:** [City-specific public listings and article links; availability and prices should be checked at the source.] ## Skill Version(s): 1.1.7 (source: ClawHub release metadata) ## 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/otc-curl",
"sourceUrl": "https://clawhub.ai/chrischall/skills/otc-curl",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-11T00:17:50.983Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-otc-curl/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-otc-curl/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-11T00:17:50.983Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.2K downloads",
"href": "https://clawhub.ai/chrischall/otc-curl",
"sourceUrl": "https://clawhub.ai/chrischall/otc-curl",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-11T00:17:50.983Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "1.1.7",
"href": "https://clawhub.ai/chrischall/otc-curl",
"sourceUrl": "https://clawhub.ai/chrischall/otc-curl",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-10-09T23:28:46.243Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-otc-curl/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-otc-curl/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 1.1.7",
"description": "- Removed the sample file: skill-card.md. - No user-facing or functional changes; documentation and skill usage remain unchanged.",
"href": "https://clawhub.ai/chrischall/otc-curl",
"sourceUrl": "https://clawhub.ai/chrischall/otc-curl",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-10-09T23:28:46.243Z",
"isPublic": true
}
]
}Record generated Oct 11, 2026.
