Пустой ratings
Это валидный ответ: сейчас нет оценки, которую можно достоверно опубликовать. Скрывайте блок или показывайте нейтральный текст; не подставляйте 0.
Публичный JSON API
Получите одну публичную ссылку в ReputeScan и используйте её, чтобы показать актуальные оценки компании. В ответе нет количества и текстов отзывов — только данные, необходимые для аккуратного блока рейтингов.
Для владельца компании
URL создаётся отдельно для каждой компании. Его не нужно составлять вручную или дополнять ключом.
Войдите в ReputeScan и выберите нужную компанию.
Пункт доступен владельцу компании и администратору в меню кабинета.
Передайте готовый адрес разработчику вместе с этой инструкцией. Для чтения не нужны cookie, Bearer-токен или доступ в кабинет.
Для разработчика
Сделайте обычный GET-запрос по выданному URL. Публичный endpoint поддерживает CORS для GET и OPTIONS.
https://reputescan.ru/api/v1/public/company-ratings/rpf_REPLACE_WITH_YOUR_PUBLIC_IDcurl --request GET \
--header "Accept: application/json" \
"https://reputescan.ru/api/v1/public/company-ratings/rpf_REPLACE_WITH_YOUR_PUBLIC_ID"Контракт API v1
Всегда показывайте rating вместе с rating_scale: отдельные источники могут использовать разные шкалы. Не рассчитывайте на порядок элементов и не объединяйте строки только по platform_slug — у одной площадки могут быть разные филиалы.
{
"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_version | string | Версия контракта; сейчас всегда «1». |
company_name | string | Публичное название компании. |
ratings | array | Список доступных оценок. Может быть пустым. |
updated_at | string | null | Самое позднее обновление в ISO 8601 UTC; null для пустой выдачи. |
| Поле | Тип | Описание |
|---|---|---|
platform_slug | string | Стабильный машинный код площадки. |
platform_name | string | Название площадки для интерфейса. |
rating | number | Актуальная подтверждённая оценка. |
rating_scale | number | Максимум шкалы, например 5 или 10. |
profile_url | string | null | Безопасная публичная ссылка на карточку. Если null, карточку не делайте кликабельной. |
logo_url | string | null | Локальный логотип или нейтральный бейдж ReputeScan. Для всех текущих поддерживаемых площадок URL заполнен; всё равно предусмотрите fallback. |
location | object | null | Филиал: nullable name и city. null означает оценку без отдельной точки. |
updated_at | string | Время наблюдения этой оценки в ISO 8601 UTC. |
Изображения имеют разные пропорции — используйте object-fit: contain. Для части источников возвращаются нейтральные идентификационные бейджи ReputeScan, а не заявление об официальном партнёрстве площадки.
Без библиотек
Добавьте контейнер, сохраните JavaScript как /ratings.js, подключите стили и замените API_URL на ссылку из кабинета. type=module запускает код после разбора HTML. Пример создаёт DOM-элементы безопасно, не вставляет данные через innerHTML и убирает изображение, если логотип не загрузился.
<div id="reputescan-ratings" aria-live="polite"></div>
<script type="module" src="/ratings.js"></script>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();.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;
}Надёжная интеграция
Блок оценок не должен ломать основную страницу сайта. Покажите спокойное резервное состояние и оставьте повторную попытку следующей загрузке страницы.
Это валидный ответ: сейчас нет оценки, которую можно достоверно опубликовать. Скрывайте блок или показывайте нейтральный текст; не подставляйте 0.
API отключён, ссылка заменена или URL неверен. Запросите у владельца новую ссылку из кабинета.
Пример автоматически не повторяет запрос. Если добавляете повтор на сервере, используйте Retry-After; в cross-origin JavaScript этот заголовок может быть недоступен, поэтому задайте паузу не менее 60 секунд.
Не показывайте устаревшие данные как свежие. Сохраните интерфейс сайта рабочим и повторите позже.
Лимиты защищают доступность API и не являются авторизацией. Не добавляйте URL в публичный репозиторий как секрет: это именно отзываемая публичная ссылка для чтения.
Да, для всех текущих поддерживаемых источников logo_url заполнен. Там, где официальный знак нельзя использовать без отдельного разрешения, ReputeScan отдаёт нейтральный локальный бейдж с названием источника. Оставьте визуальный fallback на случай нового источника или временной ошибки изображения.
API сохраняет родную шкалу площадки. Всегда выводите «rating / rating_scale» или нормализуйте значение у себя осознанно.
У компании может быть несколько филиалов и отдельная карточка площадки для каждого из них. Используйте location и не удаляйте строки только из-за одинакового platform_slug.
API показывает последний достоверный снимок, доступный в ReputeScan. Точное время есть в updated_at у каждой строки и на верхнем уровне ответа. GET-запрос сам не запускает новый сбор.
Нет. Версия v1 намеренно публикует только оценки, шкалы, сведения об источнике и филиале, ссылки, логотипы и время обновления.
Готово к подключению
Постоянный адрес инструкции: reputescan.ru/docs/ratings-api