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/docsand/developerslink redirects permanently (301) to the same page,.mdcopies 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 tomcp:use, issued per tool, and revocable individually. https://schedulenchill.com/mcpis 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_accountsamong them — returnedCall 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 reachedIlluminate\Http\Request::user(), while MCP tools resolve through the auth manager. The handshake succeeded and every tool call failed. - Fixed: a 401 from
/mcp-oauthcarried noWWW-Authenticateheader. 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, requiredwhen. It takes"draft","now","next_slot", or an ISO-8601 timestamp. Previously an omittedscheduled_atmeant "publish immediately and irreversibly" — an absent parameter deciding to broadcast, on the surface driven by a model. Omitting bothwhenandscheduled_atnow returnsno_timing_specifiedand publishes nothing.scheduled_atstill works for one more release and is equivalent to passing that timestamp inwhen(ignored ifwhenis also given; the responsewarningssay 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 returnsno_queue_slotsrather than falling through to publish-now. RESTPOST /api/postsis unchanged: it already required an explicitpublish_nowand 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; usewhen="next_slot"when you want the server to pick at write time. - MCP
list_scheduledrenamed tolist_posts, with a newstatusfilter (scheduleddefault, plusdraft,published,failed,all) so agent-created drafts are findable.list_scheduledstays registered as a deprecated alias for one release and keeps its old scheduled-only behaviour. - LinkedIn post visibility —
platform_optionsforlinkedinnow acceptsvisibility:PUBLIC(default) orCONNECTIONS. Discoverable viaget_capabilities/GET /api/capabilities. - Error envelopes rewritten for agents —
plan_limit_reached,no_connected_accounts, andaccount_inactiveno 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 withhealth),resets_at,drafts_count_against_limit, andconnect_url/reconnect_url/upgrade_urlfor the human handoff. - Six new MCP tools bring the agent surface level with the dashboard —
publish_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), andget_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_postanddelete_postsoft-delete, andrestore_postbrings the post back.get_postnow also finds deleted posts, returningdeleted_atand anoutcomeofdeleted— 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 bothget_capabilitiesandGET /api/capabilities. A missing key read as "unknown platform". - REST gets the same verbs:
POST /api/posts/{id}/cancel,/publish-now,/retry,/duplicate,/restore, plusGET /api/analytics. Each mirrors the MCP tool of the same name; a test assertsGET /api/analyticsandget_analyticsreturn 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 from422 {message}to409 {error: {code: 'post_not_cancelable', ...}}, matching the error envelope every other endpoint uses.- State-conflict errors now return 409, not 422 —
post_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
publishingstatus — while a post publishes, each targeted account'spivot.statustransitionspending → publishing → published | failed.publishingis transient (a channel is uploading/processing). The post's ownstatusstaysscheduledthroughout publishing; poll until no account ispendingorpublishing, then treat apublishedpost that still has afailedaccount as a partial publish.partialis derived, not a storedstatus. - New MCP tool
get_post— retrieve a single post by id with its post-levelstatus, a derivedoutcome(draft/scheduled/publishing/published/partial/failed), andper_account[]delivery records (status,error_message,platform_url,published_at). Use it to poll a just-published post;list_schedulednow also includes per-accountstatus, andget_statsreports apublishingcount.
2026-06-07
- Developer documentation launched — REST API, MCP server, and reference.
2026-06
- MCP server available at
/mcpwith 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 →