Installs into .claude/skills of the current project.
Are you the author of Clawpost?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/dvcrn-clawpost)
---
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 |