Install
openclaw skills install @aleksandrsamokhin/postquest-apiDraft, validate, and schedule social media posts on ten networks (Instagram, Facebook, LinkedIn, X, Threads, TikTok, Pinterest, YouTube, Bluesky, Mastodon) with the PostQuest REST API and curl. Use when the user wants an agent or script to create or schedule social posts, review a posting calendar, or read post analytics.
openclaw skills install @aleksandrsamokhin/postquest-apiPostQuest is a social media scheduler. This skill calls its REST API at https://api.post-quest.com/v1 with curl. The full OpenAPI spec is at https://api.post-quest.com/openapi.yaml.
POSTQUEST_API_KEY must hold a pq_live_ key. The user creates one in PostQuest under Settings → Connections (https://post-quest.com/settings/connections). Keys expire after 90 days.402 with billing_access_required means the workspace is on a trial or has no active plan; tell the user instead of retrying.Authorization header. Never put it in a URL, a file, or your reply.PQ="https://api.post-quest.com/v1"
AUTH="Authorization: Bearer $POSTQUEST_API_KEY"
curl -sS "$PQ/social-accounts" -H "$AUTH" -H "Accept: application/json"
POST /posts creates a draft unless is_draft is false.Z or an explicit offset, for example 2026-11-03T09:00:00-05:00. Ask for the timezone if the user didn't give one.Idempotency-Key (a UUID) on POST /posts, /posts/{id}/schedule, /posts/{id}/publish, and /media. Reuse the same key only to retry the same request. A 409 means the key was reused with a different body.429, wait for Retry-After seconds.Accounts. GET /social-accounts returns account IDs and their platforms. Never guess IDs.
Rules. GET /platform-requirements?platform=linkedin (or ?social_account_id=...) returns caption limits, media rules, and options.
Media (optional).
# From a public HTTPS URL
curl -sS -X POST "$PQ/media" -H "$AUTH" -H "Accept: application/json" \
-H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
-d '{"url": "https://example.com/launch.png"}'
# From a local file
curl -sS -X POST "$PQ/media" -H "$AUTH" -H "Accept: application/json" \
-H "Idempotency-Key: $(uuidgen)" -F "file=@launch.png"
Draft. Per-network captions go in platform_captions, keyed by platform ("x") or by platform:<account id>.
curl -sS -X POST "$PQ/posts" -H "$AUTH" -H "Accept: application/json" \
-H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
-d '{
"caption": "We shipped dark mode.",
"social_account_ids": ["<linkedin-id>", "<x-id>"],
"platform_captions": {"x": "Dark mode is live."},
"media_ids": ["<media-id>"]
}'
Validate. POST /posts/validate with the same body checks it without saving. Fix every issue, and explain any that need the user's input.
Confirm, then schedule.
curl -sS -X POST "$PQ/posts/<post-id>/schedule" -H "$AUTH" -H "Accept: application/json" \
-H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
-d '{"scheduled_at": "2026-11-03T09:00:00-05:00"}'
POST /posts/{id}/publish publishes now. It needs a key with the publish:now ability and the workspace's agent publishing setting turned on.
Check status. GET /posts/{id} until every target is published or failed, then report the result.
| Task | Request |
|---|---|
| List posts | GET /posts?status=scheduled&from=2026-11-01&to=2026-11-30 |
| Edit a post | PATCH /posts/{id} |
| Delete a post (confirm first) | DELETE /posts/{id} |
| Media library | GET /media, DELETE /media/{id} |
| Analytics summary | GET /analytics/summary?range=30d |
| Per-post analytics | GET /analytics, GET /analytics/{id}, GET /analytics/{id}/daily |
| Refresh analytics | POST /analytics/sync (only when the user asks; 15-minute cooldown) |
Post statuses: idea, draft, needs_improvement, ready, scheduled, publishing, published, failed, skipped, archived.
Errors return {"code": "...", "message": "..."}. Validation errors add errors and issues.