Копии открытых сервисов для курсов: тот же формат ответа, но на сервере академии в России. Ключ и регистрация не нужны. Одинаковый запрос получает одинаковый ответ.
/jsonplaceholderУчебный REST API с постами, комментариями, альбомами, пользователями и задачами. Данные те же, что у оригинала. POST, PUT, PATCH и DELETE отвечают как настоящие, но ничего не сохраняют.
Настоящий сервис: https://jsonplaceholder.typicode.com. Путь после префикса тот же, что у него.
/openlibraryПоиск книг по названию и автору: /search.json с параметрами q, title, author, fields, limit, offset. Каталог учебный: несколько десятков книг, в том числе те, что ищет демо курса NextJS.
Настоящий сервис: https://openlibrary.org. Путь после префикса тот же, что у него.
/open-meteoПрогноз /v1/forecast (current, hourly, daily, forecast_days, past_days, timezone, единицы измерения) и геокодер /geocoding/v1/search (name, count, language, format). Погода учебная: правдоподобная, но выдуманная; в один и тот же час одинаковый запрос получает одинаковый ответ.
Настоящий сервис: https://api.open-meteo.com и https://geocoding-api.open-meteo.com. Путь после префикса тот же, что у него.
/open-meteo/geocoding/v1/search?name=Омск&count=1&language=ru&format=json/open-meteo/v1/forecast?latitude=54.99&longitude=73.37¤t=temperature_2m,weather_code&timezone=auto/open-meteo/v1/forecast?latitude=55.79&longitude=49.12&daily=temperature_2m_max,temperature_2m_min,precipitation_sum&forecast_days=3&timezone=auto/er-apiКурсы валют к выбранной базовой: /v6/latest/USD, /v6/latest/EUR, /v6/latest/RUB. Курсы учебные, обновляются раз в сутки.
Настоящий сервис: https://open.er-api.com. Путь после префикса тот же, что у него.
/llmChat Completions: POST /v1/chat/completions (stream, tools, response_format, max_tokens) и GET /v1/models. Ключ обязателен: Authorization: Bearer sk-academy-… — подойдёт любой с этим началом. Модели за копией нет: ответ — заготовленный текст с началом вопроса, но ключ, usage, поток и ошибки как у настоящего провайдера.
Настоящий сервис: любой провайдер с OpenAI-совместимым API: api.openai.com, api.deepseek.com и другие. Путь после префикса тот же, что у него.
/oauth/githubВход через GitHub в раскладке GitHub Enterprise: /login/oauth/authorize, /login/oauth/access_token, /api/v3/user и /api/v3/user/emails. Вместо пароля — страница выбора учебного пользователя; redirect_uri принимается только на localhost.
Настоящий сервис: https://github.com и https://api.github.com. Раскладка GitHub Enterprise: вход — те же /login/oauth/…, что у github.com, API — под /api/v3.
/oauth/googleВход через Google: discovery, /o/oauth2/v2/auth, /token, /v1/userinfo (и /oauth2/v3/userinfo), /oauth2/v3/certs. id_token подписан RS256, issuer — адрес этой копии. Вместо пароля — страница выбора учебного пользователя; redirect_uri принимается только на localhost.
Настоящий сервис: https://accounts.google.com, https://oauth2.googleapis.com и https://www.googleapis.com. Адреса Google с разных доменов собраны под одним префиксом, путь после него — тот же, что у Google.
/placeholdСерый прямоугольник с подписью размера в SVG: /600x400, /48, /600x400/orange/white, ?text=Привет. Растровые форматы копия не отдаёт.
Настоящий сервис: https://placehold.co. Путь после префикса тот же, что у него; формат — только SVG.
/picsumКартинка нужного размера в JPEG: /800/600, /id/10/800/600, /seed/кофе/400/300, параметры ?grayscale и ?blur=1…10. Одинаковый адрес — одинаковая картинка.
Настоящий сервис: https://picsum.photos. Путь после префикса тот же, что у него; вместо фотографий — нарисованные пейзажи, ответ в JPEG без перенаправления.
/filesЗеркало моделей, которые курсы скачивают целиком. Путь /files/mediapipe-models/… повторяет
путь в storage.googleapis.com/mediapipe-models/…. Докачка работает: сервер отвечает на Range.
Контрольные суммы — /files/SHA256SUMS. Файлы отдаёт сервер академии,
при локальном запуске копии их нет.
/files/mediapipe-models/image_classifier/efficientnet_lite0/float32/1/efficientnet_lite0.tflite | 18,6 МБ, Apache-2.0 Mobile_AI M04, M07, M08, M10–M12 |
/files/mediapipe-models/image_classifier/efficientnet_lite0/int8/1/efficientnet_lite0.tflite | 5,4 МБ, Apache-2.0 Mobile_AI M04, M11 (проверочный файл докачки), M12 |
/files/mediapipe-models/language_detector/language_detector/float32/1/language_detector.tflite | 0,3 МБ, Apache-2.0 Mobile_AI M09 |
/files/models/qwen2.5-0.5b-instruct.zip | 999,6 МБ, Apache-2.0 Applied_ML M15 |
Чтобы проверить обработку ошибок, вставьте после префикса API сегмент /_fault/вид.
Код программы менять не нужно — только базовый адрес.
/_fault/503 | ответ с этим кодом: подойдёт любой от 200 до 599, кроме 3xx; у 204 тела нет, у 429 и 503 есть заголовок Retry-After |
/_fault/429-2 | то же для 429 и 503, но Retry-After — заданное число секунд: так видны повторы с паузой |
/_fault/timeout | сервис принимает запрос и молчит 60 секунд |
/_fault/slow-2000 | обычный ответ с задержкой в миллисекундах, не больше 30 000 |
/_fault/garbage | код 200 и обрезанный JSON |
/_fault/reset | соединение рвётся без ответа |
Пример: /open-meteo/_fault/503/v1/forecast?latitude=55&longitude=73