Минималистичная документация по API сайта

Актуально на 00:00 06.03.2026 +00:00.

Введение

Как бы говоря, иногда хочется взаимодействовать с сайтом вне привычных инструментов, таких как вики-разметка или модули вроде ListPages или ListUsers. Например, динамически строить свою собственную статью из случайных фрагментов, или пугать пользователя тем, что мы знаем о нём абсолютно всё. Но, как вы могли заметить, достичь такого результата оказывается крайне сложно или вовсе невозможно с тем, что есть.

Именно эту проблему решает публичный API сайта, который можно использовать внутри блоков HTML и iframe.

ОДНУ МИНУТКУ!

Данный API является публичным, то есть доступ к нему есть у всех.
Злонамеренное использование может караться лишением доступа к сайту на неопределённый период времени.

В данном тексте описана лишь та часть API, которая доступна непосредственно на сайте внутри выше обозначенных блоков. Если вам необходимы прочие функции или если вы пишите для проекта, разрабатываемого вне сайта, то вы можете найти все определения и точки входа самостоятельно.

Текст предназначен для людей, уже хорошо понимающих основы программирования и знающих язык JavaScript (или TypeScript). Если вы испытываете трудности в этой области или вообще ничего не знаете об этом, то вам нет смысла продолжать чтение.

Описания функций API

Ниже приведено описание всех доступных в публичном API функций, выполненное в формате декларации TypeScript. Вы можете полностью скопировать весь нижеприведённый текст в ваш проект и использовать его для разработки1.

declare namespace api {

    /**
     * @desc Получает список всех статей.
     */
    function fetchAllArticles(): Promise<FullArticleData[]>;

    /**
     * @desc Получает конкретную статью по идентификатору.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     */
    function fetchArticle(pageId: string): Promise<ArticleData>;

    /**
     * @desc Получает список изменений статьи в указанном диапазоне эксклюзивно. По умолчанию
     * возвращает последние 25 правок.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     * @param from - индекс самой ранней искомой правки. Значение по-умолчанию: `0`.
     * @param to - индекс самой поздней искомой правки. Не включается в возвращаемый
     * список (эксклюзивный). Значение по-умолчанию: ` from + 25`.
     */
    function fetchArticleLog(pageId: string, from?: number, to?: number): Promise<ArticleLog>;

    /**
     * @desc Получает конкретную версию статьи. При попытке найти правку с несуществующим номером
     * вернёт сообщение об ошибке.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     * @param revNum - номер искомой правки.
     * @param pathParams - параметры страницы, указываемые в адресной строке браузера после
     * обозначения страницы.
     */
    function fetchArticleVersion(pageId: string, revNum: number, pathParams?: { [key: string]: string }): Promise<ArticleVersion>;

    /**
     * @desc Получает выставленные статье оценки.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     */
    function fetchArticleVotes(pageId: string): Promise<ModuleRateVotesResponse>;

    /**
     * @desc Получает обратные ссылки, включения и детей статьи.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     */
    function fetchArticleBacklinks(pageId: string): Promise<ArticleBacklinks>;

    /**
     * @desc Получает файлы, загруженные на страницу.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     */
    function fetchArticleFiles(pageId: string): Promise<ArticleFiles>;

    /**
     * @desc Генерирует предпросмотр поста на форуме.
     * @param source - исходный код (FTML-разметка) поста на форуме.
     */
    function previewForumPost(source: string): Promise<ModuleRenderResponse>;

    /**
     * @desc Получает пост на форуме в указанное время. По умолчанию возвращает последнюю правку
     * указанного поста.
     * @param postId - цифровое обозначение сообщения на форуме.
     * @param atDate - дата в формате ISO 8601 (например, "2025-08-15T19:24:19.681887+00:00"). Для
     * автоматического получения дат смотрите {@link api.fetchForumPostVersions}.
     */
    function fetchForumPost(postId: number, atDate?: string): Promise<ForumFetchPostResponse>;

    /**
     * @desc Получает список, содержащий информацию о версиях поста на форуме.
     * @param postId - цифровое обозначение сообщения на форуме.
     */
    function fetchForumPostVersions(postId: number): Promise<ForumFetchPostVersionsResponse>;

    /**
     * @desc Генерирует предпросмотр страницы на основе данных.
     * @param data - данные, необходимые для преобразования FTML-исходника в HTML.
     */
    function makePreview(data: PreviewData): Promise<PreviewResponse>;

    /**
     * @desc Получает информацию о текущем рейтинге страницы.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     */
    function fetchPageRating(pageId: string): Promise<ModuleRateResponse>;

    /**
     * @desc Получает рейтинг страницы и каждый отдельный голос в формате спитска.
     * @param pageId - обозначение статьи, отображаемое в URL страницы, например `"scp-1470-ru"`
     * или `"a-herd-of-bison-forming-thoughts"`.
     */
    function fetchPageVotes(pageId: string): Promise<ModuleRateVotesResponse>;

    /**
     * @desc Получает список всех тегов.
     */
    function fetchAllTags(): Promise<FetchAllTagsResponse>;

    /**
     * @desc Получает список всех пользователей сайта.
     */
    function fetchAllUsers(): Promise<UserData[]>;

    /**
     * @desc Вызывает метод соответствующего модуля.
     * @param module - имя исполняемого модуля.
     * @param method - вызываемая функция модуля.
     * @param data - прочие данные, которые могут быть необходимы для вызова метода модуля.
     */
    function callModule(module: AvaliableModules, method: string, data?: Partial<ModuleRequest>): Promise<any>;
}

Используемые типы данных

Нетрудно заметить, что все функции возвращают промисы на крайне разнообразный перечень объектов2. Каждый объект, так или иначе упомянутый в примере выше, описан в этом разделе. Аналогично предыдущему пункту, вы можете вставить весь текст в ваш проект и использовать его в качестве подсказок в вашей IDE.

Список длинный, а потому спойлер. Используйте Ctrl+F для нахождения нужного вам типа по необходимости.

Рекомендации

Текст вместо заключения потому что смысла в нём на самом деле не так много.

Обращаться к сайту — это, конечно, очень круто. Но важно понимать, что API можно применять только внутри блоков HTML и iframe. Оба эти блока загружаются дольше, чем любая другая часть страницы, а потому их использование способно значительно повлиять на UX. Минимизируйте использование этих элементов.

Если то, что вы хотите сделать, можно сделать без использования API — не используйте его. Отправлять один (а то и больше) запрос на сервер и создавать для этого целый блок HTML — дело затратное и, как уже было сказано ранее, не самое приятное для конечного пользователя.

Замечу, что данный API существует только на русскоязычном филиале SCP Foundation. Так что если вы хотите, чтобы у вашей статьи был шанс быть переведённой на другие языки и опубликованной на иноязычной вики, то он использования API придётся воздержаться. Либо придумать какой-нибудь костыльный аналог полифила для вашей статьи, это тоже вариант, хе.

Не эксплуатируйте щедрые рейт-лимиты. Это даже не рекомендация, это требование. Нет, вы не сможете отправить так много запросов, что сайт упадёт, но вы создадите больше проблем технической администрации сайта. Используйте всё вышеописанное в меру и не провоцируйте гнев администрации.

Ну и, разумеется, будьте лапочками и ответственными пользователями.

Структурные: публичный_черновик
версия страницы: 17, Последняя правка: 06 Март 2026, 14:38 (37 дней назад)
Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License.