OpenAPI reference · Sources
Create a transcription (Source) from text or upload
/sourcesTwo body shapes:
type: "text"— caller supplies already-transcribed text; the row is stored withstatus: Successimmediately and the response is aSourceSingle.type: "file"— caller passes a prioruploadIdreturned byPOST /v1/uploads; the worker pulls bytes from S3, transcribes, and indexes. The response is aJobSinglewithtype: SOURCE_INGEST_FILE. PollGET /v1/jobs/{id}for completion;result.sourceIdlands onDONE.
Required scope: sources:write.
Authorization
AuthorizationstringrequiredBearer token in the Authorization header.
Pass
Authorization: Bearer scripe_sk_live_<...>(orscripe_sk_test_<...>for test keys) on every request. Keys are scoped to a single workspace and can be revoked from the Scripe dashboard.The same header also accepts an OAuth 2.1 access token (
scripe_oat_*); both credentials share one scope vocabulary and every operation below documents the scope it requires. An API key can hold every scope named on this surface exceptwebhooks:manage, which is grantable to OAuth tokens only today — the webhook-endpoint operations answer403 scope_missingto every API key. Operations that name no scope accept any valid token of the workspace.
Header parameters
Scripe-Api-VersionstringPin the API version. Format
YYYY-MM-DD. Omit to receive the currently rolling default. Unknown versions return400 version_unsupported.Idempotency-KeystringOpaque string (1–64 chars,
[A-Za-z0-9_-]) used to dedup retried writes. Within 24h of the first request, the same key- same body returns the original response (
Idempotent-Replayed: true). Same key + different body returns409 idempotency_key_conflict.
Strongly recommended for every write — see
/docs/api/v1/idempotency.- same body returns the original response (
Responses
- 200
Source created synchronously (
type: "text") or job enqueued (type: "file"). The response shape depends on which body was supplied — replayed via Idempotency-Key preserves the original shape. - 400
Malformed request (bad cursor, bad limit, etc.).
- 401
Missing, malformed, expired, or revoked API key.
- 402
Daily AI-spend cap reached for this workspace. Resets at 00:00 UTC.
- 403
Plan not eligible, scope missing, or workspace mismatch.
- 404
Resource not found in this workspace.
- 409
Idempotency-Keyreused with a different body within the 24h dedup window. Pick a fresh key or replay the original body verbatim. - 413
Request body exceeds the size cap.
- 422
Body shape was JSON but failed validation (
unprocessable). - 429
Sliding-window rate limit exceeded.
Example request
curl --request POST \
--url 'https://api.scripe.io/v1/sources' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"type": "text",
"projectId": "proj_a1b2c3d4e5f6g7h8",
"text": "string",
"name": "string"
}'Example response (200)
{
"data": {
"id": "src_a1b2c3d4e5f6g7h8",
"projectId": "string",
"status": "Done",
"name": "string",
"fileType": "string",
"durationSeconds": 0,
"createdAt": "2026-08-10T09:00:00Z",
"updatedAt": "2026-08-10T09:00:00Z",
"textPreview": "string",
"textPreviewTruncated": true,
"hasFullText": true,
"topics": [
{
"id": "tpc_a1b2c3d4e5f6g7h8",
"title": "string",
"summary": "string",
"keyTakeaways": [
null
],
"ranking": 0,
"score": 0,
"fromSeconds": 0,
"toSeconds": 0,
"hooks": [
null
]
}
]
}
}