Быстрый старт
Попробуйте пробный запрос готовым ключом. Для создания своих объектов используйте ключ из личного кабинета.
Тестовый ключ общий и только на чтение. Боевой ключ, и full, и read_only, держите на своём
сервере: в браузерном коде, публичных примерах и репозитории ему не место. read_only тоже
открывает все ваши данные на чтение, поэтому «только чтение» ≠ «можно публиковать».
Проверьте связь
Два пробных запроса: доступность API и справочник площадок. Первый идёт без ключа. Пришёл JSON-ответ – ключ и сеть в порядке.
# API на связи – ключ не нужен
curl https://api.rewio.ru/health
# площадки, с которых собираются отзывы
curl https://api.rewio.ru/v2/sources \
-H "X-API-Key: hrev_FaDGMKJEDDeCR5BCBgEg0aEjMogI7O7hOzE53YY4T1M"import requests
BASE = "https://api.rewio.ru/v2"
HEADERS = {"X-API-Key": "hrev_FaDGMKJEDDeCR5BCBgEg0aEjMogI7O7hOzE53YY4T1M"}
# API на связи – ключ не нужен
health = requests.get("https://api.rewio.ru/health").json()
print(health["status"])
# площадки, с которых собираются отзывы
sources = requests.get(f"{BASE}/sources", headers=HEADERS).json()
print(sources["data"][:3])const BASE = "https://api.rewio.ru/v2";
const HEADERS = { "X-API-Key": "hrev_FaDGMKJEDDeCR5BCBgEg0aEjMogI7O7hOzE53YY4T1M" };
// API на связи – ключ не нужен
const health = await (await fetch("https://api.rewio.ru/health")).json();
console.log(health.status);
// площадки, с которых собираются отзывы
const sources = await (await fetch(`${BASE}/sources`, { headers: HEADERS })).json();
console.log(sources.data.slice(0, 3));<?php
$base = 'https://api.rewio.ru/v2';
$key = 'hrev_FaDGMKJEDDeCR5BCBgEg0aEjMogI7O7hOzE53YY4T1M';
function rewio(string $url, ?string $key = null): array {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($key !== null) {
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: $key"]);
}
$body = curl_exec($ch);
curl_close($ch);
return json_decode($body, true);
}
// API на связи – ключ не нужен
$health = rewio('https://api.rewio.ru/health');
echo $health['status'], PHP_EOL;
// площадки, с которых собираются отзывы
$sources = rewio("$base/sources", $key);
print_r(array_slice($sources['data'], 0, 3));Создайте объект
Объект – ваш объект: отель, клиника, филиал, врач или специалист. Ссылки на площадки передаются при создании или отдельным методом добавления ссылок. Площадка определяется автоматически по ссылке.
Для создания объекта используйте ключ из личного кабинета.
curl -X POST https://api.rewio.ru/v2/groups \
-H "X-API-Key: hrev_ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"name": "Мой отель",
"links": [
{"url": "https://yandex.ru/maps/org/national/1020542995"},
{"url": "https://2gis.ru/moscow/firm/70000001006369779"}
]
}'import requests
BASE = "https://api.rewio.ru/v2"
HEADERS = {"X-API-Key": "hrev_ВАШ_КЛЮЧ"}
group = requests.post(f"{BASE}/groups", headers=HEADERS, json={
"name": "Мой отель",
"links": [
{"url": "https://yandex.ru/maps/org/national/1020542995"},
{"url": "https://2gis.ru/moscow/firm/70000001006369779"},
],
}).json()
group_id = group["id"]
for result in group["link_results"]:
print(result["url"], result["error"] or f'ok, link_id={result["link_id"]}')const BASE = "https://api.rewio.ru/v2";
const HEADERS = {
"X-API-Key": "hrev_ВАШ_КЛЮЧ",
"Content-Type": "application/json",
};
const res = await fetch(`${BASE}/groups`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify({
name: "Мой отель",
links: [
{ url: "https://yandex.ru/maps/org/national/1020542995" },
{ url: "https://2gis.ru/moscow/firm/70000001006369779" },
],
}),
});
const group = await res.json();
const groupId = group.id;
console.log(group.link_results);<?php
$base = 'https://api.rewio.ru/v2';
$key = 'hrev_ВАШ_КЛЮЧ';
$payload = json_encode([
'name' => 'Мой отель',
'links' => [
['url' => 'https://yandex.ru/maps/org/national/1020542995'],
['url' => 'https://2gis.ru/moscow/firm/70000001006369779'],
],
], JSON_UNESCAPED_UNICODE);
$ch = curl_init("$base/groups");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: $key", 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$group = json_decode(curl_exec($ch), true);
curl_close($ch);
$groupId = $group['id'];
print_r($group['link_results']);Какой адрес принимает каждая площадка, смотрите в Форматах ссылок.
Дождитесь сбора
Сбор стартует автоматически после создания объекта и обычно занимает несколько минут.
Состояние видно и у объекта целиком, и у каждой ссылки, в поле scrape_status:
pending– в очереди;in_progress– идёт;success– готово;partial– собрались не все площадки;failed– не получилось, причина вscrape_errorу ссылки.
# статус по всему объекту
curl https://api.rewio.ru/v2/groups/20 \
-H "X-API-Key: hrev_ВАШ_КЛЮЧ"
# или по каждой площадке отдельно
curl https://api.rewio.ru/v2/groups/20/links \
-H "X-API-Key: hrev_ВАШ_КЛЮЧ"import time
def wait_for_scrape(group_id, timeout_min=10):
"""Опрашивает раз в 30 секунд, пока сбор не закончится."""
for _ in range(timeout_min * 2):
group = requests.get(f"{BASE}/groups/{group_id}", headers=HEADERS).json()
if group["scrape_status"] in ("success", "partial", "failed"):
return group
time.sleep(30)
return group
group = wait_for_scrape(group_id)
print(group["scrape_status"], group["last_scraped_at"])const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function waitForScrape(groupId, timeoutMin = 10) {
for (let i = 0; i < timeoutMin * 2; i++) {
const res = await fetch(`${BASE}/groups/${groupId}`, { headers: HEADERS });
const group = await res.json();
if (["success", "partial", "failed"].includes(group.scrape_status)) return group;
await sleep(30_000);
}
}
const group = await waitForScrape(groupId);
console.log(group.scrape_status, group.last_scraped_at);<?php
function waitForScrape(string $base, string $key, int $groupId, int $timeoutMin = 10): array {
for ($i = 0; $i < $timeoutMin * 2; $i++) {
$group = rewio("$base/groups/$groupId", $key);
if (in_array($group['scrape_status'], ['success', 'partial', 'failed'], true)) {
return $group;
}
sleep(30);
}
return $group;
}
$group = waitForScrape($base, $key, $groupId);
echo $group['scrape_status'], ' ', $group['last_scraped_at'], PHP_EOL;Дальше объект обновляется сам, по расписанию. Чтобы узнавать о новых отзывах и ответах, не опрашивая нас, подпишитесь на вебхуки.
Получайте отзывы или аналитику
Получайте отзывы с помощью фильтров, агрегированную аналитику или аналитику по дням, неделям и месяцам.
# отзывы: свежие сначала, только с текстом
curl -G https://api.rewio.ru/v2/reviews \
-H "X-API-Key: hrev_ВАШ_КЛЮЧ" \
--data-urlencode "group_id=20" \
--data-urlencode "limit=20" \
--data-urlencode "has_text=true"
# или аналитика: средняя оценка, распределение, ответы организации
curl "https://api.rewio.ru/v2/analytics?group_id=20" \
-H "X-API-Key: hrev_ВАШ_КЛЮЧ"# отзывы: свежие сначала, только с текстом
reviews = requests.get(f"{BASE}/reviews", headers=HEADERS, params={
"group_id": group_id, "limit": 20, "has_text": True,
}).json()
print(f'{reviews["total"]} отзывов подходит под фильтры')
# или аналитика: средняя оценка, распределение, ответы организации
stats = requests.get(f"{BASE}/analytics", headers=HEADERS,
params={"group_id": group_id}).json()
summary = stats["summary"]
print(summary["avg_rating"], summary["rating_distribution"])
print("негатив без ответа:", summary["reply"]["unanswered_negative"])// отзывы: свежие сначала, только с текстом
const q = new URLSearchParams({ group_id: groupId, limit: 20, has_text: true });
const reviews = await (await fetch(`${BASE}/reviews?${q}`, { headers: HEADERS })).json();
console.log(reviews.total, reviews.data);
// или аналитика: средняя оценка, распределение, ответы организации
const stats = await (
await fetch(`${BASE}/analytics?group_id=${groupId}`, { headers: HEADERS })
).json();
console.log(stats.summary.avg_rating, stats.summary.rating_distribution);<?php
// отзывы: свежие сначала, только с текстом
$reviews = rewio("$base/reviews?group_id=$groupId&limit=20&has_text=true", $key);
echo $reviews['total'], ' отзывов подходит под фильтры', PHP_EOL;
// или аналитика: средняя оценка, распределение, ответы организации
$stats = rewio("$base/analytics?group_id=$groupId", $key);
echo $stats['summary']['avg_rating'], PHP_EOL;
echo 'негатив без ответа: ', $stats['summary']['reply']['unanswered_negative'], PHP_EOL;Отзывы приходят страницей: сами записи в data, а total и has_next говорят, сколько подходит
под фильтры и есть ли что дальше.
Все фильтры отзывов и все поля аналитики описаны в справочнике: отзывы, аналитика.