Instead of building a path lesson-by-lesson through the UI, you can author an entire path — with all its
lessons and exercises — in one YAML file and import it via POST /paths/import.
This is useful for tutors who prefer writing content in a text editor,
for bulk authoring, or for version-controlling course content in Git.
Top-level structure
| Field |
Type |
Required |
Description |
title |
string |
required |
Name of the path shown to students. |
description |
string |
required |
Short summary displayed on the path card. |
tags |
string[] |
optional |
Free-form tags used for filtering (e.g. "B1", "Grammar"). |
lessons |
Lesson[] |
required |
Ordered list of lessons. At least one lesson required. |
Lesson fields
| Field | Type | Required | Description |
title | string | required | Displayed as the lesson heading. |
description | string | optional | Short intro shown before the first exercise. |
type | lesson | exam | booking | optional | Defaults to lesson. |
exercises | Exercise[] | required | At least one exercise required. |
Exercise fields
| Field | Type | Required | Description |
title | string | required | Short label (not shown to the student). |
type | see below | required | One of the 7 exercise types. |
question | string | required | The prompt shown to the student. |
options | string[] | optional* | *Required for multiple-choice, match-pairs, reconstruct-sentence. |
correctAnswer | string | required | See format rules per type below. |
explanation | string | optional | Shown to the student after answering. |
xp | integer ≥ 0 | optional | Defaults to 10. |
youtubeUrl | string (URI) | optional | Embedded video hint. |
Exercise types & correctAnswer format
multiple-choice
options required. correctAnswer must exactly match one of the option strings.
type-sentence
question is the prompt shown to the student. correctAnswer is the full sentence they must type.
true-false
correctAnswer must be exactly true or false (lowercase string).
match-pairs
options contains the items on both sides, interleaved: [left1, right1, left2, right2, …]. correctAnswer is ignored (pairs are derived from the options order).
reconstruct-sentence
options contains the shuffled word tokens. correctAnswer is the correctly ordered sentence.
complete-sentence
correctAnswer is pipe-separated accepted tokens, e.g. variable|unknown.
pronounce-sentence
correctAnswer is the target sentence (used for display/reference, not automated grading).
Full annotated example
Copy this template, fill in your content, and POST it to /paths/import
with the header Content-Type: application/yaml.
Every one of the 7 exercise types is demonstrated below.
path-import.yaml
# ── Top level ──────────────────────────────────────────────────────────
title: Present Perfect — All Exercise Types
description: A complete demo path covering every exercise type.
tags:
- English
- B1
- Grammar
lessons:
# ══════════════════════════════════════════════════════════════════════
# 1. multiple-choice
# options: list of choices (required)
# correctAnswer: must exactly match one option string
# ══════════════════════════════════════════════════════════════════════
- title: Recognition
type: lesson
exercises:
- title: Spot the correct sentence
type: multiple-choice
question: Which sentence uses Present Perfect correctly?
options:
- I have seen that film yesterday.
- She has lived here for ten years.
- We have went to Paris last summer.
correctAnswer: She has lived here for ten years.
explanation: No past-time adverb and correct past participle "lived".
xp: 10
# ══════════════════════════════════════════════════════════════════════
# 2. type-sentence
# question: use ___ (three underscores) to mark the blank
# correctAnswer: the missing word or phrase
# ══════════════════════════════════════════════════════════════════════
- title: Time markers
type: lesson
exercises:
- title: just / already / yet
type: type-sentence
question: I have ___ finished my homework.
correctAnswer: just
explanation: "Just" indicates a recently completed action.
xp: 10
# ══════════════════════════════════════════════════════════════════════
# 3. true-false
# correctAnswer: exactly "true" or "false" (lowercase string)
# ══════════════════════════════════════════════════════════════════════
- title: Error detection
type: lesson
exercises:
- title: Correct or not?
type: true-false
question: Is this sentence correct? "She has finished the report yesterday."
correctAnswer: "false"
explanation: Present Perfect cannot be used with a specific past time (yesterday).
xp: 10
# ══════════════════════════════════════════════════════════════════════
# 4. match-pairs
# options: interleaved [left1, right1, left2, right2, ...]
# correctAnswer: ignored — pairs are derived from the options order
# ══════════════════════════════════════════════════════════════════════
- title: Vocabulary pairs
type: lesson
exercises:
- title: Match verb to past participle
type: match-pairs
question: Match each verb to its past participle.
options:
- go # left 1
- gone # right 1
- see # left 2
- seen # right 2
- eat # left 3
- eaten # right 3
- write # left 4
- written # right 4
correctAnswer: "" # unused for match-pairs
xp: 15
# ══════════════════════════════════════════════════════════════════════
# 5. reconstruct-sentence
# options: shuffled word tokens (the app will shuffle them again)
# correctAnswer: the correctly ordered sentence
# ══════════════════════════════════════════════════════════════════════
- title: Word order
type: lesson
exercises:
- title: Rebuild the sentence
type: reconstruct-sentence
question: Arrange these words into a correct sentence.
options:
- never
- I
- sushi
- have
- tried
correctAnswer: I have never tried sushi.
explanation: Adverbs like "never" go between the auxiliary and the past participle.
xp: 15
# ══════════════════════════════════════════════════════════════════════
# 6. complete-sentence
# question: the partial sentence (student selects or types missing words)
# correctAnswer: pipe-separated accepted answers, e.g. "word1|word2"
# options: (optional) word bank to choose from
# ══════════════════════════════════════════════════════════════════════
- title: Complete the gap
type: lesson
exercises:
- title: for vs. since
type: complete-sentence
question: She has worked here ___ 2019.
options:
- for
- since
- during
- from
correctAnswer: since # pipe-separate if multiple forms accepted: "since|Since"
explanation: Use "since" with a point in time, "for" with a duration.
xp: 10
# ══════════════════════════════════════════════════════════════════════
# 7. pronounce-sentence
# correctAnswer: the target sentence (display/reference only —
# pronunciation is not graded automatically)
# ══════════════════════════════════════════════════════════════════════
- title: Speaking practice
type: lesson
exercises:
- title: Say it aloud
type: pronounce-sentence
question: Record yourself saying this sentence naturally.
correctAnswer: I have already visited the Eiffel Tower twice.
explanation: Pay attention to the weak form of "have" — it sounds like "I've".
youtubeUrl: https://www.youtube.com/watch?v=dQw4w9WgXcQ
xp: 20
How to import
Terminal — curl
# Replace TOKEN with your access token from POST /auth/login
curl -X POST https://content.teacher-and-me.com/paths/import \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/yaml" \
--data-binary @path-import.yaml
The response is the created Path object with all server-assigned UUIDs.
You can immediately copy the id and use it to invite students via
POST /paths/{pathId}/invite.
Tip — version-control your paths
Store your YAML files in a Git repository alongside your teaching notes.
When you update a path, re-import it with a PATCH /paths/{pathId}
or delete-and-reimport. This gives you a full history of every course revision.