Skip to content
FolioSign inStart your trial

API reference

Published content

Published notes, verses and series for a church, readable without a key.

GET/v1/public/churches

List churches that publish#

Lists the slugs of churches with published content, for site builders and sitemaps. Read a church's content with the other /v1/public/{church} routes.

Auth. None. This route is public.

Auth
No key
Operation id
publicChurches

Responses

200 Success. List churches that publish.
200 example
{
  "status": true,
  "message": "churches",
  "data": [
    {
      "object": "church",
      "slug": "grace-chapel"
    }
  ],
  "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"
  }
}
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"
  }
}
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/public/churches"

GET/v1/public/{church}/notes/{slug}

Read a published note#

A published note as the church's public site shows it: sections, verses and questions. Responses are cacheable; send If-None-Match to revalidate. payload.approval_kind says whether a person (human) or the church's automatic approval approved it. 410 means it was published once and has since been retracted.

Auth. None. This route is public.

Auth
No key
Operation id
publicNote

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
slug requiredpathThe slug from the share URL. (string, e.g. love-that-waits)

Responses

200 Success. Read a published note.
200 example
{
  "status": true,
  "message": "share",
  "data": {
    "object": "share",
    "church": "grace-chapel",
    "kind": "note",
    "slug": "nothing-can-separate-us",
    "title": "Nothing can separate us",
    "summary": "Nothing in all creation can separate us from the love of God in Christ.",
    "payload": {
      "approval_kind": "human",
      "translation": "KJV",
      "subtitle": "Sunday note · Romans 8",
      "reading_minutes": 6,
      "standing": "current",
      "source": {
        "speaker": "Pastor Ade",
        "date": "1 Nov 2026",
        "duration": "40:12"
      },
      "sections": [
        {
          "id": "who-can-condemn",
          "heading": "Who can condemn?",
          "ref": "Romans 8:34",
          "blocks": [
            {
              "type": "p",
              "text": "Paul answers with Christ's death, resurrection and intercession."
            }
          ]
        }
      ],
      "questions": [
        "What are you holding on to this week?"
      ]
    },
    "published_at": "2026-11-01T12:31:00Z",
    "updated_at": "2026-11-01T12:31:00Z",
    "indexable": true,
    "unlisted": 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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/notes/love-that-waits"

GET/v1/public/{church}/notes/{slug}/booklet

Download a note's booklet#

The printable booklet of a published note, as a PDF. 404 when the church has not enabled booklets for the note.

Auth. None. This route is public.

Auth
No key
Operation id
publicNoteBooklet

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
slug requiredpathThe slug from the share URL. (string, e.g. love-that-waits)

Responses

200 Success. Download a note's booklet.
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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/notes/love-that-waits/booklet"

GET/v1/public/{church}/notes/{slug}/pdf

Download a note as PDF#

A published note as a PDF file, laid out for printing or sharing. The response is binary with the content type application/pdf. Responses are cacheable: send If-None-Match with the last ETag to revalidate. Anything that is not published answers 404.

Auth. None. This route is public.

Auth
No key
Operation id
publicNotePDF

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
slug requiredpathThe slug from the share URL. (string, e.g. love-that-waits)

Responses

200 Success. Download a note as PDF.
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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/notes/love-that-waits/pdf"

GET/v1/public/{church}/s/{alias}

Read a published share by short alias#

Resolves the short alias used in shared links and returns the share it points to.

Auth. None. This route is public.

Auth
No key
Operation id
publicShareAlias

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
alias requiredpathThe short alias from the share link. (string, e.g. x7k2q)

Responses

200 Success. Read a published share by short alias.
200 example
{
  "status": true,
  "message": "share",
  "data": {
    "object": "share",
    "church": "grace-chapel",
    "kind": "note",
    "slug": "nothing-can-separate-us",
    "title": "Nothing can separate us",
    "summary": "Nothing in all creation can separate us from the love of God in Christ.",
    "payload": {
      "approval_kind": "human",
      "translation": "KJV",
      "subtitle": "Sunday note · Romans 8",
      "reading_minutes": 6,
      "standing": "current",
      "source": {
        "speaker": "Pastor Ade",
        "date": "1 Nov 2026",
        "duration": "40:12"
      },
      "sections": [
        {
          "id": "who-can-condemn",
          "heading": "Who can condemn?",
          "ref": "Romans 8:34",
          "blocks": [
            {
              "type": "p",
              "text": "Paul answers with Christ's death, resurrection and intercession."
            }
          ]
        }
      ],
      "questions": [
        "What are you holding on to this week?"
      ]
    },
    "published_at": "2026-11-01T12:31:00Z",
    "updated_at": "2026-11-01T12:31:00Z",
    "indexable": true,
    "unlisted": 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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/s/x7k2q"

GET/v1/public/{church}/series/{slug}

Read a published series#

A series with its weeks and the published note for each.

Auth. None. This route is public.

Auth
No key
Operation id
publicSeries

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
slug requiredpathThe slug from the share URL. (string, e.g. love-that-waits)

Responses

200 Success. Read a published series.
200 example
{
  "status": true,
  "message": "share",
  "data": {
    "object": "share",
    "church": "grace-chapel",
    "kind": "series",
    "slug": "romans-8",
    "title": "Romans 8",
    "summary": "Six weeks in Romans 8.",
    "payload": {
      "weeks": [
        {
          "number": 1,
          "title": "Nothing can separate us",
          "ref": "Romans 8:31-39",
          "state": "read"
        }
      ]
    },
    "published_at": "2026-11-01T12:31:00Z",
    "indexable": true,
    "unlisted": 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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/series/love-that-waits"

GET/v1/public/{church}/shares

List everything a church has published#

Lists published notes, verses, series and answers for a church, newest first, for feeds and sitemaps. limit goes up to 1000 here. Entries carry no payload; read each with its own route.

Auth. None. This route is public.

Auth
No key
Operation id
publicChurchShares

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
limitqueryHow many items to return, from 1 to 100. (integer, e.g. 200)
cursorqueryThe opaque meta.next_cursor from the previous page. (string)

Responses

200 Success. List everything a church has published.
200 example
{
  "status": true,
  "message": "shares",
  "data": [
    {
      "object": "share",
      "kind": "note",
      "slug": "nothing-can-separate-us",
      "title": "Nothing can separate us",
      "summary": "Nothing in all creation can separate us from the love of God in Christ.",
      "indexable": true,
      "published_at": "2026-11-01T12:31:00Z",
      "updated_at": "2026-11-01T12:31:00Z"
    }
  ],
  "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"
  }
}
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"
  }
}
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/public/grace-chapel/shares?limit=200"

GET/v1/public/{church}/shares/{kind}/{slug}

Read a published share by kind and slug#

Reads any published share by kind (note, verse, answer, series or subscribe) and slug. 410 means it was retracted.

Auth. None. This route is public.

Auth
No key
Operation id
publicShare

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
kind requiredpathThe object kind: song, theme, service_plan or service_record. (string, e.g. note)
slug requiredpathThe slug from the share URL. (string, e.g. love-that-waits)

Responses

200 Success. Read a published share by kind and slug.
200 example
{
  "status": true,
  "message": "share",
  "data": {
    "object": "share",
    "church": "grace-chapel",
    "kind": "note",
    "slug": "nothing-can-separate-us",
    "title": "Nothing can separate us",
    "summary": "Nothing in all creation can separate us from the love of God in Christ.",
    "payload": {
      "approval_kind": "human",
      "translation": "KJV",
      "subtitle": "Sunday note · Romans 8",
      "reading_minutes": 6,
      "standing": "current",
      "source": {
        "speaker": "Pastor Ade",
        "date": "1 Nov 2026",
        "duration": "40:12"
      },
      "sections": [
        {
          "id": "who-can-condemn",
          "heading": "Who can condemn?",
          "ref": "Romans 8:34",
          "blocks": [
            {
              "type": "p",
              "text": "Paul answers with Christ's death, resurrection and intercession."
            }
          ]
        }
      ],
      "questions": [
        "What are you holding on to this week?"
      ]
    },
    "published_at": "2026-11-01T12:31:00Z",
    "updated_at": "2026-11-01T12:31:00Z",
    "indexable": true,
    "unlisted": 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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/shares/song/love-that-waits"

GET/v1/public/{church}/theme

Read a church's public theme#

The church's name, brand colours and logo, so an embedded page can match the church.

Auth. None. This route is public.

Auth
No key
Operation id
publicTheme

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)

Responses

200 Success. Read a church's public theme.
200 example
{
  "status": true,
  "message": "theme",
  "data": {
    "object": "theme",
    "church": "grace-chapel",
    "name": "Grace Chapel",
    "brand": "#1f4b99",
    "brand_accent": "#d4a017",
    "logo_url": "https://api.folio.example/v1/public/grace-chapel/logo/3f9a0c1d5b7e2a4c6d8f0a1b3c5d7e9f1a3b5c7d9e0f2a4b6c8d0e1f3a5b7c9d/512.png",
    "logo_sizes": {
      "32": "https://api.folio.example/v1/public/grace-chapel/logo/3f9a0c1d5b7e2a4c6d8f0a1b3c5d7e9f1a3b5c7d9e0f2a4b6c8d0e1f3a5b7c9d/32.png",
      "128": "https://api.folio.example/v1/public/grace-chapel/logo/3f9a0c1d5b7e2a4c6d8f0a1b3c5d7e9f1a3b5c7d9e0f2a4b6c8d0e1f3a5b7c9d/128.png",
      "512": "https://api.folio.example/v1/public/grace-chapel/logo/3f9a0c1d5b7e2a4c6d8f0a1b3c5d7e9f1a3b5c7d9e0f2a4b6c8d0e1f3a5b7c9d/512.png"
    }
  }
}
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"
  }
}
404 The church does not publish.
404 example
{
  "status": false,
  "message": "That church is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/theme"

GET/v1/public/{church}/verses/{slug}

Read a published verse page#

A verse or passage page: the King James Version text, how often the church has taught it and by whom, and where its teaching on the passage has changed over time. Scripture is King James Version only.

Auth. None. This route is public.

Auth
No key
Operation id
publicVerse

Parameters

Parameters
NameInDescription
If-None-MatchheaderThe ETag of the copy you already hold. If it is current the answer is 304 with no body. (string)
church requiredpathThe church slug, such as grace-chapel. For partner routes, the customer church id (org_) or slug. (string, e.g. grace-chapel)
slug requiredpathThe slug from the share URL. (string, e.g. love-that-waits)

Responses

200 Success. Read a published verse page.
200 example
{
  "status": true,
  "message": "share",
  "data": {
    "object": "share",
    "church": "grace-chapel",
    "kind": "verse",
    "slug": "romans-8-28",
    "title": "Romans 8:28",
    "summary": "God works good through the waiting.",
    "payload": {
      "reference": "Romans 8:28",
      "translation": "KJV",
      "text": "And we know that all things work together for good to them that love God, to them who are the called according to his purpose.",
      "taught": {
        "times": 4,
        "preachers": 2,
        "years": 3
      },
      "teachings": [],
      "chapter": {
        "verses": []
      }
    },
    "published_at": "2026-11-01T12:31:00Z",
    "indexable": true,
    "unlisted": 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"
  }
}
404 Nothing is published at that address.
404 example
{
  "status": false,
  "message": "That share is not available.",
  "error": {
    "code": "not_found",
    "status": 404,
    "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"
  }
}
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/public/grace-chapel/verses/love-that-waits"

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