API v1 · Getting started
Scripe API v1
Status: Public preview. The API, the MCP server and webhooks are available on every plan, Free and every grandfathered tier included. A few individual capabilities are plan-gated because the product feature behind them is (see
plan_not_eligible). We follow Scripe's deprecation policy — breaking changes only ship in a new dated version with at least 90 days of overlap.
The Scripe API is a JSON REST API for reading and writing the same workspace data the Scripe dashboard does: posts, notes, the idea board, the content calendar, sources (transcriptions), the knowledge base, the media library, analytics, async AI jobs, and outbound webhooks.
There are three ways in, and they share one scope vocabulary and one error contract:
- REST with an API key — mint a
scripe_sk_*key in the dashboard and callhttps://api.scripe.io/v1/*. The fastest path for scripts and single-workspace integrations. Start below. - REST with OAuth 2.1 — for multi-tenant products acting on behalf of a Scripe user, with per-user consent and multi-workspace reach. See OAuth.
- MCP — point an MCP-compatible host (Claude, ChatGPT, Cursor, agent
frameworks) at
https://mcp.scripe.io/mcpand it drives the same capabilities as tools, with a two-phase confirmation that previews anything irreversible before it runs. See MCP.
Make your first call
- In the Scripe dashboard, switch to the workspace you want to integrate and open Settings → Developer → API keys → New API key. Copy the secret — it is shown exactly once.
- Verify the key resolves your workspace:
curl -i https://api.scripe.io/v1/workspaces/me \
-H "Authorization: Bearer scripe_sk_live_…" \
-H "Scripe-Api-Version: 2026-08-10"A 200 OK with your workspace's id, plan, and principal info confirms
the key works. A 401 means the key is wrong or revoked — re-mint or
check the header.
From here, a typical read is one more call:
# List your projects, then read a project's posts.
curl -s https://api.scripe.io/v1/projects \
-H "Authorization: Bearer scripe_sk_live_…" \
-H "Scripe-Api-Version: 2026-08-10"
curl -s "https://api.scripe.io/v1/posts?projectId=proj_…" \
-H "Authorization: Bearer scripe_sk_live_…" \
-H "Scripe-Api-Version: 2026-08-10"Reading posts requires the posts:read scope on the key — tick it in
the key wizard. The authentication page covers scopes,
rotation, and revocation.
Base URLs
REST: https://api.scripe.io/v1
MCP: https://mcp.scripe.io/mcpThe MCP transport also serves a legacy SSE endpoint — see MCP.
Authentication
Authorization: Bearer scripe_sk_live_…Every request carries a Bearer token in the Authorization header. Two
credentials are supported:
- API key
scripe_sk_*— single-workspace, minted in the dashboard. See Authentication. - OAuth 2.1 access token
scripe_oat_*— multi-tenant, on behalf of a Scripe user, can reach every workspace the user belongs to plus every client workspace billed to an agency they own. See OAuth.
Both use the identical wire format and the identical scope vocabulary;
the difference is who issues the token and how it rotates. An API key
can hold every scope a REST endpoint requires except webhooks:manage,
which is grantable to OAuth tokens only today — see
auth.md §Scopes for the exact catalogue.
API keys are a REST-only credential. The MCP transport accepts OAuth access tokens exclusively.
Versioning
Pin a date-stamped version on every request:
Scripe-Api-Version: 2026-08-102026-08-10 is the current version and the default when the header is
omitted. Omitting the header is fine for exploration but dangerous in
production — the default moves when we cut a new version, so pin
explicitly. The previous version 2026-08-01 is deprecated with sunset
on 2026-11-15. See Conventions § Versioning
for the changelog and deprecation policy.
Endpoint catalogue
Every endpoint, with the scope it requires. Full request/response schemas live in the OpenAPI reference tab; each resource's page in this tab covers the semantics that don't fit a schema.
"any valid token" means the endpoint needs authentication but no particular scope.
| Method | Path | Scope | Notes |
|---|---|---|---|
| GET | /health | none | Liveness probe; unauthenticated. |
| GET | /health/auth | any valid token | Authenticated canary probe. |
| GET | /workspaces/me | any valid token | The active workspace + principal. |
| GET | /workspaces | any valid token | Every workspace the caller can reach. |
| GET | /workspaces/context | workspace:read | One-call overview: plan, review gate, up to 25 projects with stored LinkedIn health + streaks. |
| GET | /team | workspace:read | Team members (≤100) with roles and project assignments. |
| GET | /projects | any valid token | Paginated project list. |
| GET | /projects/{projectId} | any valid token | Single project read. |
| GET | /company-pages | projects:read | Company pages in the workspace: activation status, stored admin token health, followers, engagement state. |
| GET | /notes | notes:read | List notes for a project; date/cursor filters. |
| GET | /notes/{noteId} | notes:read | Single note read. |
| POST | /notes | notes:write | Create a note + queue slot. Idempotent. |
| PATCH | /notes/{noteId} | notes:write | Update body and/or folder. |
| GET | /posts | posts:read | List posts for a project; status CSV filter. |
| GET | /posts/{postId} | posts:read | Single post read. |
| POST | /posts | posts:write | Create a draft (or scheduled) post. Idempotent. |
| PATCH | /posts/{postId} | posts:write | Edit content/status; schedule, reschedule, or unschedule. |
| GET | /post-statuses | posts:read | The workspace's custom (kanban) post statuses. |
| PATCH | /posts/{postId}/media | posts:write + media:read | Full-state media write onto a post. |
| POST | /posts/generations | posts:write | Async AI post generation. Idempotent. |
| GET | /ideas | ideas:read | Paginated compact idea-board list (derived statuses). |
| GET | /ideas/{ideaId} | ideas:read | One idea in full: brief, evidence, readiness, sources. |
| POST | /ideas | ideas:write | Create an idea at the top of its column (status inbox | in_production only). Idempotent. |
| PATCH | /ideas/{ideaId} | ideas:write | Edit the idea's brief field set; null clears a brief field. No REST delete — see Ideas. |
| GET | /calendar | calendar:read | Content calendar for a date range (posts, note slots, ideas, template). |
| GET | /calendar/next-free-slot | calendar:read | Next free posting slot from the project's template. |
| GET | /sources | sources:read | Paginated source list (previews only). |
| GET | /sources/{sourceId} | sources:read | Single source with transcript preview; topics[] (best-first by score) once processed. hooks[] stays empty for API-created sources. |
| POST | /sources | sources:write | Create a source. type: "text" is sync; type: "file" enqueues a job. Idempotent. |
| DELETE | /sources/{sourceId} | sources:destroy | Two-phase destroy: a bare DELETE returns a proposal + token and removes nothing; replaying with the token executes. Derived posts and the usage ledger survive — see Sources. |
| POST | /uploads | sources:write or knowledge:write | Mint a presigned S3 PUT URL for file ingest. |
| GET | /knowledge | knowledge:read | Paginated knowledge-document list for a project. |
| GET | /knowledge/{documentId} | knowledge:read | Single document: metadata, chunk count, 2,000-char preview. |
| POST | /knowledge | knowledge:write | Async ingest of text/file/URL/YouTube. Idempotent. |
| GET | /media | media:read | Search reachable media-library assets (READY only). |
| POST | /media | media:write | Import your own image into the media library (inline base64 or uploadId); returns the img_… id the media write takes. Idempotent by content. |
| POST | /media/generations | media:write | Async AI image generation into the media library. Spend-capped; idempotent. |
| POST | /media/carousels | media:write | Async AI carousel generation (deck + rendered PDF) into the media library. Spend-capped; idempotent. |
| GET | /analytics/overview | analytics:read | Current vs previous-period rollup. |
| GET | /analytics/posts | analytics:read | Per-post LinkedIn metrics, newest first. |
| GET | /analytics/report | analytics:read | Downloadable PDF/CSV report. |
| GET | /viral-posts | analytics:read | Semantic search over the viral-post inspiration feed. |
| GET | /settings | workspace:read | Curated project settings: context knobs, tone of voice, org custom-instruction state, calendar, pillars. Structured fields only. |
| GET | /engagement-policy | workspace:read | Engagement defaults + overrides + canEnable + plan-lock state for a project. |
| GET | /usage | workspace:read | Usage meters (weekly AI budget, storage, daily spend cap) + the canGenerate pre-flight for both 402s. |
| GET | /webhook-endpoints | webhooks:manage | List registered webhook endpoints. |
| POST | /webhook-endpoints | webhooks:manage | Register an endpoint. Secret shown once. |
| GET | /webhook-endpoints/{id} | webhooks:manage | Single endpoint read. |
| PATCH | /webhook-endpoints/{id} | webhooks:manage | Update URL, events, or active state. |
| DELETE | /webhook-endpoints/{id} | webhooks:manage | Remove an endpoint. |
| POST | /webhook-endpoints/{id}/rotate-secret | webhooks:manage | Rotate the signing secret. |
| GET | /jobs | any valid token | List async jobs (paginated). |
| GET | /jobs/{jobId} | any valid token | Single job read with progress snapshot. |
| POST | /jobs/{jobId}/cancel | any valid token | Cancel a QUEUED job. |
Deliberately not on REST: publishing to LinkedIn now, permanent deletion of notes/ideas/knowledge, removal of a media-library asset (see Media), and settings writes. Those verbs are irreversible or sensitive, so they exist only on the MCP surface, behind a two-phase confirmation that previews the action and an OAuth scope the user must grant by name. Note that the confirmation is a preview contract, not a human gate — putting a person between proposal and execution is the host's job.
The machine-readable OpenAPI 3.1 spec backs the OpenAPI reference
tab of this site. Use it to generate clients — we recommend
openapi-generator or
@hey-api/openapi-ts.
Conventions
The same rules apply to every endpoint:
- Pagination — opaque cursors, never page
numbers. Loop until
pagination.has_moreisfalse. - Errors — uniform envelope with stable
codeidentifiers; see the error reference for every code. - Rate limits — per-credential sliding 60-second windows: 120 reads/min, 30 writes/min, 10 job submissions/min.
- Resource IDs — every resource has a
typed prefix (
post_,note_,proj_,idea_,kb_, …). - Idempotency — ten write endpoints honour
Idempotency-Keyand replay the original response for 24h; every other write ignores the header.
Need help?
- Email support@scripe.io for integration questions.
- Email security@scripe.io for suspected key or token leaks. We respond within one business day.
- Status page: status.scripe.io.