К содержанию

Публичный JSON API

Оценки и логотипы площадок — на вашем сайте

Получите одну публичную ссылку в ReputeScan и используйте её, чтобы показать актуальные оценки компании. В ответе нет количества и текстов отзывов — только данные, необходимые для аккуратного блока рейтингов.

GETJSONAPI v1Без токена

Для разработчика

Быстрый старт

Сделайте обычный GET-запрос по выданному URL. Публичный endpoint поддерживает CORS для GET и OPTIONS.

Endpoint
https://reputescan.ru/api/v1/public/company-ratings/rpf_REPLACE_WITH_YOUR_PUBLIC_ID
cURL
curl --request GET \
  --header "Accept: application/json" \
  "https://reputescan.ru/api/v1/public/company-ratings/rpf_REPLACE_WITH_YOUR_PUBLIC_ID"
200 OKОтвет получен. Массив ratings может быть пустым — это допустимо.
Content-Typeapplication/json
AuthorizationНе передавайте
Cache-Controlno-store

Контракт API v1

Формат ответа

Всегда показывайте rating вместе с rating_scale: отдельные источники могут использовать разные шкалы. Не рассчитывайте на порядок элементов и не объединяйте строки только по platform_slug — у одной площадки могут быть разные филиалы.

JSON
{
  "api_version": "1",
  "company_name": "Example company",
  "ratings": [
    {
      "platform_slug": "yandex_maps",
      "platform_name": "Яндекс Карты",
      "rating": 4.8,
      "rating_scale": 5,
      "profile_url": "https://yandex.ru/maps/org/example/123",
      "logo_url": "https://reputescan.ru/marketing/platforms/yandex-maps.svg",
      "location": {
        "name": "Основная точка",
        "city": "Москва"
      },
      "updated_at": "2026-10-20T12:00:00Z"
    }
  ],
  "updated_at": "2026-10-20T12:00:00Z"
}
Поля верхнего уровня
ПолеТипОписание
api_versionstringВерсия контракта; сейчас всегда «1».
company_namestringПубличное название компании.
ratingsarrayСписок доступных оценок. Может быть пустым.
updated_atstring | nullСамое позднее обновление в ISO 8601 UTC; null для пустой выдачи.
Поля элемента ratings
ПолеТипОписание
platform_slugstringСтабильный машинный код площадки.
platform_namestringНазвание площадки для интерфейса.
ratingnumberАктуальная подтверждённая оценка.
rating_scalenumberМаксимум шкалы, например 5 или 10.
profile_urlstring | nullБезопасная публичная ссылка на карточку. Если null, карточку не делайте кликабельной.
logo_urlstring | nullЛокальный логотип или нейтральный бейдж ReputeScan. Для всех текущих поддерживаемых площадок URL заполнен; всё равно предусмотрите fallback.
locationobject | nullФилиал: nullable name и city. null означает оценку без отдельной точки.
updated_atstringВремя наблюдения этой оценки в ISO 8601 UTC.
О логотипах

Изображения имеют разные пропорции — используйте object-fit: contain. Для части источников возвращаются нейтральные идентификационные бейджи ReputeScan, а не заявление об официальном партнёрстве площадки.

Без библиотек

Готовый пример для сайта

Добавьте контейнер, сохраните JavaScript как /ratings.js, подключите стили и замените API_URL на ссылку из кабинета. type=module запускает код после разбора HTML. Пример создаёт DOM-элементы безопасно, не вставляет данные через innerHTML и убирает изображение, если логотип не загрузился.

HTML
<div id="reputescan-ratings" aria-live="polite"></div>
<script type="module" src="/ratings.js"></script>
JavaScript
const API_URL =
  "https://reputescan.ru/api/v1/public/company-ratings/rpf_REPLACE_WITH_YOUR_PUBLIC_ID";

const root = document.querySelector("#reputescan-ratings");

function createRatingCard(source) {
  const card = document.createElement(source.profile_url ? "a" : "article");
  card.className = "rating-card";

  if (source.profile_url) {
    card.href = source.profile_url;
    card.target = "_blank";
    card.rel = "noopener noreferrer";
  }

  if (source.logo_url) {
    const logo = document.createElement("img");
    logo.src = source.logo_url;
    logo.alt = "";
    logo.width = 88;
    logo.height = 36;
    logo.addEventListener("error", () => logo.remove(), { once: true });
    card.append(logo);
  }

  const name = document.createElement("span");
  name.textContent = source.platform_name;

  const score = document.createElement("strong");
  score.textContent = `${source.rating} / ${source.rating_scale}`;

  card.append(name, score);

  const location = [source.location?.name, source.location?.city]
    .filter(Boolean)
    .join(", ");
  if (location) {
    const place = document.createElement("small");
    place.textContent = location;
    card.append(place);
  }

  return card;
}

async function loadRatings() {
  root.textContent = "Загружаем оценки…";

  try {
    const response = await fetch(API_URL, {
      headers: { Accept: "application/json" },
    });

    if (response.status === 429) {
      const seconds = response.headers.get("Retry-After") || "60";
      throw new Error(`Слишком много запросов. Повторите через ${seconds} сек.`);
    }
    if (!response.ok) throw new Error(`API вернул ${response.status}`);

    const data = await response.json();
    if (!data.ratings.length) {
      root.textContent = "Актуальные оценки скоро появятся.";
      return;
    }

    root.replaceChildren(...data.ratings.map(createRatingCard));
  } catch (error) {
    console.error(error);
    root.textContent = "Не удалось загрузить оценки.";
  }
}

loadRatings();
CSS
.rating-card {
  display: grid;
  grid-template-columns: 96px 1fr auto;
  align-items: center;
  gap: 12px;
  padding: 14px;
  border: 1px solid #e2e8f1;
  border-radius: 12px;
  color: #172640;
  text-decoration: none;
}

.rating-card img {
  width: 88px;
  height: 36px;
  object-fit: contain;
}

.rating-card small {
  grid-column: 2 / -1;
  color: #53627a;
}
Рекомендация: загружайте данные один раз при открытии страницы. Не запускайте частый polling; если обновление в открытой вкладке действительно нужно, делайте его не чаще одного раза в минуту.

Надёжная интеграция

Ошибки, лимиты и пустая выдача

Блок оценок не должен ломать основную страницу сайта. Покажите спокойное резервное состояние и оставьте повторную попытку следующей загрузке страницы.

200

Пустой ratings

Это валидный ответ: сейчас нет оценки, которую можно достоверно опубликовать. Скрывайте блок или показывайте нейтральный текст; не подставляйте 0.

404

Ссылка недействительна

API отключён, ссылка заменена или URL неверен. Запросите у владельца новую ссылку из кабинета.

429

Слишком много запросов

Пример автоматически не повторяет запрос. Если добавляете повтор на сервере, используйте Retry-After; в cross-origin JavaScript этот заголовок может быть недоступен, поэтому задайте паузу не менее 60 секунд.

5xx

Временная ошибка

Не показывайте устаревшие данные как свежие. Сохраните интерфейс сайта рабочим и повторите позже.

120запросов в минуту с одного IP
1 200запросов в минуту на одну API-ссылку

Лимиты защищают доступность API и не являются авторизацией. Не добавляйте URL в публичный репозиторий как секрет: это именно отзываемая публичная ссылка для чтения.

Частые вопросы

Есть ли логотип у каждой площадки?

Да, для всех текущих поддерживаемых источников logo_url заполнен. Там, где официальный знак нельзя использовать без отдельного разрешения, ReputeScan отдаёт нейтральный локальный бейдж с названием источника. Оставьте визуальный fallback на случай нового источника или временной ошибки изображения.

Почему оценка иногда не по пятибалльной шкале?

API сохраняет родную шкалу площадки. Всегда выводите «rating / rating_scale» или нормализуйте значение у себя осознанно.

Почему одна площадка встречается несколько раз?

У компании может быть несколько филиалов и отдельная карточка площадки для каждого из них. Используйте location и не удаляйте строки только из-за одинакового platform_slug.

Когда обновляются данные?

API показывает последний достоверный снимок, доступный в ReputeScan. Точное время есть в updated_at у каждой строки и на верхнем уровне ответа. GET-запрос сам не запускает новый сбор.

Можно ли получить количество или тексты отзывов?

Нет. Версия v1 намеренно публикует только оценки, шкалы, сведения об источнике и филиале, ссылки, логотипы и время обновления.

Готово к подключению

Скопируйте API-ссылку в кабинете и отправьте эту страницу разработчику

Постоянный адрес инструкции: reputescan.ru/docs/ratings-api

Войти в ReputeScanВернуться к примеру