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 fromClaude

Claude

Supported platforms

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_workspaces
  • ezsocial_list_platforms
  • ezsocial_list_accounts
  • ezsocial_get_brand_context

Content

  • ezsocial_create_post
  • ezsocial_list_content
  • ezsocial_get_content
  • ezsocial_create_content
  • ezsocial_update_content
  • ezsocial_delete_content
  • ezsocial_validate_content
  • ezsocial_approve_content
  • ezsocial_schedule_content
  • ezsocial_unschedule_content
  • ezsocial_publish_now
  • ezsocial_get_publication_status

AI

  • ezsocial_generate_text

Media

  • ezsocial_upload_media
  • ezsocial_list_media
  • ezsocial_delete_media
  • ezsocial_create_media_upload
  • ezsocial_finalize_media_upload

Webhooks

  • ezsocial_create_webhook
  • ezsocial_list_webhooks
  • ezsocial_delete_webhook
  • ezsocial_list_webhook_deliveries
  • ezsocial_ping_webhook
  • ezsocial_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:read

    The brands on the account. Everything else is scoped to one.

  • GET/platformsaccounts:read

    Which platforms a workspace can publish to.

  • GET/accountsaccounts:read

    The social accounts connected to a workspace.

  • GET/brand-contextaccounts:read

    Brand voice, audience and DNA. Read it before writing copy.

  • GET/contentcontent:read

    List content by state, platform or scheduled window.

  • POST/contentcontent:write

    Create a draft. Prefer POST /posts, which also schedules.

  • POST/postscontent:write

    Create and schedule across platforms in one call.

  • POST/content/validatecontent:read

    Check a post against each platform's rules. Writes nothing.

  • POST/content/approvepublish

    Approve items waiting in the review queue.

  • GET/content/:contentIdcontent:read

    One item in full, including per-platform variants.

  • PATCH/content/:contentIdcontent:write

    Edit text, media, tags or the scheduled time.

  • DELETE/content/:contentIdcontent:write

    Delete a post and every publication attached to it.

  • POST/content/:contentId/unschedulepublish

    Take a scheduled post off the calendar, back to draft.

  • POST/content/:contentId/schedulepublish

    Set a future date and time. Must be in the future.

  • POST/content/:contentId/publishpublish

    Publish immediately instead of queueing.

  • GET/content/:contentId/publicationscontent:read

    Per platform status, including why one failed.

  • GET/publicationscontent:read

    Sweep every publication. The way to find what failed.

  • POST/generate-textcontent:write

    Write on-brand captions, one per platform.

  • POST/mediamedia:write

    Import media straight from a public URL.

  • POST/media/uploadsmedia:write

    Start a local-file upload. Returns a presigned PUT URL.

  • POST/media/uploads/:uploadId/finalizemedia:write

    Close the upload and get the media id back.

  • GET/mediamedia:write

    The media library, so you can reuse instead of re-upload.

  • DELETE/media/:mediaIdmedia:write

    Delete one media item and detach it from any draft.

  • POST/webhookswebhooks:manage

    Subscribe an endpoint to publish events.

  • GET/webhookswebhooks:manage

    List your subscriptions.

  • DELETE/webhooks/:webhookIdwebhooks:manage

    Remove a subscription.

  • GET/webhooks/:webhookId/deliverieswebhooks:manage

    Every delivery attempt, with its response.

  • POST/webhooks/:webhookId/pingwebhooks:manage

    Send a test event to check the endpoint.

  • POST/webhooks/:webhookId/deliveries/:deliveryId/redeliverwebhooks:manage

    Replay 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:read

    See your workspaces, brand profile, and connected social accounts

  • content:read

    Read your content and its publishing status

  • content:write

    Create and update content drafts on your behalf

  • publish

    Schedule and publish posts to your connected accounts

  • media:write

    Upload, list and delete media in your library

  • webhooks:manage

    Create, 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.published

    A queued post went out. Carries the platform, the post id and the live URL.

  • content.publish_failed

    A 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. 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. 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. 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.

Post from your own code

Connect an account once, then create, schedule and publish from the REST API or an MCP client. Signed webhooks tell you when each post lands.

Start free

No credit card required