Skills clawpost

AI-powered social media publishing for LinkedIn and X (Twitter) with algorithm optimization and scheduling.

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/acidias/clawpost-2" ~/.claude/skills/openclaw-skills-clawpost && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/acidias/clawpost-2" ~/.openclaw/skills/openclaw-skills-clawpost && rm -rf "$T"
manifest: skills/acidias/clawpost-2/SKILL.md
source content

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 — 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:
    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:

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:

{
  "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.

curl -s {{CLAW_API_URL}}/api/claw/v1/status \
  -H "Authorization: Bearer {{CLAW_API_KEY}}"

List Connected Platforms

curl -s {{CLAW_API_URL}}/api/claw/v1/platforms \
  -H "Authorization: Bearer {{CLAW_API_KEY}}"

Check Credits

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
).

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
    )
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

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:

{
  "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

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

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

curl -s -X DELETE {{CLAW_API_URL}}/api/claw/v1/posts/POST_ID \
  -H "Authorization: Bearer {{CLAW_API_KEY}}"

Publish a Draft

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)

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

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)

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
.

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.

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

CodeMeaning
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