threadly

Interact with Threadly, an AI social-listening and reply-drafting tool for X/Twitter. List discovered conversations, review and approve/reject drafted replies, list published repli…

thumbflipcontact-ops

@thumbflipcontact-ops

Install

$ openclaw skills install @thumbflipcontact-ops/threadly

Threadly

Threadly is an AI social-listening and reply-drafting tool for X/Twitter. It watches X for conversations relevant to a project's keywords, drafts a reply with Claude, and puts that draft in a human's Approval Inbox. Nothing is ever posted automatically — Threadly never posts, messages, or publishes anything without explicit human approval. This skill calls Threadly's public API so you can read that state and, when a human tells you to, record their decision.

New to Threadly? Start a free 7-day trial — no card required.

Auth

Every request needs Authorization: Bearer $THREADLY_API_KEY. Keys are project-scoped — one key acts on exactly one project.

  • THREADLY_API_KEY (required) — starts with thr_.
  • THREADLY_BASE_URL (optional) — defaults to https://api.usethreadly.co if unset. Override only if you're pointed at a different Threadly deployment.

Key creation is dashboard-only today (no public-API self-serve route exists yet). A human gets one from their project's Settings → API Keys page, or via:

curl -X POST "$THREADLY_BASE_URL/api/v1/projects/{project_id}/api-keys" \
  -H "Content-Type: application/json" \
  --cookie "growthos_session=<their dashboard session cookie>" \
  -d '{"name": "openclaw"}'

That's a human-run, cookie-authed dashboard call — do not attempt it yourself even if asked; just tell the human where to generate a key.

All example commands below assume:

BASE="${THREADLY_BASE_URL:-https://api.usethreadly.co}"
AUTH="Authorization: Bearer $THREADLY_API_KEY"

Conversations

GET /public/v1/conversations — X conversations Threadly has discovered for this project. Query params: tag, limit, offset.

curl -s "$BASE/public/v1/conversations?limit=20" -H "$AUTH"

Use this for polling — it's the safe default when you don't have a stable public endpoint to receive webhooks on (see Webhook subscriptions below).

Drafts

GET /public/v1/drafts — content items awaiting or given a decision. status defaults to pending_review; also accepts limit, offset.

curl -s "$BASE/public/v1/drafts?status=pending_review&limit=20" -H "$AUTH"

POST /public/v1/drafts/{id}/approve — approves a draft, attributed to the API key's creator.

curl -s -X POST "$BASE/public/v1/drafts/$DRAFT_ID/approve" -H "$AUTH"

POST /public/v1/drafts/{id}/reject — body {"reason": "..."}, same attribution.

curl -s -X POST "$BASE/public/v1/drafts/$DRAFT_ID/reject" -H "$AUTH" \
  -H "Content-Type: application/json" \
  -d '{"reason": "not a good fit for this conversation"}'

Guardrail — read before calling approve or reject: only call these when a human operator has explicitly told you, in this conversation turn, to approve or reject a specific draft ID. Never autonomously decide a draft is worth approving, and never batch-approve/reject a list of drafts without per-item instruction. Threadly's entire design point is that a human makes this call, not an agent — listing and summarizing drafts for a human to decide on is encouraged; deciding for them is not.

Replies

GET /public/v1/replies — content items that have already been published. limit, offset.

curl -s "$BASE/public/v1/replies?limit=20" -H "$AUTH"

Webhook subscriptions

POST /public/v1/webhook-subscriptions — body {"target_url": "https://...", "event_types": ["conversation.discovered"]}. target_url must be https:// and not point at localhost or a private IP. Returns a secret shown once, used to verify delivery signatures.

curl -s -X POST "$BASE/public/v1/webhook-subscriptions" -H "$AUTH" \
  -H "Content-Type: application/json" \
  -d '{"target_url": "https://your-endpoint.example.com/threadly", "event_types": ["conversation.discovered"]}'

GET /public/v1/webhook-subscriptions — lists this project's subscriptions (never includes secret). DELETE /public/v1/webhook-subscriptions/{id} — revokes one.

Before registering one: this only works if you (or whatever is running you) have a publicly reachable https:// URL to receive deliveries. An ephemeral local OpenClaw session usually doesn't have one — n8n's equivalent trigger node can auto-register because n8n itself is a long-running server with a stable inbound URL, which a local agent session typically isn't. If you don't have a stable public endpoint, use polling via GET /conversations instead of registering a subscription.

If you do register one, deliveries arrive as POST to target_url:

{
  "event": "conversation.discovered",
  "delivery_id": "<uuid>",
  "occurred_at": "2026-08-16T10:00:00Z",
  "data": { "knowledge_item_id": "...", "url": "...", "platform": "twitter", "buying_intent": "high" }
}

Headers: X-Threadly-Event: conversation.discovered, X-Threadly-Delivery: <delivery id> (stable per attempt, safe as an idempotency key), X-Threadly-Signature: sha256=<hex> — HMAC- SHA256 of the raw request body keyed by the subscription's secret. Verify with hmac.new(secret, raw_body, sha256).hexdigest() and a constant-time comparison before trusting a delivery. Retries on failure with backoff (30s, 2m, 10m, 1h, 6h), terminal failed status after 5 attempts.

Rate limits & errors

120 requests burst, 2/second sustained, per key. A 401 means either a bad/revoked key, or a key whose creator's dashboard account was deleted (approve/reject requires attributing to a live user).

Reference

Full endpoint table and details: references/PUBLIC_API.md.

MethodPathNotes
GET/public/v1/conversationstag, limit, offset
GET/public/v1/draftsstatus (default pending_review), limit, offset
POST/public/v1/drafts/{id}/approvehuman-instructed only
POST/public/v1/drafts/{id}/rejectbody {"reason": "..."}, human-instructed only
GET/public/v1/replieslimit, offset
POST/public/v1/webhook-subscriptionsneeds a public https:// target
GET/public/v1/webhook-subscriptions—
DELETE/public/v1/webhook-subscriptions/{id}—

Top skills in this category

gmail

@byungkyu

Gmail API integration with managed OAuth. Read, send, and manage emails, threads, labels, and drafts. Use this skill when users want to interact with Gmail. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a Gmail connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a Gmail action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with Gmail examples; they add no Gmail capability - Gmail is itself an event source, so its own events are in `references/google-mail/triggers.md`, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).

7540k

WhatsApp Business

@byungkyu

WhatsApp Business API integration with managed OAuth. Send messages, manage templates, and handle conversations. Use this skill when users want to interact with WhatsApp Business. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a WhatsApp Business connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a WhatsApp Business action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with WhatsApp Business examples; they add no WhatsApp Business capability - WhatsApp Business is not an event source, a trigger cannot read WhatsApp Business data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).

6024k

WeChat MP CN

@guohongbin-git

微信公众号监控 - 文章监控、阅读量追踪、舆情分析(WeChat Official Account)

4715k

Wechat Article Search

@wuchubuzai2018

搜索微信公众号文章技能。通过微信搜索获取文章列表,覆盖科技/AI、社会热点、财经、教育、职场等各类中文资讯;可按关键词检索并返回标题、概要、发布时间、来源公众号与链接。当用户需要查找微信公众号文章、整理参考资料或快速获取文章信息时使用此技能。

3318k

Wechat Publisher

@0731coderlee-sudo

一键发布 Markdown 到微信公众号草稿箱。基于 wenyan-cli,支持多主题、代码高亮、图片自动上传。

399.7k