Schedule & Chill
Developer docs

REST API and MCP, in one reference.

Bearer token for your own code, OAuth for agents. Same capabilities either way.

Reference

Changelog

Notable changes and additions to the Schedule & Chill API and MCP server.

Notable changes to the public API and MCP server. Breaking changes will always be announced here first.

2026-09-14

  • The developer docs moved to https://schedulenchill.com/help/developers, inside the Help Center. Every old /docs and /developers link redirects permanently (301) to the same page, .md copies included.

2026-09-01

  • The MCP server now speaks OAuth 2.1, at a second endpoint: https://schedulenchill.com/mcp-oauth. Paste that URL into Claude, ChatGPT, Claude Desktop, Cursor, VS Code or Zapier as a custom connector and approve the consent screen — there is no API key to create, copy or store. It supports PKCE and dynamic client registration (RFC 7591), so a client configures itself from the URL alone. Tokens are scoped to mcp:use, issued per tool, and revocable individually.
  • https://schedulenchill.com/mcp is unchanged and is not going away. Both endpoints expose exactly the same 22 tools, 4 resources and 2 prompts; only the authentication differs. Every existing API-key configuration keeps working.
  • ChatGPT connectors now work. They authenticate with OAuth and have no field for a static bearer header, which is why the old bearer-only endpoint could not be used from ChatGPT. The docs previously said this was unsupported and on the roadmap; it has shipped.
  • Fixed: tools failed over OAuth. Any tool that touched a relation — get_accounts among them — returned Call to undefined method OAuthUser::socialAccounts(). The Passport guard resolves an identity-only model that is swapped for the real user by middleware, but the swap only reached Illuminate\Http\Request::user(), while MCP tools resolve through the auth manager. The handshake succeeded and every tool call failed.
  • Fixed: a 401 from /mcp-oauth carried no WWW-Authenticate header. RFC 9728 and the MCP authorization spec both require it, and strict clients use it to find the resource metadata. Without it a client could only report that the server does not support OAuth.

2026-08-07

  • Breaking (MCP schedule_post): timing is now an explicit, required when. It takes "draft", "now", "next_slot", or an ISO-8601 timestamp. Previously an omitted scheduled_at meant "publish immediately and irreversibly" — an absent parameter deciding to broadcast, on the surface driven by a model. Omitting both when and scheduled_at now returns no_timing_specified and publishes nothing. scheduled_at still works for one more release and is equivalent to passing that timestamp in when (ignored if when is also given; the response warnings say so). when="draft" creates a draft — no publish job is queued, and drafts do not count against the monthly post limit. when="next_slot" with no posting schedule returns no_queue_slots rather than falling through to publish-now. REST POST /api/posts is unchanged: it already required an explicit publish_now and defaulted to draft.
  • New MCP tool get_queue_slots — read-only; returns the next open slots in your posting schedule as {iso, label}. Slots are computed, not reserved, so use it to show a human real options; use when="next_slot" when you want the server to pick at write time.
  • MCP list_scheduled renamed to list_posts, with a new status filter (scheduled default, plus draft, published, failed, all) so agent-created drafts are findable. list_scheduled stays registered as a deprecated alias for one release and keeps its old scheduled-only behaviour.
  • LinkedIn post visibilityplatform_options for linkedin now accepts visibility: PUBLIC (default) or CONNECTIONS. Discoverable via get_capabilities / GET /api/capabilities.
  • Error envelopes rewritten for agentsplan_limit_reached, no_connected_accounts, and account_inactive no longer end at "upgrade your plan" or "go to Settings", which a caller with no browser cannot do. Each now leads with an action the caller can take and carries structured recovery data: alternatives[] (healthy accounts with health), resets_at, drafts_count_against_limit, and connect_url/reconnect_url/upgrade_url for the human handoff.
  • Six new MCP tools bring the agent surface level with the dashboardpublish_now (send a draft, scheduled or failed post immediately), retry_post (resend only the channels that failed, leaving published ones untouched), duplicate_post (copy content, channels and media into a new draft), delete_post (remove a post in any state), restore_post (undo a delete or cancel), and get_analytics (reach, impressions, likes/comments/shares, engagement rate, per-channel and per-platform breakdowns, daily timeline and top posts over a date window).
  • Removing a post is now reversible from an agent. cancel_post and delete_post soft-delete, and restore_post brings the post back. get_post now also finds deleted posts, returning deleted_at and an outcome of deleted — previously a cancelled post vanished from every read surface. A post whose scheduled time has passed is restored as a draft rather than re-armed, so restoring never publishes anything by itself.
  • New error codes: post_not_publishable, post_not_retryable, post_not_deleted.
  • A platform with no native options now returns {}, not a missing key — on both get_capabilities and GET /api/capabilities. A missing key read as "unknown platform".
  • REST gets the same verbs: POST /api/posts/{id}/cancel, /publish-now, /retry, /duplicate, /restore, plus GET /api/analytics. Each mirrors the MCP tool of the same name; a test asserts GET /api/analytics and get_analytics return identical payloads.
  • DELETE /api/posts/{id} on a scheduled post is no longer a dead end. It told you to "cancel scheduled post before deleting" while no cancel endpoint existed, so a scheduled post could not be removed over REST at all. Cancel now exists. Breaking: that refusal changes from 422 {message} to 409 {error: {code: 'post_not_cancelable', ...}}, matching the error envelope every other endpoint uses.
  • State-conflict errors now return 409, not 422post_not_cancelable, post_not_publishable, post_not_retryable, post_not_deleted. The request body is fine; the post is in a state that does not allow the action.

2026-07-17

  • Per-account publishing status — while a post publishes, each targeted account's pivot.status transitions pending → publishing → published | failed. publishing is transient (a channel is uploading/processing). The post's own status stays scheduled throughout publishing; poll until no account is pending or publishing, then treat a published post that still has a failed account as a partial publish. partial is derived, not a stored status.
  • New MCP tool get_post — retrieve a single post by id with its post-level status, a derived outcome (draft/scheduled/publishing/published/partial/failed), and per_account[] delivery records (status, error_message, platform_url, published_at). Use it to poll a just-published post; list_scheduled now also includes per-account status, and get_stats reports a publishing count.

2026-06-07

  • Developer documentation launched — REST API, MCP server, and reference.

2026-06

  • MCP server available at /mcp with seven tools, three resources, and two prompts.
  • REST API: Posts, Media, and API Keys resources with bearer-token authentication.
  • Platforms: X, LinkedIn (profiles + Pages), Facebook, Instagram, Pinterest, YouTube, TikTok.

Roadmap

  • Outbound webhooks for publish/fail events.
  • Per-key rate limits with X-RateLimit-* headers.
  • Additional platforms: Threads, Bluesky, Google Business Profile.
  • OpenAPI specification and official SDKs.
Not a developer question?Browse the help centre →

Still stuck? Ask a person.

One inbox, answered by the people who built it. Usually same day, and never a ticket number.