RevenueTales API Docs

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

  1. Get your API key from RevenueTales onboarding.
  2. Call pending reservations.
  3. Fetch details for each booking.
  4. Import to PMS.
  5. 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_id must 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_..."
  }
}
  • 401 missing, invalid, or inactive API key
  • 403 hotel not authorized for key
  • 404 reservation or event not found
  • 422 validation error
  • 500 internal 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.