--- name: clawpost description: "AI-powered social media publishing for LinkedIn and X (Twitter) with algorithm optimization and scheduling." --- # Social Media Publisher Skill ClawPost helps you create, manage, and publish content to LinkedIn and X (Twitter) — with AI-assisted writing, drafts, scheduling, and direct publishing via API. ## Getting Started If the user doesn't have an account or API key yet, walk them through these steps: 1. **Sign up** at [clawpost.dev](https://clawpost.dev) — sign in with LinkedIn. 2. **Connect platforms** — In the Dashboard, connect LinkedIn and/or X (Twitter) accounts. 3. **Add credits** — Go to Dashboard → Billing and top up credits (minimum $5). Credits are used for AI generation features. 4. **Generate an API key** — Go to Dashboard → Settings → API Keys → Generate New Key. The key starts with `claw_`. 5. **Set the environment variable**: ```bash export CLAW_API_KEY="claw_your_key_here" ``` ## Setup Required environment variable: - `CLAW_API_KEY` — your API key (starts with `claw_`). Generate one following the steps above. Optional: - `CLAW_API_URL` — defaults to `https://clawpost.dev`. Only set this if using a self-hosted instance. All endpoints are under `{{CLAW_API_URL}}/api/claw/v1/` (default: `https://clawpost.dev/api/claw/v1/`). ## Authentication Every request needs the header: ``` Authorization: Bearer {{CLAW_API_KEY}} ``` ## Important: Passing JSON in shell commands When sending JSON data with curl, **always use a heredoc** to avoid shell escaping issues with quotes and special characters: ```bash curl -s -X POST URL \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"key": "value"} EOF ``` All examples below use this pattern. Do **not** use `-d '{...}'` with single quotes — it breaks when content contains quotes, newlines, or special characters. ## Response Format All responses follow this shape: ```json { "success": true, "message": "Human-readable summary", "data": { ... }, "error": { "code": "ERROR_CODE", "details": "..." } } ``` Always read the `message` field — it's designed to be relayed directly to the user. ## Endpoints ### Check Status Verify your API key works and see what's connected. ```bash curl -s {{CLAW_API_URL}}/api/claw/v1/status \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` ### List Connected Platforms ```bash curl -s {{CLAW_API_URL}}/api/claw/v1/platforms \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` ### Check Credits ```bash curl -s {{CLAW_API_URL}}/api/claw/v1/credits \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` ### List Posts Filter by status (`draft`, `published`, `scheduled`, `failed`) and platform (`linkedin`, `twitter`). ```bash curl -s "{{CLAW_API_URL}}/api/claw/v1/posts?status=draft&platform=linkedin&limit=10" \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` ### X Post History Retrieve your X (Twitter) post history from the cached profile data. This is a read-only endpoint - no credits are used. Query parameters: - `type` - `posts`, `replies`, or `all` (default: `all`) - `limit` - max results, 1-100 (default: `20`) - `period` - `7d`, `30d`, `90d`, or `all` (default: `all`) ```bash curl -s "{{CLAW_API_URL}}/api/claw/v1/history/x?type=posts&period=30d&limit=10" \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` The response includes a `summary` object with aggregated metrics (`totalPosts`, `totalReplies`, `totalLikes`, `totalRetweets`, `totalRepliesReceived`, `totalImpressions`, `topPost`) and a `posts` array with individual tweet details, metrics, media, and reply context. ### Get Single Post ```bash curl -s {{CLAW_API_URL}}/api/claw/v1/posts/POST_ID \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` Each post includes an `availableActions` array (e.g., `["publish", "schedule", "update", "delete"]`). #### Post Object Fields Every post includes a `postType` field: - `"original"` — a regular post composed by the user - `"quote"` — a quote tweet of another post (X only) - `"reply"` — a reply to another post (X only) - `"remix"` — an original tweet inspired by another post (X only) When `postType` is `"quote"`, `"reply"`, or `"remix"`, the post also includes a `reference` object with the original tweet's context: ```json { "postType": "quote", "content": "User's commentary text", "reference": { "tweetId": "1234567890", "text": "The original tweet text that was quoted", "author": "originalAuthor" } } ``` This lets you see exactly what was quoted/replied to alongside the user's own text. ### Create a Draft ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/drafts \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"content": "Your post text here", "platform": "linkedin"} EOF ``` Platform: `"linkedin"` or `"twitter"`. Twitter content must be ≤ 280 characters. ### Update a Draft ```bash curl -s -X PUT {{CLAW_API_URL}}/api/claw/v1/posts/POST_ID \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"content": "Updated post text"} EOF ``` ### Delete a Draft ```bash curl -s -X DELETE {{CLAW_API_URL}}/api/claw/v1/posts/POST_ID \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` ### Publish a Draft ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/posts/POST_ID/publish \ -H "Authorization: Bearer {{CLAW_API_KEY}}" ``` ### Direct Publish (No Draft Step) ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/publish \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"content": "Publishing this directly!", "platform": "linkedin"} EOF ``` ### Schedule a Draft ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/posts/POST_ID/schedule \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"scheduledAt": "2026-06-15T10:00:00Z"} EOF ``` ### Direct Schedule (No Draft Step) ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/schedule \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"content": "Scheduled post!", "platform": "linkedin", "scheduledAt": "2026-06-15T10:00:00Z"} EOF ``` ### AI Generate Post Let AI write a post based on your prompt. Optional: `tone` and `platform`. ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/ai/generate \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"prompt": "Write about the importance of code reviews", "platform": "linkedin"} EOF ``` ### AI Refine Post Improve existing content with instructions. ```bash curl -s -X POST {{CLAW_API_URL}}/api/claw/v1/ai/refine \ -H "Authorization: Bearer {{CLAW_API_KEY}}" \ -H "Content-Type: application/json" \ -d @- <<'EOF' {"content": "Original post text...", "instructions": "Make it shorter and punchier", "platform": "linkedin"} EOF ``` ## Workflow Tips 1. **Quick publish**: Use `/publish` to post immediately without creating a draft. 2. **Review flow**: Create a draft with `/drafts`, refine with `/ai/refine`, then publish with `/posts/ID/publish`. 3. **Cross-post**: Make separate calls for LinkedIn and Twitter — each is a separate post. 4. **Check before publishing**: Call `/platforms` to verify the target platform is connected. 5. **Twitter limit**: Tweets must be ≤ 280 characters. The API will reject longer content with a clear message. ## Error Codes | Code | Meaning | |------|---------| | `UNAUTHORIZED` | Invalid or revoked API key | | `NOT_FOUND` | Post or resource doesn't exist | | `VALIDATION_ERROR` | Bad input (missing content, too long, invalid date) | | `CONFLICT` | Can't perform action (e.g., already published) | | `PLATFORM_NOT_CONNECTED` | Target social platform isn't linked | | `INSUFFICIENT_CREDITS` | Not enough credits for AI operations | | `NO_AI_KEY` | No AI API key configured | | `RATE_LIMITED` | Too many requests (60/min general, 10/min publish) | | `INTERNAL_ERROR` | Something went wrong server-side |