SummitScribe Public API

Overview

The Public API gives your own scripts and AI agents read-only access to your SummitScribe meetings, notes, transcripts, action items and folders, plus search across them. You only ever see your own data. Nothing in v1 can change or delete anything.

Base URL: https://summitscribe.app/api/v1. Every request and response is JSON over HTTPS. The full contract is an OpenAPI 3.1 file at /api/v1/openapi.json, which you can load into Postman, an SDK generator or an agent.

Every SummitScribe account can use the API. Manage API tokens at summitscribe.app on the web. You can’t create or manage them in the mobile or desktop apps.

Quickstart

  1. Sign in at summitscribe.app on the web and open Account settings, then Developer & agents.
  2. Name the token, pick its permissions and an expiry, then select Create token.
  3. Copy the token. It starts with ss_pat_ and is shown only once.
  4. Call /me to check it works:
curl https://summitscribe.app/api/v1/me \
  -H "Authorization: Bearer $SUMMITSCRIBE_TOKEN"

A working token returns your plan, this month’s usage and the token’s own scopes:

{
  "object": "me",
  "plan": "free",
  "usage": { "month_hours_used": 2.5, "month_hours_included": 4 },
  "token": { "scopes": ["meetings:read", "notes:read"], "expires_at": "2027-02-08T15:00:00Z" }
}

The numbers above are example values. Then list your latest meetings:

curl "https://summitscribe.app/api/v1/meetings?limit=5" \
  -H "Authorization: Bearer $SUMMITSCRIBE_TOKEN"

Authentication

Send a personal access token on every request as Authorization: Bearer ss_pat_…. Treat it like a password: keep it in an environment variable or a secrets manager, not in code you share.

  • Creating a token needs a sign-in within the last 10 minutes. If yours is older, Settings asks you to sign in again first.
  • Tokens expire after 30, 90 or 365 days, whichever you pick. An expired token gets 401; create a new one.
  • You can revoke a token in Settings at any time. It stops working right away.
  • You can have up to 25 active tokens. Revoke one to make room for another.
  • Tokens only work on /api/v1. Every other route rejects them.

Scopes

Each token carries the scopes you picked. Give it only what the script needs. A call without the right scope gets 403 insufficient_scope.

ScopeGrants
meetings:readMeetings, titles, dates and folders
notes:readYour notes and AI notes
transcripts:readTranscripts
actions:readAction items
search:readSearch across meetings
mcp:readMCP server access (read-only tools)

Search results include the matching transcript and notes text. A token with search:read can read those matched passages even without notes:read or transcripts:read.

Endpoints

This list is built from the same OpenAPI file the API serves, so it matches what’s live. See the OpenAPI file for every response field.

MethodPathScope
GET/api/v1/meAny
GET/api/v1/meetingsmeetings:read
GET/api/v1/meetings/{id}meetings:read
GET/api/v1/meetings/{id}/notesnotes:read
GET/api/v1/meetings/{id}/transcripttranscripts:read
GET/api/v1/action-itemsactions:read
GET/api/v1/foldersmeetings:read
POST/api/v1/searchsearch:read

GET /api/v1/me

Your plan, this month’s usage, and this token’s scopes. No email. Scope: any valid token.

GET /api/v1/meetings

List meetings, newest first. Scope: meetings:read.

  • limit (query): integer, 1 to 100, default 25
  • cursor (query): string. next_cursor from the previous page.
  • folder_id (query): string (uuid)
  • since (query): string (date-time)

GET /api/v1/meetings/{id}

Get one meeting. Scope: meetings:read.

  • id (path, required): string (uuid)

GET /api/v1/meetings/{id}/notes

Your notes and the AI notes for a meeting. Scope: notes:read.

  • id (path, required): string (uuid)

GET /api/v1/meetings/{id}/transcript

Full transcript with timed segments. Scope: transcripts:read.

  • id (path, required): string (uuid)

GET /api/v1/action-items

Action items from AI notes. limit counts meetings; each page has every item from those meetings. Scope: actions:read.

  • limit (query): integer, 1 to 100, default 25
  • cursor (query): string. next_cursor from the previous page.
  • meeting_id (query): string (uuid)

GET /api/v1/folders

All folders (up to 1000). Scope: meetings:read.

POST /api/v1/search

Search your meetings. Returns evidence, not generated answers. Results include matching transcript and notes text, so search:read exposes that text for matched passages even without notes:read or transcripts:read. Scope: search:read.

JSON body:

  • query (required): string, 1 to 500 characters
  • meeting_id: string (uuid)
  • date_from: string (date)
  • date_to: string (date)
  • limit: integer, 1 to 50, default 20
curl -X POST https://summitscribe.app/api/v1/search \
  -H "Authorization: Bearer $SUMMITSCRIBE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "budget for Q3", "limit": 10}'

Search returns matching passages, not generated answers. While new meetings are still being indexed, the response has "indexing": true.

Pagination

List endpoints return newest first in this shape:

{ "object": "list", "data": [ ... ], "next_cursor": "eyJj..." }

To get the next page, pass next_cursor back as cursor. When next_cursor is null, you have everything. limit is 1 to 100 and defaults to 25. Treat the cursor as opaque; don’t build or edit it. On /action-items, limit counts meetings, and each page has every item from those meetings.

curl "https://summitscribe.app/api/v1/meetings?limit=25&cursor=eyJj..." \
  -H "Authorization: Bearer $SUMMITSCRIBE_TOKEN"

Errors

Every error has the same shape:

{ "error": { "code": "insufficient_scope", "message": "This token is missing the notes:read scope." } }
StatusCodeWhat it means
400invalid_requestA parameter or the request body is wrong.
401unauthorized, invalid_tokenThe token is missing, wrong, expired or revoked.
403insufficient_scopeThe token works but lacks the scope this endpoint needs.
404not_foundIt does not exist or is not yours. Another account's id gets 404, never 403.
413payload_too_largeThe request body is too big.
429rate_limited, quota_exceededYou hit the per-minute limit or the daily quota. Wait for Retry-After seconds.
500internal_errorSomething failed on our side. Try again.
503not_configured, unavailableThe API is briefly unavailable. Try again shortly.

Rate limits

Limits depend on your plan. The per-minute limits apply to each token; the daily quota is shared by all of your tokens. On Free that means 5 requests a minute and 1 search a minute.

PlanRequests per minute, per tokenSearches per minute, per tokenRequests per day, per account
Free511,000
Starter60205,000
Pro1204020,000
Ridge2408050,000
Ultimate24080100,000
  • The search limit is one third of the per-minute limit, rounded down, and never below 1.
  • The per-minute window resets at the start of each minute (UTC), and searches are counted apart from other reads. The daily quota covers the last 24 hours.
  • Only accepted requests count. A 401, 403 or 429 never uses quota.
  • Accepted responses carry X-RateLimit-Limit and X-RateLimit-Remaining (requests left this minute). A 429 carries Retry-After in seconds; wait that long before you retry.

MCP server

SummitScribe runs a remote MCP server so AI agents can read your meetings with the same tokens and limits as the REST API. Send POST https://summitscribe.app/api/mcp with one JSON-RPC message per request and you get one JSON reply. There are no sessions, no streaming and no batches. Supported protocol versions: 2025-11-25, 2025-06-18, 2025-03-26.

Auth is the same Authorization: Bearer ss_pat_… header. The token needs mcp:read, plus the data scope for each tool you want to use. Tools your token can’t use don’t show up in tools/list. Setup for Cursor, VS Code, Codex, Gemini and other agents is on AI agents. To add it to Claude Code:

claude mcp add --transport http summitscribe https://summitscribe.app/api/mcp \
  --header "Authorization: Bearer $SUMMITSCRIBE_TOKEN"
ToolScopeWhat it returns
whoamionly mcp:readYour SummitScribe plan, this month's recording hours, and this token's scopes and expiry.
list_meetingsmeetings:readYour meetings, newest first. Filter by folder or by created-since time. Paged with next_cursor.
get_meetingmeetings:readOne meeting's details: title, status, folder, duration and timestamps.
get_meeting_notesnotes:readThe generated notes for a meeting: summary, sections, decisions and action items.
get_transcripttranscripts:readA meeting transcript in pages of 200 speaker segments. Pass next_offset back as offset for the next page. Transcripts without segments page their plain text instead.
list_action_itemsactions:readAction items from your meetings' notes, newest meeting first. Optionally for one meeting.
list_foldersmeetings:readYour meeting folders, in your sort order.
searchsearch:readSearch across your meetings and return matching transcript and notes evidence with meeting ids and timestamps. Returns evidence, not a written answer. Has a lower rate limit than the other tools.

Every tool is read-only. Each tools/call counts against your plan’s API limits above, the same as a REST call. Setup messages (initialize, ping, tools/list and notifications) have their own allowance on every plan: 30 a minute per token and 500 a day per account, and they never use your plan’s quota. Over the setup allowance you get HTTP 429 with Retry-After and JSON-RPC error -32000. A tools/call over your plan’s limit returns a tool result with isError: true and a Retry-After header.

Versioning

/v1 only gets additions: new fields, new endpoints and new optional parameters. Ignore fields you don’t know. A breaking change would ship as /v2, with a Deprecation header on /v1 and advance notice before /v1 stops.

Questions or a bug? Email info@summitscribe.app. Use of the API is covered by the Terms of Service.