Developer API

A REST API over your workspace: posts, approvals, media, notes and analytics, on Ultra and Ultra+.

API keys from the dashboard, one error shape, and an OpenAPI 3.1 reference with samples in curl, Node and Python.

Read the reference

Start free trial

14-day free trialCancel anytime, no questions asked

Base URL
https://api.schedchie.com/v1

# the same routes also answer on
https://mcp.schedchie.com/v1
API version 1.0.0. Download the OpenAPI spec.

Getting started

  1. Create a key

    In the dashboard, under AI assistants, API keys. Keys are there after the workspace's first paid invoice, not during the trial. Copy the key when it appears: it is shown once.

  2. Make the first call

    GET /v1/me checks the key and answers its workspace.

    GET /v1/me
    curl https://api.schedchie.com/v1/me \
      -H "Authorization: Bearer $SCHEDCHIE_API_KEY"
  3. Schedule a post

    POST /v1/posts with the text, the account ids from GET /v1/accounts and a time. It answers 201 with the post.

    POST /v1/posts
    curl -X POST https://api.schedchie.com/v1/posts \
      -H "Authorization: Bearer $SCHEDCHIE_API_KEY" \
      -H "Idempotency-Key: launch-2026-12-01-ig-li" \
      -H "Content-Type: application/json" \
      -d '{"text":"Launch day. The new collection is live.","accountIds":["64a1f0e2b3c4d5e6f7a8b9c1"],"scheduledTime":"2026-12-01T09:00:00.000Z","hashtags":["launch","newcollection"]}'
  4. Or use the CLI

    The schedchie package gives you the CLI and an SDK on the same keys. To connect an AI assistant instead, see the MCP setup.

    Terminal
    npm install -g schedchie

Authentication

One bearer header on every request, from your own server.

Header
Authorization: Bearer schedchie_api_… on every request. A missing or unknown key answers 401.
Keys
Up to 5 active keys per workspace on Ultra, 10 on Ultra+. Each key is shown once, when it is made.
Permissions
Each key is granted permission groups (posts, media, analytics, team, library), each read and write or read only. A read-only key is refused on every write.
Workspace
A key acts only in its own workspace.
Format
JSON both ways, bodies up to 8 MiB, camelCase field names. Creates answer 201.
Browsers
The API sends no CORS headers: call it from your server, not from browser code.
Webhooks
There are no webhooks. Poll GET /v1/posts with a status filter instead.

The limits

Per key and once more for the whole workspace, so more keys never mean more calls.

LimitUltraUltra+
Calls a minute, per key120120
Calls a minute, all keys of the workspace together120120
Calls an hour, per key1,2003,600
Calls an hour, all keys of the workspace together1,2003,600
Uncached live reads an hour, per workspace60120
Live read cache300 s300 s
Active keys per workspace510
Headers
Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; a 429 or 503 adds Retry-After.
Live reads
The analytics overview and account routes reach a social platform. A repeat inside 300 s is served from the cache (X-Schedchie-Cache: hit) and costs no live read.
Platforms
Each platform meters its own API. A platform can refuse or slow a call that is inside these numbers.

One error shape

Every error carries the same envelope. details lists each failed field on a 422 validation_failed. Every response carries X-Request-Id: quote it when you write to us.

{
  "error": {
    "status": 422,
    "code": "validation_failed",
    "message": "…",
    "requestId": "…",
    "details": [{ "field": "…", "message": "…" }]
  }
}
StatusCode and meaning
400invalid_jsonthe body is not JSON.
400invalid_argumentsthe tool behind the route refused the values (an unknown account id, a time in the wrong format, a caption over a platform's limit).
400workspace_not_alloweda workspace field named another workspace.
401missing_keyno Authorization: Bearer header.
401invalid_keynot a Schedchie API key, or unknown or revoked.
401key_refusedthe key was revoked during the call. The response carries WWW-Authenticate: Bearer realm="schedchie-api".
403plan_requiredthe workspace left the Ultra plan.
403not_permittedthe key was not granted this route's group, is read only for it, or is bound to an employee seat that cannot use this route.
404not_foundno resource with that id in this workspace, or no such route under /v1.
405method_not_allowedthe path exists, the method does not. Allow lists the methods that do.
413body_too_largethe request body is over 8 MiB.
422validation_failedthe body or the query did not match this route's schema; details names each field.
422tool_errorthe request was well formed and Schedchie or the social platform refused it (a caption too long for a platform, an account that needs reconnecting, a file the platform does not accept).
429rate_limitedover 120 calls this minute for this key or for the workspace's keys together, or too many refused requests from one address.
429budget_exhaustedthe hour's calls are used up.
429live_read_budgetthe workspace's uncached live reads this hour are used up. Retry-After says how long to wait.
503unavailableSchedchie could not verify the key or reach its own API right now. Retry after Retry-After seconds.
504timeoutthe call did not finish within 15 minutes and was stopped.
500internalsomething failed on our side; the message carries a reference for support.

How the API behaves

Idempotency

POST /v1/posts takes an Idempotency-Key header, 1 to 255 characters of your choice. A repeat with the same key and the same API key answers the post already made with 200 and Idempotent-Replayed: true, never a second post. Keys are unique forever per API key. No other create is idempotent; a second DELETE answers 404.

Versioning and deprecation

The version is in the path. New routes, new optional fields and new enum values do not change it. A breaking change ships as /v2, and /v1 keeps answering for at least six months after /v2 is announced, with Deprecation and Sunset headers on its responses and an entry in the changelog below.

Advanced: calling a tool directly

The same keys reach every tool of the MCP server over HTTPS. GET /v1/tools lists the tools a key may call, and POST /v1/tools/{name} runs one with its arguments as the JSON body: the way to what the REST routes do not wrap. A destructive tool runs there only with X-Confirm-Destructive: true; on the REST routes, DELETE is the confirmation.

Changelog

v1 published, on https://api.schedchie.com/v1 and https://mcp.schedchie.com/v1.

Ultra, €24.99 a month, API included

Up to 5 keys and 1,200 calls an hour. Keys are available after the first paid invoice.

Start free trial

14-day free trialCancel anytime, no questions asked