Open Lesson Format
The Open Lesson Format is a standardized JSON schema that allows third-party content providers to publish curriculum for Lessons.church. Any organization that hosts a feed in this format can be added as an external provider, making their content browsable and playable alongside the built-in library.
How It Works
A provider hosts two types of endpoints:
- Provider Tree -- A single URL that returns the full catalog of programs, studies, lessons, and venues. Each venue includes a feed URL pointing to the detailed lesson content.
- Venue Feed -- One URL per venue, returning the full lesson content (sections, actions, and media files).
When a church adds your provider URL in Lessons.church, the platform fetches your tree to discover available content, then fetches individual venue feeds on demand.
Provider Tree
Your provider URL must return a JSON object with this structure:
{
"programs": [
{
"id": "program-1",
"name": "Gospel of Mark",
"slug": "gospel-of-mark",
"image": "https://example.com/images/mark.jpg",
"about": "A 12-week study through the Gospel of Mark.",
"studies": [
{
"id": "study-1",
"name": "The Beginning",
"slug": "the-beginning",
"image": "https://example.com/images/study1.jpg",
"lessons": [
{
"id": "lesson-1",
"name": "The Baptism of Jesus",
"slug": "baptism-of-jesus",
"title": "The Baptism of Jesus",
"image": "https://example.com/images/lesson1.jpg",
"description": "An introduction to Jesus' ministry.",
"bottomLine": "God keeps His promises.",
"verse": "Genesis 9:13 — I have set my rainbow in the clouds…",
"parentQuestion": "What is one promise God has kept in our family?",
"parentNote": "Pray together thanking God for keeping His promises.",
"venues": [
{
"id": "venue-1",
"name": "Kids",
"apiUrl": "https://example.com/feed/venues/venue-1"
},
{
"id": "venue-2",
"name": "Adults",
"apiUrl": "https://example.com/feed/venues/venue-2"
}
]
}
]
}
]
}
]
}
Tree Fields
| Field | Type | Description |
|---|---|---|
programs[].id | string | Unique program identifier |
programs[].name | string | Display name |
programs[].slug | string | URL-friendly name |
programs[].image | string | Program image URL (optional) |
programs[].about | string | Description (optional) |
studies[].id | string | Unique study identifier |
studies[].name | string | Display name |
studies[].slug | string | URL-friendly name |
studies[].image | string | Study image URL (optional) |
lessons[].id | string | Unique lesson identifier |
lessons[].name | string | Display name |
lessons[].slug | string | URL-friendly name |
lessons[].title | string | Full title |
lessons[].image | string | Lesson image URL (optional) |
lessons[].description | string | Lesson summary (optional). Catalog copy for teachers browsing the library — not parent take-home. |
lessons[].bottomLine | string | One-sentence parent take-home (optional) |
lessons[].verse | string | Memory verse reference and short text (optional) |
lessons[].parentQuestion | string | One question for parents to ask at home (optional) |
lessons[].parentNote | string | Optional extra note for parents (markdown) |
venues[].id | string | Unique venue identifier |
venues[].name | string | Venue name (e.g. "Kids", "Adults", "Youth") |
venues[].apiUrl | string | URL returning the venue feed (see below) |
The four parent take-home fields (bottomLine, verse, parentQuestion, parentNote) are optional on both the tree and the venue feed. If omitted they are treated as empty. Do not copy description into them.
Venues represent different versions of the same lesson tailored for different audiences (age groups, settings, etc.).
Venue Feed
Each venue's apiUrl must return a JSON object matching this schema:
{
"id": "venue-1",
"name": "Kids",
"lessonId": "lesson-1",
"lessonName": "The Baptism of Jesus",
"lessonImage": "https://example.com/images/lesson1.jpg",
"lessonDescription": "An introduction to Jesus' ministry.",
"bottomLine": "God keeps His promises.",
"verse": "Genesis 9:13 — I have set my rainbow in the clouds…",
"parentQuestion": "What is one promise God has kept in our family?",
"parentNote": "Pray together thanking God for keeping His promises.",
"studyName": "The Beginning",
"studySlug": "the-beginning",
"programName": "Gospel of Mark",
"programSlug": "gospel-of-mark",
"programAbout": "A 12-week study through the Gospel of Mark.",
"downloads": [],
"sections": [
{
"id": "section-1",
"name": "Opening Discussion",
"sort": 1,
"materials": "Whiteboard and markers",
"actions": [
{
"id": "action-1",
"actionType": "text",
"content": "**Key Verse:** Mark 1:9-11",
"sort": 1
},
{
"id": "action-2",
"actionType": "question",
"content": "What do you know about baptism?",
"sort": 2,
"role": "Leader"
},
{
"id": "action-3",
"actionType": "play",
"content": "Intro Video",
"sort": 3,
"files": [
{
"id": "file-1",
"name": "intro-video.mp4",
"url": "https://example.com/media/intro.mp4",
"streamUrl": "https://vimeo.com/123456789",
"fileType": "video/mp4",
"seconds": 180,
"bytes": 52428800,
"thumbnail": "https://example.com/media/intro-thumb.jpg",
"loop": false
}
]
}
]
}
]
}
Venue Feed Fields
Root Object
| Field | Type | Description |
|---|---|---|
id | string | Venue identifier |
name | string | Venue name |
lessonId | string | Lesson identifier |
lessonName | string | Lesson display name |
lessonImage | string | Lesson image URL |
lessonDescription | string | Lesson summary (catalog copy) |
bottomLine | string | One-sentence parent take-home (optional) |
verse | string | Memory verse reference and short text (optional) |
parentQuestion | string | One question for parents to ask at home (optional) |
parentNote | string | Optional extra note for parents, markdown (optional) |
studyName | string | Parent study name |
studySlug | string | Parent study slug |
programName | string | Parent program name |
programSlug | string | Parent program slug |
programAbout | string | Program description |
downloads | array | Downloadable file bundles |
sections | array | Ordered lesson sections |
Section
| Field | Type | Description |
|---|---|---|
id | string | Section identifier |
name | string | Section title |
sort | number | Display order |
materials | string | Materials or preparation notes (optional) |
actions | array | Ordered actions within this section |
Action
| Field | Type | Description |
|---|---|---|
id | string | Action identifier |
actionType | string | One of: play, text, question, quote, subhead |
content | string | Text content or media label |
sort | number | Display order |
role | string | Role name, e.g. "Leader", "Kids" (optional) |
roleId | string | Role identifier (optional) |
files | array | Media files for play actions (optional) |
File
| Field | Type | Description |
|---|---|---|
id | string | File identifier |
name | string | File name |
url | string | Direct download URL |
streamUrl | string | Streaming URL, e.g. Vimeo link (optional) |
fileType | string | MIME type (e.g. video/mp4, image/jpeg) |
seconds | number | Duration in seconds for audio/video (optional) |
bytes | number | File size in bytes (optional) |
thumbnail | string | Thumbnail image URL (optional) |
loop | boolean | Whether media should loop (optional, default false) |
Download
| Field | Type | Description |
|---|---|---|
name | string | Download bundle name (e.g. "Printable Materials") |
files | array | Files in this download bundle (same fields as File above) |
Action Types
| Type | Purpose |
|---|---|
play | Media playback -- video, audio, or slideshow. Must include files. |
text | Static text content. Supports markdown-style bold (**text**). |
question | Discussion or reflection question for the audience. |
quote | A highlighted quote or Scripture passage. |
subhead | A heading or divider within a section. |
To see a working example of the feed in action, you can view the built-in Lessons.church content tree at https://api.lessons.church/lessons/public/tree and fetch any venue feed URL from it.