Install
openclaw skills install @postlake/postlake-publishPublish a social media post right now to one or more connected accounts (X, LinkedIn, Instagram, TikTok, Facebook, Threads, Bluesky, YouTube, Pinterest) through PostLake. Use when the user wants to post immediately.
openclaw skills install @postlake/postlake-publishPublishes one caption to as many connected accounts as you like, in one call.
Each platform is attempted independently and the response reports per-platform
state and url.
Authorization: Bearer $POSTLAKE_API_KEY
Base URL https://api.postlake.dev.
Two ways to say which accounts a post goes to: pick whichever is simpler:
"profile": "my-brand" and it posts to every
account in it. Add "platforms": ["bluesky","linkedin"] to narrow it to
certain networks. No id lookup needed."accounts": ["acc_…"] for exact accounts.
Get the ids from the postlake-accounts skill (GET /v1/social-accounts).Provide profile, accounts, or both. At least one is required.
# Simplest: post to a whole profile.
curl -X POST https://api.postlake.dev/v1/posts \
-H "Authorization: Bearer $POSTLAKE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"text": "Shipping something new today 🚀",
"profile": "my-brand"
}'
To hit specific networks in that profile add "platforms": ["bluesky"]; to
target exact accounts use "accounts": ["acc_84a4…","acc_e553…"] instead.
Response (normalised: reason over targets):
{
"id": "post_…",
"state": "published",
"targets": [
{ "platform": "bluesky", "state": "published", "url": "https://bsky.app/profile/…/post/…" },
{ "platform": "linkedin", "state": "published", "url": "https://www.linkedin.com/feed/update/…" }
]
}
state per target is one of published, processing (async platforms like
TikTok/YouTube: poll GET /v1/posts/{id} until final), failed (see
target.error), or scheduled.
postlake-media skill, then pass the
ids: "media": ["med_…"] (with optional "mediaAlt": ["alt text"])."textOverrides": { "x": "shorter for X", "linkedin": "…" }."platformOptions": { "pinterest": { "boardId": "…" }, "youtube": { "title": "…", "privacyStatus": "private" } }.Idempotency-Key header so a retry replays
the same result instead of double-posting.error.type: "entitlement_exceeded": other platforms still go
out. Don't treat that as a total failure.invalid_input.failed target never sinks the others; report which went out and which didn't.