Meet the new Scripe, live on October 7.Register

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 call https://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/mcp and 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

  1. 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.
  2. Verify the key resolves your workspace:
bash
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:

bash
# 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/mcp

The MCP transport also serves a legacy SSE endpoint — see MCP.


Authentication

http
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:

http
Scripe-Api-Version: 2026-08-10

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

MethodPathScopeNotes
GET/healthnoneLiveness probe; unauthenticated.
GET/health/authany valid tokenAuthenticated canary probe.
GET/workspaces/meany valid tokenThe active workspace + principal.
GET/workspacesany valid tokenEvery workspace the caller can reach.
GET/workspaces/contextworkspace:readOne-call overview: plan, review gate, up to 25 projects with stored LinkedIn health + streaks.
GET/teamworkspace:readTeam members (≤100) with roles and project assignments.
GET/projectsany valid tokenPaginated project list.
GET/projects/{projectId}any valid tokenSingle project read.
GET/company-pagesprojects:readCompany pages in the workspace: activation status, stored admin token health, followers, engagement state.
GET/notesnotes:readList notes for a project; date/cursor filters.
GET/notes/{noteId}notes:readSingle note read.
POST/notesnotes:writeCreate a note + queue slot. Idempotent.
PATCH/notes/{noteId}notes:writeUpdate body and/or folder.
GET/postsposts:readList posts for a project; status CSV filter.
GET/posts/{postId}posts:readSingle post read.
POST/postsposts:writeCreate a draft (or scheduled) post. Idempotent.
PATCH/posts/{postId}posts:writeEdit content/status; schedule, reschedule, or unschedule.
GET/post-statusesposts:readThe workspace's custom (kanban) post statuses.
PATCH/posts/{postId}/mediaposts:write + media:readFull-state media write onto a post.
POST/posts/generationsposts:writeAsync AI post generation. Idempotent.
GET/ideasideas:readPaginated compact idea-board list (derived statuses).
GET/ideas/{ideaId}ideas:readOne idea in full: brief, evidence, readiness, sources.
POST/ideasideas:writeCreate an idea at the top of its column (status inbox | in_production only). Idempotent.
PATCH/ideas/{ideaId}ideas:writeEdit the idea's brief field set; null clears a brief field. No REST delete — see Ideas.
GET/calendarcalendar:readContent calendar for a date range (posts, note slots, ideas, template).
GET/calendar/next-free-slotcalendar:readNext free posting slot from the project's template.
GET/sourcessources:readPaginated source list (previews only).
GET/sources/{sourceId}sources:readSingle source with transcript preview; topics[] (best-first by score) once processed. hooks[] stays empty for API-created sources.
POST/sourcessources:writeCreate a source. type: "text" is sync; type: "file" enqueues a job. Idempotent.
DELETE/sources/{sourceId}sources:destroyTwo-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/uploadssources:write or knowledge:writeMint a presigned S3 PUT URL for file ingest.
GET/knowledgeknowledge:readPaginated knowledge-document list for a project.
GET/knowledge/{documentId}knowledge:readSingle document: metadata, chunk count, 2,000-char preview.
POST/knowledgeknowledge:writeAsync ingest of text/file/URL/YouTube. Idempotent.
GET/mediamedia:readSearch reachable media-library assets (READY only).
POST/mediamedia:writeImport your own image into the media library (inline base64 or uploadId); returns the img_… id the media write takes. Idempotent by content.
POST/media/generationsmedia:writeAsync AI image generation into the media library. Spend-capped; idempotent.
POST/media/carouselsmedia:writeAsync AI carousel generation (deck + rendered PDF) into the media library. Spend-capped; idempotent.
GET/analytics/overviewanalytics:readCurrent vs previous-period rollup.
GET/analytics/postsanalytics:readPer-post LinkedIn metrics, newest first.
GET/analytics/reportanalytics:readDownloadable PDF/CSV report.
GET/viral-postsanalytics:readSemantic search over the viral-post inspiration feed.
GET/settingsworkspace:readCurated project settings: context knobs, tone of voice, org custom-instruction state, calendar, pillars. Structured fields only.
GET/engagement-policyworkspace:readEngagement defaults + overrides + canEnable + plan-lock state for a project.
GET/usageworkspace:readUsage meters (weekly AI budget, storage, daily spend cap) + the canGenerate pre-flight for both 402s.
GET/webhook-endpointswebhooks:manageList registered webhook endpoints.
POST/webhook-endpointswebhooks:manageRegister an endpoint. Secret shown once.
GET/webhook-endpoints/{id}webhooks:manageSingle endpoint read.
PATCH/webhook-endpoints/{id}webhooks:manageUpdate URL, events, or active state.
DELETE/webhook-endpoints/{id}webhooks:manageRemove an endpoint.
POST/webhook-endpoints/{id}/rotate-secretwebhooks:manageRotate the signing secret.
GET/jobsany valid tokenList async jobs (paginated).
GET/jobs/{jobId}any valid tokenSingle job read with progress snapshot.
POST/jobs/{jobId}/cancelany valid tokenCancel 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_more is false.
  • Errors — uniform envelope with stable code identifiers; 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-Key and replay the original response for 24h; every other write ignores the header.

Need help?