PMS Integration API (v1)
This API allows PMS partners to pull reservations from RevenueTales and confirm successful import.
Base URL
https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1
Quickstart
- Get your API key from RevenueTales onboarding.
- Call pending reservations.
- Fetch details for each booking.
- Import to PMS.
- Confirm sync using event id.
Authentication and Authorization
- Header:
Authorization: Bearer <API_KEY> - Key must be active.
- Key is scoped to one hotel and one PMS.
hotel_idmust match key scope.
Sync Workflow
1) GET /reservations/pending
2) GET /reservations/{booking_id}
3) Import reservation in PMS
4) POST /reservations/{booking_id}/sync
Endpoint: List Pending Reservations
GET /api/v1/reservations/pending?hotel_id={hotel_id}&limit=100
curl -X GET "https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/pending?hotel_id=9b767697-4f60-4b78-b387-b6f69ccdb7bc&limit=100" \
-H "Authorization: Bearer <API_KEY>"
import requests
url = "https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/pending"
headers = {"Authorization": "Bearer "}
params = {
"hotel_id": "9b767697-4f60-4b78-b387-b6f69ccdb7bc",
"limit": 100,
}
response = requests.get(url, headers=headers, params=params, timeout=30)
print(response.status_code)
print(response.json())
const url = new URL("https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/pending");
url.searchParams.set("hotel_id", "9b767697-4f60-4b78-b387-b6f69ccdb7bc");
url.searchParams.set("limit", "100");
const response = await fetch(url, {
headers: { Authorization: "Bearer " }
});
console.log(response.status);
console.log(await response.json());
Endpoint: Reservation Details
GET /api/v1/reservations/{booking_id}?hotel_id={hotel_id}
curl -X GET "https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/d2f0ee30-f7aa-4d39-9df9-f181ec4cf5f9?hotel_id=9b767697-4f60-4b78-b387-b6f69ccdb7bc" \
-H "Authorization: Bearer <API_KEY>"
import requests
booking_id = "d2f0ee30-f7aa-4d39-9df9-f181ec4cf5f9"
url = f"https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/{booking_id}"
headers = {"Authorization": "Bearer "}
params = {"hotel_id": "9b767697-4f60-4b78-b387-b6f69ccdb7bc"}
response = requests.get(url, headers=headers, params=params, timeout=30)
print(response.status_code)
print(response.json())
const bookingId = "d2f0ee30-f7aa-4d39-9df9-f181ec4cf5f9";
const url = new URL(`https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/${bookingId}`);
url.searchParams.set("hotel_id", "9b767697-4f60-4b78-b387-b6f69ccdb7bc");
const response = await fetch(url, {
headers: { Authorization: "Bearer " }
});
console.log(response.status);
console.log(await response.json());
Endpoint: Confirm Reservation Sync
POST /api/v1/reservations/{booking_id}/sync
curl -X POST "https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/d2f0ee30-f7aa-4d39-9df9-f181ec4cf5f9/sync" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"event_id": "e4e4b3bc-4d2a-4b41-b8b8-69f4f5f51309",
"status": "success",
"pms_reference": "THEOVA-55521"
}'
import requests
booking_id = "d2f0ee30-f7aa-4d39-9df9-f181ec4cf5f9"
url = f"https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/{booking_id}/sync"
headers = {
"Authorization": "Bearer ",
"Content-Type": "application/json",
}
payload = {
"event_id": "e4e4b3bc-4d2a-4b41-b8b8-69f4f5f51309",
"status": "success",
"pms_reference": "THEOVA-55521",
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
print(response.status_code)
print(response.json())
const bookingId = "d2f0ee30-f7aa-4d39-9df9-f181ec4cf5f9";
const response = await fetch(
`https://travelagents-pms-integration-670805103288.europe-west1.run.app/api/v1/reservations/${bookingId}/sync`,
{
method: "POST",
headers: {
Authorization: "Bearer ",
"Content-Type": "application/json"
},
body: JSON.stringify({
event_id: "e4e4b3bc-4d2a-4b41-b8b8-69f4f5f51309",
status: "success",
pms_reference: "THEOVA-55521"
})
}
);
console.log(response.status);
console.log(await response.json());
Error Handling
{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid API key",
"request_id": "req_..."
}
}
401missing, invalid, or inactive API key403hotel not authorized for key404reservation or event not found422validation error500internal error
Data Models
- sync_type:
NEW,MOD,CL - sync_status:
PENDING,ACKNOWLEDGED,FAILED,BLOCKED
Go Live Checklist
- Validate auth and hotel scope with test key.
- Run full flow: pending -> details -> sync.
- Test idempotent retries for sync confirmation.
- Monitor error rates and latency.