PostStash Skill
Schedule posts and threads to Threads and X directly from your OpenClaw agent.
Setup
- Get an API key from the PostStash dashboard
- Set the environment variable:
POSTSTASH_API_KEY=ps_live_...
- Install:
clawhub install poststash
API key format: ps_live_ followed by 64 hex characters.
Tools
poststash.schedule_to_threads
Schedule a single post to Threads.
Input:
text (string, required) — Post content (max 500 characters)
scheduled_at (string, optional) — ISO 8601 timestamp; defaults to now
status (string, optional) — "Ready" (publishes at scheduled_at) or "Draft" (saves without scheduling); defaults to "Ready"
Output:
post_id — UUID of the scheduled post
content — Post text
schedule — Scheduled timestamp (ISO 8601)
status — Post status (Ready, Draft, Published, Failed)
platforms — Array of target platforms
poststash.schedule_to_x
Schedule a single post to X (Twitter).
Input: Same as schedule_to_threads.
Output: Same as schedule_to_threads.
poststash.schedule_thread
Schedule a thread (2–20 posts) to Threads or X.
Input:
platform (string, required) — "threads" or "x"
posts (array, required) — Array of { text: string } objects (2–20 items)
scheduled_at (string, optional) — ISO 8601 timestamp; defaults to now
status (string, optional) — "Ready" or "Draft"; defaults to "Ready"
Output:
thread_id — UUID grouping all thread posts
posts — Array of scheduled post objects with id, content, thread_position
poststash.get_post
Fetch a scheduled or published post along with its analytics.
Input:
post_id (string, required) — Post UUID from a schedule response
Output:
post — Full post object (id, content, platforms, schedule, status, published, sent_at)
analytics — Array of per-platform analytics with metrics (views, likes, replies, reposts, quotes)
poststash.list_posts
List posts for your account (scoped to the context of your API key).
Input:
status (string, optional) — Filter by "Draft", "Ready", "Published", or "Failed"
published (boolean, optional) — true or false
limit (number, optional) — Results per page (default: 20, max: 100)
offset (number, optional) — Pagination offset (default: 0)
Output:
posts — Array of post objects
total — Total number of matching posts
limit / offset — Pagination info
Example Agent Usage
const result = await agent.invoke({
tools: ["poststash.schedule_to_threads"],
input: "Schedule a post about AI to Threads tomorrow at 2pm",
});
const thread = await agent.invoke({
tools: ["poststash.schedule_thread"],
input: "Create a 3-part thread on building in public on X, schedule for Friday 10am",
});
1---2name: poststash3description: Schedule posts and threads to Threads and X via PostStash4---56# PostStash Skill78Schedule posts and threads to Threads and X directly from your OpenClaw agent.910## Setup11121. Get an API key from the [PostStash dashboard](https://poststash.com/dashboard/api-keys)132. Set the environment variable:14 ```bash15 POSTSTASH_API_KEY=ps_live_...16 ```173. Install: `clawhub install poststash`1819API key format: `ps_live_` followed by 64 hex characters.2021---2223## Tools2425### `poststash.schedule_to_threads`2627Schedule a single post to Threads.2829**Input:**30- `text` (string, required) — Post content (max 500 characters)31- `scheduled_at` (string, optional) — ISO 8601 timestamp; defaults to now32- `status` (string, optional) — `"Ready"` (publishes at scheduled_at) or `"Draft"` (saves without scheduling); defaults to `"Ready"`3334**Output:**35- `post_id` — UUID of the scheduled post36- `content` — Post text37- `schedule` — Scheduled timestamp (ISO 8601)38- `status` — Post status (`Ready`, `Draft`, `Published`, `Failed`)39- `platforms` — Array of target platforms4041---4243### `poststash.schedule_to_x`4445Schedule a single post to X (Twitter).4647**Input:** Same as `schedule_to_threads`.4849**Output:** Same as `schedule_to_threads`.5051---5253### `poststash.schedule_thread`5455Schedule a thread (2–20 posts) to Threads or X.5657**Input:**58- `platform` (string, required) — `"threads"` or `"x"`59- `posts` (array, required) — Array of `{ text: string }` objects (2–20 items)60- `scheduled_at` (string, optional) — ISO 8601 timestamp; defaults to now61- `status` (string, optional) — `"Ready"` or `"Draft"`; defaults to `"Ready"`6263**Output:**64- `thread_id` — UUID grouping all thread posts65- `posts` — Array of scheduled post objects with `id`, `content`, `thread_position`6667---6869### `poststash.get_post`7071Fetch a scheduled or published post along with its analytics.7273**Input:**74- `post_id` (string, required) — Post UUID from a schedule response7576**Output:**77- `post` — Full post object (`id`, `content`, `platforms`, `schedule`, `status`, `published`, `sent_at`)78- `analytics` — Array of per-platform analytics with `metrics` (views, likes, replies, reposts, quotes)7980---8182### `poststash.list_posts`8384List posts for your account (scoped to the context of your API key).8586**Input:**87- `status` (string, optional) — Filter by `"Draft"`, `"Ready"`, `"Published"`, or `"Failed"`88- `published` (boolean, optional) — `true` or `false`89- `limit` (number, optional) — Results per page (default: 20, max: 100)90- `offset` (number, optional) — Pagination offset (default: 0)9192**Output:**93- `posts` — Array of post objects94- `total` — Total number of matching posts95- `limit` / `offset` — Pagination info9697---9899## Example Agent Usage100101```typescript102const result = await agent.invoke({103 tools: ["poststash.schedule_to_threads"],104 input: "Schedule a post about AI to Threads tomorrow at 2pm",105});106107const thread = await agent.invoke({108 tools: ["poststash.schedule_thread"],109 input: "Create a 3-part thread on building in public on X, schedule for Friday 10am",110});111```