Reads the AI resources of a video in one language: eBook, Mind Map and Quiz. One file per language in AI Package v2.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
GET /{pullzone_name}/{video_external_id}-ai.{lang}.json
{pullzone_name}/{video_external_id}-ai.{lang}.jsonReturns the AI resources generated for a video in one language: eBook (abstract), Mind Map (mindmap) and Quiz (questions). This is the file an integrator reads to build their own interface — the Panda player consumes exactly these files.
In the AI Package v2 there is one file per language, identified by the .{lang} suffix in the name. Each file carries schema_version: 2 and only the keys of the resources that exist in that language. A video with an eBook in English and a Quiz in Portuguese has two files, each with its own block.
AuthorizationNone. The file is served by the configuration CDN and does not require an authentication header. Do not send your API key in this call.
Naming reference
The API uses technical names; the Panda interface uses commercial names. In fields and enum values, always the technical ones.
| API | Interface |
|---|---|
abstract | eBook |
mindmap | Mind Map |
questions | Quiz |
HTTP Method & Path
GET /{pullzone_name}/{video_external_id}-ai.{lang}.json
Base URL: https://config.tv.pandavideo.com.br
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
pullzone_name | string | Yes | Pullzone of the video library. Returned as pullzone_name by GET /videos/{video_id}. E.g. vz-163a34ba-25b |
video_external_id | string | Yes | External ID of the video (uuid). Returned as video_external_id by GET /videos/{video_id}. This is not the video_id |
lang | string | Yes | Language of the resource, exactly as it appears in srclang inside config.ai.resources[]. E.g. pt-BR, en, es |
How to find out which files exist
Do not build the path by trial and error. The correct entry point is the video manifest:config.ai.resources[]lists the type and language of every existing resource. Requesting a language that does not exist returns 404.
1. Call GET /videos/{video_id} and read config.ai.resources[]:
{
"ai": {
"abstract": true,
"mindmap": true,
"questions": true,
"pdf_generated": true,
"resources": [
{ "type": "abstract", "srclang": "en" },
{ "type": "abstract", "srclang": "pt-BR", "is_legacy": true },
{ "type": "questions", "srclang": "pt-BR", "is_legacy": true },
{ "type": "mindmap", "srclang": "pt-BR", "is_legacy": true }
]
}
}2. For every entry without is_legacy, build the path using its srclang in place of {lang}. In the example above, only the English eBook is v2:
GET /{pullzone_name}/{video_external_id}-ai.en.json
3. Entries flagged is_legacy: true are read at the path without a language suffix — see the Legacy section at the end of this page. Entries flagged is_created: true were created by hand instead of generated by AI, and are read at the normal language-suffixed path.
Response
Success Response (200) — file with an eBook
{
"schema_version": 2,
"lang": "en",
"abstract": "# Chapter 1\n\nThe first chapter in markdown...",
"abstract_html": "<section class=\"panda-ebook\">...</section>",
"abstract_summary": "A short summary of the whole eBook.",
"abstract_cover": {
"kicker": "Biochemistry",
"title": "Vitamins",
"subtitle": "Functions, sources and deficiencies",
"edition_label": "Edition 1"
},
"abstract_config": {
"layout": "modern",
"title_font": "Rubik",
"content_font": "Rubik",
"accent_color": "#3F55EE",
"secondary_color": "#E12AFB",
"format": "portrait",
"header_footer": true,
"logo_key": null
},
"images": [
{
"storage_path": "USER_ID/ai_abstract_image/{uuid}.jpeg",
"cdn_base": "https://images-cdn.pandavideo.com",
"caption": "Molecular structure of vitamin C"
}
]
}Success Response (200) — file with a Quiz
The same video, another language, another resource. Note that there is no eBook key here, and that questions_config is a sibling of questions:
{
"schema_version": 2,
"lang": "pt-BR",
"questions": [
{
"id": "{question_id}",
"enunciate": "Which vitamin is synthesised through sun exposure?",
"options": [
{ "text": "Vitamin A", "correct": false },
{ "text": "Vitamin D", "correct": true },
{ "text": "Vitamin K", "correct": false }
]
}
],
"questions_config": {
"num_questions": 5,
"num_answers": 3,
"allow_skip": false,
"show_explanation": true,
"show_results": true,
"collect_lead": false
}
}Response Schema
| Field | Type | Content |
|---|---|---|
schema_version | integer | 2 in this format. Absent = file written by the previous model (v1) |
lang | string | Language of this file |
abstract | string | eBook text in markdown |
abstract_html | string | Canonical HTML of the eBook — the same source that renders the PDF. Generator panda-ebook-html@1 |
abstract_summary | string | Short summary |
abstract_cover | object | Cover copy |
abstract_cover.kicker | string | Line above the title |
abstract_cover.title | string | Cover title |
abstract_cover.subtitle | string | Cover subtitle |
abstract_cover.edition_label | string | Edition label |
abstract_config | object | The layout used during generation — lets you reproduce the PDF look in your own interface |
images | array | Chapter images of the eBook |
images[].storage_path | string | Path of the file in storage |
images[].cdn_base | string | Public CDN base. Final URL = cdn_base + / + storage_path |
images[].caption | string | Image caption |
mindmap | object | Mind Map tree. May carry mindmap_config nested |
questions | array | Quiz questions |
questions[].id | string | Question ID |
questions[].enunciate | string | Question text shown to the viewer |
questions[].options | array | Alternatives: text and correct (boolean) |
questions_config | object | Quiz behaviour. Sibling key of questions, never inside the array |
The fields of abstract_config and questions_config are detailed on Generate an AI Resource.
Important
- The file carries only the keys of the resource that exists in that language — do not treat a missing field as an error.
questions_configis a sibling ofquestions. Do not look for it inside the array.pdf_urldoes not exist in this file. The PDF URL is returned only byGET /videos/{video_id}, insideconfig.ai.resources[]. This is deliberate: in the public file it would be a direct download link, bypassing the per-resource download permission.abstract_htmlis the canonical source of the eBook. If you render theabstractmarkdown yourself, the result may differ from the PDF.
Error Responses
404: no resource exists for this video in this language, or the language suffix is wrong (e.g.ptinstead ofpt-BR). Checkconfig.ai.resources[]instead of guessing the path.403: invalid pullzone orvideo_external_id.
Legacy (v1) — -ai.json
-ai.jsonThe old path keeps working and is still written. Content generated with the previous model appears in the manifest flagged is_legacy: true and is read without a language suffix:
GET /{pullzone_name}/{video_external_id}-ai.json
v2 — -ai.{lang}.json | v1 (legacy) — -ai.json | |
|---|---|---|
| Languages | One file per language | One file, one language |
schema_version | 2 | absent |
abstract_html | yes | no |
abstract_config | yes | no |
abstract_cover | yes | no |
images | yes | no |
| eBook PDF | abstract.{lang}.pdf | abstract.pdf (no suffix) |
MigrationNothing already published became invalid — it became incomplete. Anyone reading only
-ai.jsonwill not find content generated with v2. Move to entering through the manifest (config.ai.resources[]) and handling both paths.
Example Usage
cURL
# v2 — eBook in English
curl -X GET "https://config.tv.pandavideo.com.br/vz-163a34ba-25b/{video_external_id}-ai.en.json"
# v2 — Quiz in Portuguese
curl -X GET "https://config.tv.pandavideo.com.br/vz-163a34ba-25b/{video_external_id}-ai.pt-BR.json"
# v1 (legacy) — no language suffix
curl -X GET "https://config.tv.pandavideo.com.br/vz-163a34ba-25b/{video_external_id}-ai.json" 404No resource exists for this video in this language, or the language suffix is wrong. Read config.ai.resources[] instead of guessing the path.
