Agent recipes
Copyable end-to-end sequences — draft, preflight, fix, and schedule a cross-platform post, then pull analytics — using real Inklate tools and endpoints.
Two flows an agent can follow literally. Each is shown as an ordered sequence of MCP tool calls, with the equivalent REST path beside it. Names and arguments are exactly those the API exposes — do not invent others.
Recipe A — draft → preflight → fix → schedule a cross-platform post
The goal: one Story published natively to a LinkedIn page and an X account, validated before it ships, scheduled for a future instant.
1. Find the channels
Call list_channels (REST: GET /channels) to get channel ids and connection health. Optionally call get_capabilities (GET /capabilities) to confirm each target can publish right now and to read its text limits.
2. Create the draft
Call create_post (REST: POST /posts) with the Story content and the target channels. One Story fans out into a rendition per channel automatically.
{
"content": "We just closed our Series A — here's what's next.",
"placements": [
{ "channel_id": "chn_linkedin_page", "format": "post" },
{ "channel_id": "chn_x_account", "format": "thread" }
],
"idempotency_key": "series-a-announce-1"
}The response returns the new post’s id. The draft appears in the dashboard drafts sidebar immediately.
3. Preflight
Call preflight_post (REST: POST /posts/preflight) to fit-check every placement with no persistence. The response gives a per-placement verdict — reachability, then scopes, then content — plus adapt warnings and lengths. If every placement is publishable, skip to step 5.
4. Fix what fails
When a placement is refused for a fixable reason, its verdict carries refusal.fixes with machine-readable repairs. Apply one with apply_fix (REST: POST /posts/{id}/apply-fix), targeting a single placement:
trim_to_fold— trim over-length text to the fold.rebalance_thread— rebalance a thread with too many or too-long items.crop_to— crop an image to an accepted aspect ratio.
apply_fix returns the refreshed verdict and marks that rendition Edited. Re-run preflight_post until every placement is green.
apply_fix edits one placement’s rendition. If you later want to push the Story back over an
edited rendition, use sync_variants and check wasEdited on the response before overwriting.
5. Schedule
Call schedule_post (REST: POST /posts/{id}/schedule) with a future instant as ISO-8601 with an offset. The pipeline publishes automatically — no one needs to be online.
{ "at": "2026-07-21T09:00:00-07:00" }For staggered per-placement times, use schedule_placements (REST: POST /posts/{id}/schedule-placements) instead, which takes a default fire time, per-placement overrides, and an optional cascade that spaces placements N minutes apart.
6. Confirm it shipped
After the scheduled instant, poll get_job_status (REST: GET /posts/{id}/status) for the per-target journey: overall status plus each target’s status, external id, published URL, and last error. To publish immediately instead of scheduling, call publish_post (REST: POST /posts/{id}/publish) with an idempotency_key so retries replay safely.
Recipe B — pull analytics for recent posts
The goal: gather engagement for the posts you published lately.
1. List recent published posts
Call list_posts (REST: GET /posts) filtered to status = published and, optionally, a scheduled-time range. This returns posts with their per-channel targets and ids.
2. Pull per-post metrics
For each post id, call get_post_metrics (REST: GET /posts/{id}/metrics). You get per-channel totals — impressions, reactions, comments, shares, clicks — plus the full snapshot time series for that post.
3. Or roll up by channel
To see a channel’s aggregate performance rather than one post’s, call get_channel_metrics (REST: GET /channels/{id}/metrics) for per-day engagement across that channel’s published posts, optionally restricted to a time range.
Metrics are synced from each platform in the background, not on every read. A freshly published post may show zero until the first sync lands. See Analytics syncing for how and when snapshots refresh.
Notes for agents
- Timestamps always carry an offset. Send
2026-07-21T09:00:00-07:00or aZinstant. Naive local times are rejected with a corrective error. - Idempotency. Pass an
idempotency_key(MCP) orIdempotency-Keyheader (REST) oncreate_postandpublish_postso a retried call replays instead of duplicating. - Durable, multi-step flows. For a packaged version of Recipe A,
list_skillsmay expose across_platform_publishskill; read its JSON-Schema input, thenrun_skilland pollget_skill_run.
API keys
Create an Organization API key in the dashboard under Settings → API, copy it once, and send it as a bearer token to MCP or REST.
Billing and seat-based pricing
Inklate has one plan, priced per seat — $12/seat/mo billed monthly, or $10/seat/mo ($120/seat/yr) billed annually — with a 14-day free trial.