For developers and agents
Build automation on top of your social.
Two external surfaces reach the same engine the dashboard runs on: a scoped REST API and a hosted MCP server. Both cover workspaces, connected accounts, content, media, scheduling, publishing and webhooks, so an agent, an n8n flow or your own code can post on your behalf.
What they do not cover, so you are not surprised later: Brand DNA, the AI caption writer and the plan generator stay in the dashboard. Neither surface generates text or media, and neither can connect a social account for you.
Post content from
Claude
Hosted MCP server
For Claude, Cursor, Claude Code and anything else that speaks MCP.
- URL
- https://mcp.ezsocial.co/mcp
- Auth
- OAuth 2.1 with a browser consent screen. No API key to paste.
- Transport
- Streamable HTTP, stateless, JSON responses.
REST API
For your own code, a cron job, n8n or Make.
- Base URL
- https://api.ezsocial.co/api/v1
- Auth
- Authorization: Bearer ezs_sk_...
- Scoping
- Every key carries its own scopes, and every route checks one.
The 28 MCP tools
The complete set. Grouped here for reading, but the server exposes one flat list.
Workspaces, accounts and brand
ezsocial_list_workspacesezsocial_list_platformsezsocial_list_accountsezsocial_get_brand_context
Content
ezsocial_create_postezsocial_list_contentezsocial_get_contentezsocial_create_contentezsocial_update_contentezsocial_delete_contentezsocial_validate_contentezsocial_approve_contentezsocial_schedule_contentezsocial_unschedule_contentezsocial_publish_nowezsocial_get_publication_status
AI
ezsocial_generate_text
Media
ezsocial_upload_mediaezsocial_list_mediaezsocial_delete_mediaezsocial_create_media_uploadezsocial_finalize_media_upload
Webhooks
ezsocial_create_webhookezsocial_list_webhooksezsocial_delete_webhookezsocial_list_webhook_deliveriesezsocial_ping_webhookezsocial_redeliver_webhook
The 29 REST endpoints
Every path is relative to the base URL above, and the pill on each row is the permission that route checks on your key.
- GET
/workspacesaccounts:readThe brands on the account. Everything else is scoped to one.
- GET
/platformsaccounts:readWhich platforms a workspace can publish to.
- GET
/accountsaccounts:readThe social accounts connected to a workspace.
- GET
/brand-contextaccounts:readBrand voice, audience and DNA. Read it before writing copy.
- GET
/contentcontent:readList content by state, platform or scheduled window.
- POST
/contentcontent:writeCreate a draft. Prefer POST /posts, which also schedules.
- POST
/postscontent:writeCreate and schedule across platforms in one call.
- POST
/content/validatecontent:readCheck a post against each platform's rules. Writes nothing.
- POST
/content/approvepublishApprove items waiting in the review queue.
- GET
/content/:contentIdcontent:readOne item in full, including per-platform variants.
- PATCH
/content/:contentIdcontent:writeEdit text, media, tags or the scheduled time.
- DELETE
/content/:contentIdcontent:writeDelete a post and every publication attached to it.
- POST
/content/:contentId/unschedulepublishTake a scheduled post off the calendar, back to draft.
- POST
/content/:contentId/schedulepublishSet a future date and time. Must be in the future.
- POST
/content/:contentId/publishpublishPublish immediately instead of queueing.
- GET
/content/:contentId/publicationscontent:readPer platform status, including why one failed.
- GET
/publicationscontent:readSweep every publication. The way to find what failed.
- POST
/generate-textcontent:writeWrite on-brand captions, one per platform.
- POST
/mediamedia:writeImport media straight from a public URL.
- POST
/media/uploadsmedia:writeStart a local-file upload. Returns a presigned PUT URL.
- POST
/media/uploads/:uploadId/finalizemedia:writeClose the upload and get the media id back.
- GET
/mediamedia:writeThe media library, so you can reuse instead of re-upload.
- DELETE
/media/:mediaIdmedia:writeDelete one media item and detach it from any draft.
- POST
/webhookswebhooks:manageSubscribe an endpoint to publish events.
- GET
/webhookswebhooks:manageList your subscriptions.
- DELETE
/webhooks/:webhookIdwebhooks:manageRemove a subscription.
- GET
/webhooks/:webhookId/deliverieswebhooks:manageEvery delivery attempt, with its response.
- POST
/webhooks/:webhookId/pingwebhooks:manageSend a test event to check the endpoint.
- POST
/webhooks/:webhookId/deliveries/:deliveryId/redeliverwebhooks:manageReplay one delivery that failed.
Scopes
The same six on both surfaces. An app or a key acts only inside the scopes you grant, and you can revoke either at any time.
accounts:readSee your workspaces, brand profile, and connected social accounts
content:readRead your content and its publishing status
content:writeCreate and update content drafts on your behalf
publishSchedule and publish posts to your connected accounts
media:writeUpload, list and delete media in your library
webhooks:manageCreate, list, and delete webhook subscriptions on your behalf
Webhooks
Publishing is asynchronous, so you should not have to poll for the outcome. Register an endpoint and EzSocial posts to it when a queued post resolves.
content.publishedA queued post went out. Carries the platform, the post id and the live URL.
content.publish_failedA platform rejected it. Carries the reason the platform gave.
Every delivery is signed. Verify X-EzSocial-Signature against the secret you were given at registration, and dedupe retries on X-EzSocial-Delivery-Id, which is stable across attempts. Failed deliveries retry with backoff, and you can list every attempt, send a test ping, or replay one by hand.
Getting started
- 1
Connect an account in the dashboard
OAuth to Instagram, TikTok or LinkedIn happens in the app, once. Neither surface can add a connection for you, which is deliberate: a token grant is a decision, not an API call.
- 2
Pick your surface
For your own code, generate an API key and send it as a bearer token. For an AI client, point it at the MCP URL and approve the scopes on the consent screen. There is no key to paste for MCP.
- 3
Create, schedule, publish
Attach media by id, create the post, then either schedule it for a future time or publish it now. Subscribe a webhook if you want to be told when it lands.
Both surfaces are a Pro feature: a valid key on a free plan is refused, and so is an MCP call. See pricing, then generate a key and manage your webhooks under Developers in the dashboard.