Skip to content
FolioSign inStart your trial

API reference

Teachings

Add recordings, watch them process and read the transcript. A teaching is one sermon or talk.

GET/v1/teachings

List teachings#

Lists the church's teachings, newest first, with where each one is in processing. Unlike notes and outputs, keys see teachings in every status, so you can watch an upload progress.

Filter with status (comma separated) or search titles, speakers and series with q. Pages follow the standard cursor rules; meta.total is the number of matching teachings.

Auth. A church API key. Needs the teachings:read scope, or a wildcard that includes it (machine:read, machine:*, * on a partner key). A partner key can call it for a customer church by sending X-Folio-Church.

Limits. Responses carry RateLimit-Limit and RateLimit-Remaining; a 429 carries Retry-After.

Auth
Church API key
Scope
teachings:read
Operation id
machineListTeachings

Parameters

Parameters
NameInDescription
limitqueryItems per page. (integer, e.g. 25)
cursorqueryOpaque cursor from meta.next_cursor of the previous page. (string)
statusqueryComma separated: ready, failed, queued, processing (everything still working) or awaiting_upload. (string, e.g. ready)
qqueryWords to look for in titles, speakers and series. (string)
X-Folio-ChurchheaderPartner keys only: run this call as one of your customer churches (its org_ id or slug). The church must be one of yours, the key must be allowed to act for it, and plan checks run against that church. (string, e.g. org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)

Responses

Response data fields
FieldTypeDescription
created_atstring (date-time)When the teaching was added.
duration_secondsinteger (int32)The spoken length in seconds. Zero until the recording is read.
failure_reasonstringA short, plain reason when status is failed. Empty otherwise.
idstringThe teaching id, prefixed tch_.
note_idstringThe note written from it, prefixed note_. Null until a note exists.
note_statusstringThe status of that note: none, draft, in_review, approved, published, failed or superseded.
objectenum: teachingAlways teaching.
passagestringThe main passage, as a reference such as Romans 8:28-39. Empty until known.
recorded_atstring (date-time)When the teaching was given, when known.
seriesstringThe series it belongs to. Empty when it is not part of one.
speakerstringWho taught it. Empty until known.
statusstringWhere the teaching is: awaiting_upload, queued, processing, ready or failed. Only ready teachings have a transcript and a note.
titlestringThe teaching title.
200 Success. List teachings.
200 example
{
  "status": true,
  "message": "teachings",
  "data": [
    {
      "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "object": "teaching",
      "title": "Sunday, 1 November: Nothing can separate us",
      "speaker": "Pastor Ade",
      "series": "Romans 8",
      "passage": "Romans 8:31-39",
      "status": "ready",
      "failure_reason": "",
      "duration_seconds": 2412,
      "recorded_at": "2026-11-01T09:00:00Z",
      "created_at": "2026-11-01T10:02:11Z",
      "note_id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "note_status": "published"
    }
  ],
  "meta": {
    "request_id": "req_b337770ecebe03b03a88a8998b59263d",
    "has_next": false,
    "has_prev": false
  }
}
400 The request could not be read.
400 example
{
  "status": false,
  "message": "the page cursor is not valid",
  "error": {
    "code": "invalid_argument",
    "status": 400,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
401 The key or session is missing, invalid or expired.
401 example
{
  "status": false,
  "message": "That API key is not valid or has expired.",
  "error": {
    "code": "unauthenticated",
    "status": 401,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
403 The credential lacks the scope, the church is suspended, the feature is not in the plan, or the address is not allowed.
403 example
{
  "status": false,
  "message": "That API key does not have the required scope.",
  "error": {
    "code": "permission_denied",
    "status": 403,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
404 The resource is not in this church.
404 example
{
  "status": false,
  "message": "That item is not in this church.",
  "error": {
    "code": "not_found",
    "status": 404,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
409 Conflict, including a duplicate Idempotency-Key still being processed.
409 example
{
  "status": false,
  "message": "A request with this Idempotency-Key is still running.",
  "error": {
    "code": "conflict",
    "status": 409,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
422 A field failed validation, or an Idempotency-Key was reused with a different body.
422 example
{
  "status": false,
  "message": "A field is not valid.",
  "error": {
    "code": "validation",
    "status": 422,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
429 Rate limited. Wait Retry-After seconds.
429 example
{
  "status": false,
  "message": "Too many requests. Wait before trying again.",
  "error": {
    "code": "rate_limited",
    "status": 429,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
500 Something went wrong. Quote error.request_id.
500 example
{
  "status": false,
  "message": "Something went wrong. Quote the request id to support.",
  "error": {
    "code": "internal",
    "status": 500,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}

Code samples

curl -X GET "$FOLIO_API_URL/v1/teachings?limit=25&status=ready" \
  -H "Authorization: Bearer $FOLIO_API_KEY"

POST/v1/teachings

Create a teaching and get an upload URL#

Starts a teaching and returns a one-time upload ticket. This is step one of adding a recording.

  1. Call this with the title, file name and media type. The response holds url and key.
  2. PUT the recording to url with the same Content-Type. The URL is signed and expires at expires_at.
  3. Call POST /v1/teachings/{teaching}/upload with key to start processing.
  4. Poll GET /v1/teachings/{teaching} until status is ready, or subscribe to teaching.ready webhooks.

Only audio and video are accepted. A teaching you never complete stays in awaiting_upload. Send an Idempotency-Key so a retry does not create a second teaching.

Auth. A church API key. Needs the media:upload scope, or a wildcard that includes it (machine:*, * on a partner key). A partner key can call it for a customer church by sending X-Folio-Church.

Plan. Needs the API feature and enough transcription hours left in the plan. A plan with no hours left answers 402 quota_exceeded. Sandbox churches hold at most 20 teachings and answer 402 when the cap or the test AI budget is reached.

Limits. Responses carry RateLimit-Limit and RateLimit-Remaining; a 429 carries Retry-After.

Auth
Church API key
Scope
media:upload
Plan
Needs the API feature and enough transcription hours left in the plan. A plan with no hours left answers 402 quota_exceeded. Sandbox churches hold at most 20 teachings and answer 402 when the cap or the test AI budget is reached.
Operation id
machineCreateTeaching

Parameters

Parameters
NameInDescription
Idempotency-KeyheaderMakes a retry safe. The same key with the same body replays the first response for 24 hours; the same key with a different body returns 422; a duplicate that is still running returns 409 with Retry-After. Responses that carry a one-time secret are not replayed. (string, e.g. sunday-2026-11-01-upload)
X-Folio-ChurchheaderPartner keys only: run this call as one of your customer churches (its org_ id or slug). The church must be one of yours, the key must be allowed to act for it, and plan checks run against that church. (string, e.g. org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)

Request body

Request body fields
FieldTypeDescription
content_typestringThe media type of the recording, such as audio/mpeg.
filenamestringThe file name of the recording, used to keep the extension.
titlestringThe title.
Example request body
{
  "title": "Sunday, 1 November: Nothing can separate us",
  "filename": "sunday.mp3",
  "content_type": "audio/mpeg"
}

Responses

200 Success. Create a teaching and get an upload URL.
200 example
{
  "status": true,
  "message": "upload ready",
  "data": {
    "object": "upload",
    "teaching": {
      "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "object": "teaching",
      "name": "Sunday, 1 November: Nothing can separate us"
    },
    "key": "originals/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9099/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012/sunday.mp3",
    "url": "https://files.example.org/originals/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9099/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012/sunday.mp3?X-Signature=abc123",
    "expires_at": "2026-11-01T10:15:00Z"
  }
}
400 The request could not be read.
400 example
{
  "status": false,
  "message": "the page cursor is not valid",
  "error": {
    "code": "invalid_argument",
    "status": 400,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
401 The key or session is missing, invalid or expired.
401 example
{
  "status": false,
  "message": "That API key is not valid or has expired.",
  "error": {
    "code": "unauthenticated",
    "status": 401,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
402 The plan's hours are used up, or a sandbox church reached its cap.
402 example
{
  "status": false,
  "message": "This church has used all of its transcription hours for this cycle.",
  "error": {
    "code": "quota_exceeded",
    "status": 402,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
403 The plan does not include the API, or the key lacks media:upload.
403 example
{
  "status": false,
  "message": "The API is not part of this church's plan.",
  "error": {
    "code": "not_entitled",
    "status": 403,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
404 The resource is not in this church.
404 example
{
  "status": false,
  "message": "That item is not in this church.",
  "error": {
    "code": "not_found",
    "status": 404,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
409 Conflict, including a duplicate Idempotency-Key still being processed.
409 example
{
  "status": false,
  "message": "A request with this Idempotency-Key is still running.",
  "error": {
    "code": "conflict",
    "status": 409,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
422 The content type is not audio or video, or a field is invalid.
422 example
{
  "status": false,
  "message": "Choose an audio or video recording. That file type is not supported.",
  "error": {
    "code": "validation",
    "status": 422,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
429 Rate limited. Wait Retry-After seconds.
429 example
{
  "status": false,
  "message": "Too many requests. Wait before trying again.",
  "error": {
    "code": "rate_limited",
    "status": 429,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
500 Something went wrong. Quote error.request_id.
500 example
{
  "status": false,
  "message": "Something went wrong. Quote the request id to support.",
  "error": {
    "code": "internal",
    "status": 500,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}

Code samples

curl -X POST "$FOLIO_API_URL/v1/teachings" \
  -H "Authorization: Bearer $FOLIO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: sunday-2026-11-01-create" \
  -d '{
  "title": "Sunday, 1 November: Nothing can separate us",
  "filename": "sunday.mp3",
  "content_type": "audio/mpeg"
}'

GET/v1/teachings/{teaching}

Read a teaching#

Returns one teaching. This is the call to poll after you complete an upload. status moves awaiting_upload, queued, processing, then ready or failed; when it is failed, failure_reason says why in plain words.

Polling every few seconds is fine. Webhooks (teaching.ready, teaching.failed) save the polling.

Auth. A church API key. Needs the teachings:read scope, or a wildcard that includes it (machine:read, machine:*, * on a partner key). A partner key can call it for a customer church by sending X-Folio-Church.

Limits. Responses carry RateLimit-Limit and RateLimit-Remaining; a 429 carries Retry-After.

Auth
Church API key
Scope
teachings:read
Operation id
machineGetTeaching

Parameters

Parameters
NameInDescription
teaching requiredpathThe teaching id, prefixed tch_. (string, e.g. tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)
X-Folio-ChurchheaderPartner keys only: run this call as one of your customer churches (its org_ id or slug). The church must be one of yours, the key must be allowed to act for it, and plan checks run against that church. (string, e.g. org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)

Responses

Response data fields
FieldTypeDescription
created_atstring (date-time)When the teaching was added.
duration_secondsinteger (int32)The spoken length in seconds. Zero until the recording is read.
failure_reasonstringA short, plain reason when status is failed. Empty otherwise.
idstringThe teaching id, prefixed tch_.
note_idstringThe note written from it, prefixed note_. Null until a note exists.
note_statusstringThe status of that note: none, draft, in_review, approved, published, failed or superseded.
objectenum: teachingAlways teaching.
passagestringThe main passage, as a reference such as Romans 8:28-39. Empty until known.
recorded_atstring (date-time)When the teaching was given, when known.
seriesstringThe series it belongs to. Empty when it is not part of one.
speakerstringWho taught it. Empty until known.
statusstringWhere the teaching is: awaiting_upload, queued, processing, ready or failed. Only ready teachings have a transcript and a note.
titlestringThe teaching title.
200 Success. Read a teaching.
200 example
{
  "status": true,
  "message": "teaching",
  "data": {
    "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
    "object": "teaching",
    "title": "Sunday, 1 November: Nothing can separate us",
    "speaker": "Pastor Ade",
    "series": "Romans 8",
    "passage": "Romans 8:31-39",
    "status": "processing",
    "failure_reason": "",
    "duration_seconds": 2412,
    "recorded_at": null,
    "created_at": "2026-11-01T10:02:11Z",
    "note_id": null,
    "note_status": "none"
  }
}
400 The request could not be read.
400 example
{
  "status": false,
  "message": "the page cursor is not valid",
  "error": {
    "code": "invalid_argument",
    "status": 400,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
401 The key or session is missing, invalid or expired.
401 example
{
  "status": false,
  "message": "That API key is not valid or has expired.",
  "error": {
    "code": "unauthenticated",
    "status": 401,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
403 The credential lacks the scope, the church is suspended, the feature is not in the plan, or the address is not allowed.
403 example
{
  "status": false,
  "message": "That API key does not have the required scope.",
  "error": {
    "code": "permission_denied",
    "status": 403,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
404 The resource is not in this church.
404 example
{
  "status": false,
  "message": "That item is not in this church.",
  "error": {
    "code": "not_found",
    "status": 404,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
409 Conflict, including a duplicate Idempotency-Key still being processed.
409 example
{
  "status": false,
  "message": "A request with this Idempotency-Key is still running.",
  "error": {
    "code": "conflict",
    "status": 409,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
422 A field failed validation, or an Idempotency-Key was reused with a different body.
422 example
{
  "status": false,
  "message": "A field is not valid.",
  "error": {
    "code": "validation",
    "status": 422,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
429 Rate limited. Wait Retry-After seconds.
429 example
{
  "status": false,
  "message": "Too many requests. Wait before trying again.",
  "error": {
    "code": "rate_limited",
    "status": 429,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
500 Something went wrong. Quote error.request_id.
500 example
{
  "status": false,
  "message": "Something went wrong. Quote the request id to support.",
  "error": {
    "code": "internal",
    "status": 500,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}

Code samples

curl -X GET "$FOLIO_API_URL/v1/teachings/tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012" \
  -H "Authorization: Bearer $FOLIO_API_KEY"

GET/v1/teachings/{teaching}/transcript

Read the transcript#

Returns the transcript as time-coded segments. The teaching must be ready; before that the call answers 404 with a message that says so. Times are milliseconds from the start of the recording. Join the text of the segments in order for the full text.

Auth. A church API key. Needs the teachings:read scope, or a wildcard that includes it (machine:read, machine:*, * on a partner key). A partner key can call it for a customer church by sending X-Folio-Church.

Limits. Responses carry RateLimit-Limit and RateLimit-Remaining; a 429 carries Retry-After.

Auth
Church API key
Scope
teachings:read
Operation id
machineGetTranscript

Parameters

Parameters
NameInDescription
teaching requiredpathThe teaching id, prefixed tch_. (string, e.g. tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)
X-Folio-ChurchheaderPartner keys only: run this call as one of your customer churches (its org_ id or slug). The church must be one of yours, the key must be allowed to act for it, and plan checks run against that church. (string, e.g. org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)

Responses

Response data fields
FieldTypeDescription
end_msinteger (int64)Where the segment ends, in milliseconds.
objectenum: segmentAlways segment.
speakerstringThe speaker label, when the recording was split by speaker.
start_msinteger (int64)Where the segment starts, in milliseconds from the start of the recording.
textstringWhat was said.
200 Success. Read the transcript.
200 example
{
  "status": true,
  "message": "segments",
  "data": [
    {
      "object": "segment",
      "start_ms": 0,
      "end_ms": 6400,
      "speaker": "Speaker 1",
      "text": "Good morning, church. Open your Bibles to Romans chapter eight."
    },
    {
      "object": "segment",
      "start_ms": 6400,
      "end_ms": 13950,
      "speaker": "Speaker 1",
      "text": "Paul asks who can separate us from the love of Christ."
    }
  ],
  "meta": {
    "request_id": "req_b337770ecebe03b03a88a8998b59263d",
    "has_next": false,
    "has_prev": false
  }
}
400 The request could not be read.
400 example
{
  "status": false,
  "message": "the page cursor is not valid",
  "error": {
    "code": "invalid_argument",
    "status": 400,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
401 The key or session is missing, invalid or expired.
401 example
{
  "status": false,
  "message": "That API key is not valid or has expired.",
  "error": {
    "code": "unauthenticated",
    "status": 401,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
403 The credential lacks the scope, the church is suspended, the feature is not in the plan, or the address is not allowed.
403 example
{
  "status": false,
  "message": "That API key does not have the required scope.",
  "error": {
    "code": "permission_denied",
    "status": 403,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
404 The resource is not in this church.
404 example
{
  "status": false,
  "message": "That item is not in this church.",
  "error": {
    "code": "not_found",
    "status": 404,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
409 Conflict, including a duplicate Idempotency-Key still being processed.
409 example
{
  "status": false,
  "message": "A request with this Idempotency-Key is still running.",
  "error": {
    "code": "conflict",
    "status": 409,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
422 A field failed validation, or an Idempotency-Key was reused with a different body.
422 example
{
  "status": false,
  "message": "A field is not valid.",
  "error": {
    "code": "validation",
    "status": 422,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
429 Rate limited. Wait Retry-After seconds.
429 example
{
  "status": false,
  "message": "Too many requests. Wait before trying again.",
  "error": {
    "code": "rate_limited",
    "status": 429,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
500 Something went wrong. Quote error.request_id.
500 example
{
  "status": false,
  "message": "Something went wrong. Quote the request id to support.",
  "error": {
    "code": "internal",
    "status": 500,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}

Code samples

curl -X GET "$FOLIO_API_URL/v1/teachings/tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012/transcript" \
  -H "Authorization: Bearer $FOLIO_API_KEY"

POST/v1/teachings/{teaching}/upload

Finish an upload and start processing#

Tells Folio the recording is in storage so it can be transcribed and written up. Send the key you got when you created the teaching.

Call it once. A second call answers 409 because the upload was already received. A file that never reached storage, or an empty file, answers 422; upload again and retry. Processing is asynchronous: the teaching moves through queued and processing to ready or failed.

Auth. A church API key. Needs the media:upload scope, or a wildcard that includes it (machine:*, * on a partner key). A partner key can call it for a customer church by sending X-Folio-Church.

Limits. Responses carry RateLimit-Limit and RateLimit-Remaining; a 429 carries Retry-After.

Auth
Church API key
Scope
media:upload
Operation id
machineCompleteUpload

Parameters

Parameters
NameInDescription
teaching requiredpathThe teaching id, such as tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012. (string, e.g. tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)
Idempotency-KeyheaderMakes a retry safe. The same key with the same body replays the first response for 24 hours; the same key with a different body returns 422; a duplicate that is still running returns 409 with Retry-After. Responses that carry a one-time secret are not replayed. (string, e.g. sunday-2026-11-01-upload)
X-Folio-ChurchheaderPartner keys only: run this call as one of your customer churches (its org_ id or slug). The church must be one of yours, the key must be allowed to act for it, and plan checks run against that church. (string, e.g. org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012)

Request body

Request body fields
FieldTypeDescription
keystringThe key.
Example request body
{
  "key": "originals/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9099/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012/sunday.mp3"
}

Responses

200 Success. Finish an upload and start processing.
200 example
{
  "status": true,
  "message": "upload received",
  "data": {
    "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
    "object": "teaching",
    "name": ""
  }
}
400 The request could not be read.
400 example
{
  "status": false,
  "message": "the page cursor is not valid",
  "error": {
    "code": "invalid_argument",
    "status": 400,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
401 The key or session is missing, invalid or expired.
401 example
{
  "status": false,
  "message": "That API key is not valid or has expired.",
  "error": {
    "code": "unauthenticated",
    "status": 401,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
403 The credential lacks the scope, the church is suspended, the feature is not in the plan, or the address is not allowed.
403 example
{
  "status": false,
  "message": "That API key does not have the required scope.",
  "error": {
    "code": "permission_denied",
    "status": 403,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
404 The resource is not in this church.
404 example
{
  "status": false,
  "message": "That item is not in this church.",
  "error": {
    "code": "not_found",
    "status": 404,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
409 The upload was already received.
409 example
{
  "status": false,
  "message": "This upload was already received.",
  "error": {
    "code": "conflict",
    "status": 409,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
422 The file is empty or did not reach storage.
422 example
{
  "status": false,
  "message": "The file did not reach storage. Upload it again.",
  "error": {
    "code": "validation",
    "status": 422,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
429 Rate limited. Wait Retry-After seconds.
429 example
{
  "status": false,
  "message": "Too many requests. Wait before trying again.",
  "error": {
    "code": "rate_limited",
    "status": 429,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}
500 Something went wrong. Quote error.request_id.
500 example
{
  "status": false,
  "message": "Something went wrong. Quote the request id to support.",
  "error": {
    "code": "internal",
    "status": 500,
    "request_id": "req_b337770ecebe03b03a88a8998b59263d"
  }
}

Code samples

curl -X POST "$FOLIO_API_URL/v1/teachings/tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012/upload" \
  -H "Authorization: Bearer $FOLIO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: sunday-2026-11-01-complete" \
  -d '{
  "key": "originals/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9099/0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012/sunday.mp3"
}'

Verified against API version 0.0.0-dev. Generated from the live OpenAPI document.