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