API для разработчиков

Content API позволяет заливать новости, кирпичики, конструкции, экспедиции и связи между ними прямо по HTTP — без гита и пересборки. Всё идемпотентно (upsert по slug): повторный запрос обновляет, а не дублирует.

Авторизация

Все запросы к /api/admin/* требуют секретный ключ в заголовке. Ключ лежит в ADMIN_API_KEY на сервере (посмотреть: grep ADMIN_API_KEY .env.production). Держи его в секрете — он даёт полный контроль над контентом.

Authorization: Bearer <ADMIN_API_KEY>
# или
x-api-key: <ADMIN_API_KEY>

Базовый адрес:

https://e-bricks.ru

Новости

POST/api/admin/articles
GET/api/admin/articles
DELETE/api/admin/articles/{slug}

Создать или обновить новость. Принимает объект или массив. Тело — markdown. Форматы: TEXT · VIDEO · GALLERY · LINK.

curl -X POST https://e-bricks.ru/api/admin/articles \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Запускаем неделю космоса",
    "excerpt": "Короткое описание для превью и поиска.",
    "format": "TEXT",
    "coverUrl": "https://.../cover.jpg",
    "body": "## Заголовок\n\nТекст в **markdown** со списками и [ссылками](/lab).",
    "tags": ["событие", "астрономия"],
    "status": "PUBLISHED"
  }'

slug можно не указывать — сгенерируется из заголовка. status: DRAFT (по умолчанию) или PUBLISHED.

Задания (кирпичики, конструкции, экспедиции)

POST/api/admin/nodes
GET/api/admin/nodes
DELETE/api/admin/nodes/{slug}

Кирпичик — атом знания с проверкой (predict-reveal или quiz):

curl -X POST https://e-bricks.ru/api/admin/nodes \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{
    "slug": "bio-cell",
    "kind": "BRICK",
    "subject": "BIOLOGY",
    "title": "Клетка — кирпичик жизни",
    "summary": "Всё живое состоит из клеток.",
    "estMinutes": 10,
    "bodyMdx": "Короткое объяснение понятия…",
    "data": {
      "check": {
        "kind": "predict",
        "prompt": "Что общего у дерева, гриба и человека?",
        "options": ["Ничего", "Состоят из клеток", "Дышат жабрами"],
        "answer": 1,
        "reveal": "Все они состоят из клеток — базовой единицы жизни."
      }
    },
    "skills": [{ "skill": "MODELING" }, { "skill": "CRITICAL", "weight": 2 }]
  }'

Конструкция — постройка с 6-шаговым циклом исследователя и тренажёром:

{
  "slug": "bio-plant-build",
  "kind": "BUILD",
  "subject": "BIOLOGY",
  "title": "Прорасти семя",
  "trainerKey": "ph",
  "trainerParams": {},
  "data": {
    "cycle": {
      "wonder": "Что нужно семени, чтобы проснуться?",
      "hypothesisPrompt": "Предположи, какие условия важнее всего.",
      "plan": ["Замочить семена", "Разные условия", "Наблюдать 5 дней"],
      "actionHint": "Проведи опыт дома и внеси данные.",
      "reflectPrompts": ["Что подтвердилось?", "Что удивило?"],
      "sharePrompt": "Опиши, при каких условиях семена проросли."
    }
  },
  "skills": [{ "skill": "EXPERIMENT", "weight": 2 }]
}

quiz-проверка вместо predict:

"data": { "check": {
  "kind": "quiz",
  "question": "Где у растения идёт фотосинтез?",
  "options": [
    { "text": "В листьях", "correct": true, "why": "В хлоропластах листьев." },
    { "text": "В корнях", "correct": false, "why": "Корни всасывают воду, света там нет." }
  ]
}}

Уроки (композиция блоков)

Урок — узел с kind: "LESSON" и data.blocks — массивом разнотипных блоков. Так один урок совмещает несколько заданий и становится полным. Типы блоков: text · predict · quiz · numeric · rank · aiCatch · case · investigation.

{
  "slug": "lesson-water",
  "kind": "LESSON",
  "subject": "CHEMISTRY",
  "title": "Тайна воды",
  "data": { "blocks": [
    { "type": "text", "title": "Зачин", "body": "markdown-текст…" },
    { "type": "predict", "prompt": "Что произойдёт, если…",
      "options": ["A","B","C"], "answer": 1, "reveal": "объяснение механизма" },
    { "type": "numeric", "prompt": "Оцени, сколько…", "unit": "°C",
      "answer": 100, "tolerance": 0.15, "reveal": "…" },
    { "type": "rank", "prompt": "Расставь по порядку",
      "items": ["первый","второй","третий"], "reveal": "…" },
    { "type": "aiCatch", "prompt": "Найди ошибку ИИ",
      "claim": "правдоподобно неверное утверждение", "reveal": "в чём подвох" },
    { "type": "case", "intro": "загадочная ситуация",
      "clues": [{ "label": "Улика 1", "text": "…" }],
      "question": "Почему?", "options": [
        { "text": "верно", "correct": true, "why": "…" },
        { "text": "неверно", "correct": false, "why": "…" } ] },
    { "type": "investigation", "key": "pendulum", "intro": "поиграй с моделью" }
  ] },
  "skills": [{ "skill": "HYPOTHESIS", "weight": 2 }]
}

rank.items задаются в правильном порядке. investigation.key — из реестра лабораторий (сейчас: pendulum).

Связи (граф знаний)

POST/api/admin/edges

Связывает узлы по slug. Типы: PREREQUISITE (нужно пройти до), RELATED, CROSS_SUBJECT (межпредметная стыковка), PART_OF (входит в экспедицию).

curl -X POST https://e-bricks.ru/api/admin/edges \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '[
    { "from": "bio-cell", "to": "bio-plant-build", "kind": "PREREQUISITE" },
    { "from": "bio-cell", "to": "chem-ph", "kind": "CROSS_SUBJECT" }
  ]'

Массовая заливка

POST/api/admin/bulk

Целый раздел одним запросом. Порядок гарантирован: сначала узлы, потом связи (можно ссылаться на только что созданные узлы), потом новости.

curl -X POST https://e-bricks.ru/api/admin/bulk \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{
    "nodes": [ { "slug": "bio-cell", "kind": "BRICK", ... } ],
    "edges": [ { "from": "bio-cell", "to": "bio-dna", "kind": "RELATED" } ],
    "articles": [ { "title": "Добавили биологию!", "body": "...", "status": "PUBLISHED" } ]
  }'

Справочник значений

Предметы (subject)
PHYSICS · CHEMISTRY · BIOLOGY · ASTRONOMY · MATH · CODE
Типы узлов (kind)
BRICK · BUILD · QUEST · LESSON
Блоки урока (type)
text · predict · quiz · numeric · rank · aiCatch · case · investigation
Уровни (level)
YOUNG · RESEARCHER · MASTER
Тренажёры (trainerKey)
pendulum · orbit · ph · teachback
Навыки (skill)
CURIOSITY · HYPOTHESIS · EXPERIMENT · DATA · CRITICAL · MODELING · COMPUTATIONAL · COMMUNICATION · AI_LITERACY
Типы связей (kind)
PREREQUISITE · RELATED · CROSS_SUBJECT · PART_OF
Заметки. Предметы — фиксированный список (новый предмет требует изменения кода и цветовой схемы). Ошибки валидации возвращаются с 400 и полем issues. Неверный ключ — 401.