Skip to content

A ready-made clip sequence

GET/v1/feed

Returns a shuffled sequence of clips for a level, with one suggested focus word per clip. Use it when you want a scrollable feed without building your own selection logic.

The ordering is random per request. Pass a seed to make it reproducible, which is what pagination needs: the same seed with the returned nextCursor continues the same shuffle instead of reshuffling.

The feed carries no per-user state. Vocaflare does not know your users, so watch history, spaced repetition and personalisation stay on your side; the exclude parameter is how you feed that back in.

Parameters

NameInTypeDefaultRequiredDescription
languagequerystringennoLanguage of the clips, as a two-letter code. Only languages listed by /corpus return results.
glossqueryen | es | ja | pt | ru | tr | zhennoLanguage for word meanings in the response. Falls back to English when a meaning is missing in the requested language.
levelqueryA1 | A2 | B1 | B2 | C1 | C2noTarget CEFR level. The focus word is picked one step above it, which is where a learner gains the most; the clips themselves are not filtered by level, because every clip in the corpus contains words from several levels.
excludequerystringnoClip ids or video ids to leave out, comma separated. Up to 50.
seedquerystringnoMakes the shuffle reproducible. Required for stable pagination.
limitqueryinteger20noItems per page.
cursorquerystringnoThe nextCursor of the previous page. Opaque; do not construct it yourself.

Response

FieldTypeDescription
seedstringThe seed used. Echoed back when you did not send one, so the next page can reuse it.
itemsobject[]
items[].clipobject
items[].clip.clipIdstring (uuid)Stable Vocaflare id for the clip.
items[].clip.videoIdstringYouTube video id, for the embed.
items[].clip.titlestring
items[].clip.languagestring
items[].clip.levelA1 | A2 | B1 | B2 | C1 | C2CEFR level assigned during screening.
items[].clip.durationSintegerClip length in seconds. The corpus holds clips up to 180 s.
items[].clip.channelobject
items[].clip.embedUrlstringReady-to-use embed URL. Playback happens in the caller's player.
items[].clip.watchUrlstringCanonical watch URL, for the required attribution link.
items[].focusWordobjectThe word worth teaching in this clip at the requested level. Null when the clip has none in band.
items[].focusWord.wordstring
items[].focusWord.wordIdinteger
items[].focusWord.levelA1 | A2 | B1 | B2 | C1 | C2CEFR level assigned during screening.
items[].focusWord.meaningstring
items[].focusWord.tStartnumber
nextCursorstring

Errors

StatusCodeWhen
401invalid_keyThe key is missing, unknown or disabled.
429rate_limitedToo many requests, or the plan quota is spent. Retry-After carries the wait in seconds.

Example

bash
curl https://clips.vocaflare.com/v1/feed \
  -H "Authorization: Bearer $VOCAFLARE_API_KEY"
json
{
  "seed": "6f1c2d",
  "items": [
    {
      "clip": {
        "clipId": "0f2a6c1e-88d7-4f0a-9f0b-1b7a2c3d4e5f",
        "videoId": "FinOIdu21XA",
        "title": "How to sound natural when you say 'receive'",
        "language": "en",
        "level": "B1",
        "durationS": 47,
        "channel": {
          "id": "UCxxxxxxxxxxxxxxxxxxxxxx",
          "name": "BBC Learning English"
        },
        "embedUrl": "https://www.youtube.com/embed/FinOIdu21XA?playsinline=1",
        "watchUrl": "https://www.youtube.com/watch?v=FinOIdu21XA"
      },
      "focusWord": {
        "word": "receive",
        "wordId": 4127,
        "level": "B1",
        "meaning": "almak",
        "tStart": 12.34
      }
    }
  ],
  "nextCursor": "eyJzIjoiNmYxYzJkIiwibyI6MTB9"
}

Metadata only. Playback runs on YouTube, through your own embed.