Review Reply API
Generate professional hotel review responses using the RR trained Qwen model. The API accepts reviews from any OTA or review platform.
https://rr-api.reputationsystems.ai/api/v1/rr/repliesAuthentication
Create a live key in the API Keys dashboard at https://rr.reputationsystems.ai. Choose Server or API client for backend integrations, or Chrome extension for the RR extension. The complete secret is displayed once. Send it in the X-Api-Key header.
X-Api-Key: rr_live_your_secret_key
Bearer authentication is also accepted:
Authorization: Bearer rr_live_your_secret_key
Generate a reply
cURL
curl -X POST "https://rr-api.reputationsystems.ai/api/v1/rr/replies" \
-H "X-Api-Key: $RR1_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"review": "The room was spotless and the staff was wonderful, but the hallway was noisy.",
"rating": 4,
"reviewerName": "Alex",
"tone": "professional",
"managerName": "Jordan Lee",
"managerTitle": "General Manager",
"hotelName": "Example Hotel",
"platform": "Google",
"language": "en",
"allowEmoji": false
}'
JavaScript
const response = await fetch(
"https://rr-api.reputationsystems.ai/api/v1/rr/replies",
{
method: "POST",
headers: {
"X-Api-Key": process.env.RR1_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
review: "Wonderful stay and helpful staff.",
rating: 5,
tone: "professional"
})
}
);
if (!response.ok) throw new Error(`RR API error: ${response.status}`);
const { reply } = await response.json();
Python
import os
import requests
response = requests.post(
"https://rr-api.reputationsystems.ai/api/v1/rr/replies",
headers={"X-Api-Key": os.environ["RR1_API_KEY"]},
json={
"review": "Wonderful stay and helpful staff.",
"rating": 5,
"tone": "professional"
},
timeout=60
)
response.raise_for_status()
print(response.json()["reply"])
Java
var request = java.net.http.HttpRequest.newBuilder()
.uri(java.net.URI.create(
"https://rr-api.reputationsystems.ai/api/v1/rr/replies"))
.header("X-Api-Key", System.getenv("RR1_API_KEY"))
.header("Content-Type", "application/json")
.POST(java.net.http.HttpRequest.BodyPublishers.ofString(
"{\"review\":\"Wonderful stay and helpful staff.\",\"rating\":5," +
"\"tone\":\"professional\"}"))
.build();
var response = java.net.http.HttpClient.newHttpClient().send(
request, java.net.http.HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
throw new IllegalStateException("RR API error: " + response.statusCode());
}
System.out.println(response.body());
Request fields
| Field | Type | Description |
|---|---|---|
review REQUIRED | string | Guest review text, 1–10,000 characters. |
rating | number or string | Rating such as 4, 4/5, or 8/10. |
reviewerName | string | Guest name used for a personalized greeting. |
tone | string | Desired style, for example professional, warm, or concise. |
managerName | string | Name included in the reply signature. |
managerTitle | string | Title included in the reply signature. |
hotelName | string | Property name used for context. |
platform | string | Source platform, such as Google, Booking.com, Expedia, Tripadvisor, or any OTA. |
language | string | Reply language code, for example en, es, or fr. |
allowEmoji | boolean | Whether the generated reply may include emoji. Defaults to false. |
Successful response
HTTP 200 OK
{
"reply": "Thank you for sharing your experience...",
"model": "qwen3-8b-review-v5",
"provider": "local-trained-qwen",
"createdAt": "2026-08-25T16:30:00Z"
}
Pricing and usage
RR costs $5.00 per 1,000 successfully generated replies, equivalent to $0.005 per reply. Failed requests are not charged. Usage and estimated cost are available in the Usage tab.
| Plan | Monthly price | Included replies | RPM / RPD |
|---|---|---|---|
| Free | $0 | 100 | 10 / 100 |
| Starter | $25 | 5,000 | 60 / 1,000 |
| Growth | $100 | 20,000 | 300 / 10,000 |
| Scale | $250 | 50,000 | 1,000 / 50,000 |
Every successful response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. A rejected request returns HTTP 429 with Retry-After.
Errors
| Status | Meaning | Action |
|---|---|---|
| 400 | The review is missing or invalid. | Send a review containing 1–10,000 characters. |
| 401 | The API key is missing, invalid, or revoked. | Check the header or create a new key. |
| 503 | The trained model is temporarily unavailable. | Retry with exponential backoff. |
API-key security
- Keep keys on your server. Never expose them in browser or extension source code.
- Store keys in a secret manager or environment variable, not in source control.
- Use separate live keys for each application or environment so each can be revoked independently.
- Server/API keys enforce your account IP allowlist. Chrome-extension keys skip IP allowlisting because browser addresses change, but remain subject to authentication, expiration, revocation, rate limits, and usage tracking.
- Create a Chrome-extension key while signed in to RR; the website connects it to the installed extension without copying or pasting. Never embed a key in the extension package or page source.
- Revoke a key immediately if it may have been exposed.
- The dashboard shows each complete key only once.