agentCLAWHUBUnverified

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

OpenClaw

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
  1. 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.
  2. 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 (`&#8217;`, `&#8212;`). 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 &#8212; 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 &amp; Tortoise`, `Birkdale Buds &#8212; 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.
Github ReposUpdated 1d agoRank 70

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!

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

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

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW

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.

Sponsored

Ads related to otc-curl and adjacent AI workflows.