REST API + MCP server across 10+ platforms. One API key unlocks posts, profiles, analytics, and webhooks — and lets Claude Code, Cursor, or any MCP client drive LetsPost from your editor.
Free tier · No card required · Upgrade when you need more
How it works
Sign up free — no card required. Generate a key in Settings → API Keys in under 60 seconds.
Get API keyHit the REST API with curl, fetch, or requests. Bearer token auth — one header, done.
Create posts, schedule content, pull analytics — all from your automation. Same pipeline as the dashboard.
Code examples
No SDK needed — just curl, fetch, or requests. Bearer token, one header.
# Schedule a post — single image, three platforms, future time.
# Idempotency-Key is optional but recommended: a duplicate retry
# inside 24h returns the original post instead of creating a second.
curl https://api.letspost.it/v1/posts \
-H "Authorization: Bearer lp_live_xxx" \
-H "Idempotency-Key: launch-2026-05-01" \
-H "Content-Type: application/json" \
-d '{
"profileId": "prof_abc123",
"content": "New drop 🔥 #launch",
"mediaUrl": "https://cdn.example.com/drop.jpg",
"platforms": ["tiktok", "instagram", "youtube"],
"scheduledFor": "2026-05-01T10:00:00Z"
}'API reference
All endpoints use bearer auth. Base URL: .../v1
| GET | /posts | List posts — filter by profile, status, platform |
| POST | /posts | Create a post — publish now or schedule |
| GET | /posts/:id | Get a single post with status + platform results |
| PATCH | /posts/:id | Update caption, platforms, or scheduled time |
| DELETE | /posts/:id | Cancel or delete a post |
| GET | /posts/:id/metrics | Engagement metrics for a published post |
| GET | /profiles | List all workspace profiles |
| POST | /profiles | Create a profile (brand / client) |
| GET | /profiles/:id | Get profile with linked accounts |
| PATCH | /profiles/:id | Update profile name or image |
| DELETE | /profiles/:id | Delete a profile |
| GET | /platform/connections | List connected social accounts |
| GET | /platform/connect/:platform | Start OAuth flow for a platform |
| DELETE | /platform/connections/:id | Disconnect a social account |
| GET | /analytics/account-metrics | Follower count, reach, impressions per account |
| GET | /analytics/post-metrics | Per-post engagement metrics, paginated |
| GET | /api-keys | List API keys for the current user |
| POST | /api-keys | Create a new API key with a label |
| DELETE | /api-keys/:id | Revoke an API key |
| GET | /webhooks | List webhooks for the current user |
| POST | /webhooks | Register a webhook URL + event list |
| DELETE | /webhooks/:id | Delete a webhook |
| GET | /auth/me | Current user profile + plan tier |
| GET | /auth/usage | Monthly post count, limits, trial status |
| GET | /billing/status | Subscription status, cancel-at date, trial end |
| GET | /billing/plans | Available plans with pricing |
| GET | /status/components | Component health (dashboard, API, publishing…) |
| GET | /status/incidents/active | Active incidents affecting the platform |
letspost.it ships a remote MCP server at mcp.letspost.it/v1/mcp (streamable HTTP, JSON-RPC 2.0). One API key with mcp:read + mcp:write + mcp:publish scopes lets Claude Code, Claude Desktop, Cursor, or any MCP client drive LetsPost from inside your editor — no local binary, no daemon, no port forwarding. Same encrypted token storage, ownership checks, and rate-limited publish pipeline as the REST API.
mcp.letspost.it is dedicated to MCP traffic — a separate host from the REST API with its own rate-limit lane. Clients point at https://mcp.letspost.it/v1/mcp with a Bearer key and that's it.
Reuse the lp_live_ key you already issued for the REST API. Scopes (mcp:read, mcp:write, mcp:publish) let you grant read-only or preview-only access to an agent without handing it the publish button.
An MCP commit goes through the same validation, idempotency, rate limit, and platform fan-out as a /v1/posts call. What works in the dashboard works from Claude Code — no second pipeline to debug.
Tool surface
The full assistant surface — read drafts and analytics, compose and schedule, then publish — split across three opt-in scopes so your agent gets only what it needs.
| mcp:read16 tools | ||
check_schedule_conflict | Detect schedule clashes within a time window on overlapping platforms before you schedule. | |
find_post | Look up the caller's own posts (by id, recent, or caption); returns minimal summaries. | |
get_brand_kit | Read the brand kit: colors, logo, fonts, and voice notes. | |
get_connection_health | List connected accounts with health status and a reconnect URL for any broken one. | |
get_period_summary | Activity digest for a period: published / partial / failed counts, per-platform breakdown, top post. | |
get_post_details | Full details for one post: caption, status, schedule/publish times, and per-platform results + URLs. | |
get_top_post | Top-performing post in a period, ranked by impressions, views, or likes. | |
get_user_status | Account snapshot: email, connected platforms, drafts, and what's scheduled today. | |
list_drafts | List saved drafts, newest first. | |
list_jobs | List scheduled digest jobs (name, cron, delivery channels, next run). | |
list_post_versions | List a post's edit-history snapshots. | |
list_recent_posts | List recent posts in a terminal state — published, partial, or failed. | |
list_repost_sequences | List recent repost sequences. | |
list_reviewers | List the approval roster (name, email, WhatsApp). | |
list_upcoming_scheduled | List scheduled posts in a forward window (default next 7 days). | |
suggest_best_time | Suggest best-time posting windows per platform from industry data. | |
| mcp:write33 tools | ||
add_media_to_draft | Append an already-ingested media item to a draft (first sets the cover, rest form a carousel). | |
add_platforms_to_post | Add platforms to an existing post and re-enqueue publish for just the new ones. | |
add_reviewer | Add a reviewer to the approval roster (name + email, optional WhatsApp). | |
bulk_reschedule | Bulk-shift scheduled posts by a delta or to a fixed time; dry-run supported. | |
cancel_draft | Discard the active workspace draft (caption, platforms, media). | |
cancel_repost_sequence | Cancel a repost sequence; pending children drop, published ones stay. | |
create_post | Create a post (draft by default); returns the post id to drive the publish/schedule lifecycle. | |
crop_and_recompose | Re-crop media to 1:1 to recover from an Instagram aspect-ratio failure. | |
delete_job | Delete a scheduled digest job (irreversible). | |
fix_grammar | Fix grammar, spelling, and punctuation in a caption — preserves voice, emoji, and hashtags. | |
generate_publish_preview | Render per-platform mockups of a draft and deliver them as images. | |
open_support_ticket | Open a support ticket after a publish exhausts its retries. | |
pause_job | Pause a scheduled digest job until resumed. | |
permanent_delete | Hard-delete a post, skipping the undo window. | |
presign_media_upload | Issue a 15-min signed upload URL; returns a storage path to attach to a post. | |
preview_post_summary | Show a text preview (media + caption + platforms + timing); required before publish. | |
remove_reviewer | Remove a reviewer from the roster (soft-delete). | |
request_review | Send a draft to a reviewer with a 72h magic link; sets approval to pending. | |
resume_job | Resume a paused scheduled digest job. | |
schedule_job | Schedule a recurring digest delivery (cron + channels: WhatsApp / Telegram / Slack / email). | |
schedule_recurring | Register a recurring repost rule from a template post. | |
schedule_repost_sequence | Schedule a sequence of repost steps from a template (up to 10 steps). | |
set_brand_kit | Update the brand kit (colors, logo, fonts, voice notes). | |
set_default_platforms | Persist the default platforms used when a post names none. | |
set_default_schedule_slot | Persist a default schedule slot (hour + minute, local time). | |
set_post_platforms | Replace the platforms on a draft. | |
set_require_approval_default | Toggle whether every publish/schedule requires approval by default. | |
set_workspace_schedule | Stamp a natural-language scheduled time on the active workspace. | |
start_connect | Return a deep link to connect (or reconnect) a social account. | |
translate_caption | Translate a caption to en / pt-BR / es, preserving emoji, hashtags, and line breaks. | |
undo_last_action | Reverse the most recent soft-delete within the 30s undo window. | |
update_job | Update a scheduled digest job (name, cron, channels, params). | |
update_post_caption | Set or replace a draft's caption. | |
| mcp:publish4 tools | ||
commit_workspace | Commit the active workspace to a post — save draft, publish now, or schedule. | |
publish_post | Publish an existing draft now by id. | |
retry_failed_platforms | Retry the platforms that failed on a publish; already-published ones are skipped. | |
schedule_post | Schedule an existing draft for a future time. | |
Scopes are opt-in per key. Issue a read-only key for an analytics agent, a write-but-no-publish key for a copy reviewer, and reserve mcp:publish for the agent you actually trust.
Client setup
{
"mcpServers": {
"letspost": {
"url": "https://mcp.letspost.it/v1/mcp",
"headers": { "Authorization": "Bearer lp_live_xxx" }
}
}
}Free plan. No card required. API key ready in under a minute.
Free tier · No credit card · MCP server live