API Reference

v5.9.3.3 — Every endpoint with request fields, response fields, and examples

How to read this reference

Base URL: /API/{controller}/V1/{action}.json — All responses are JSON unless noted.

Conventions: POST bodies are application/json. Path parameters appear in the URL. Query parameters are optional unless marked required. Field aliases (e.g. serviceID for propertyId) are accepted where noted.
// JavaScript (website/src/js/api.js)
const quote = await RpmApi.quote({
  propertyId: 2001,
  dateFrom: '2026-08-01',
  dateTo: '2026-08-07',
  adults: 2
});

// cURL
curl -s "https://your-site.com/API/vrProperties/V1/vrProperties/2001.json"
AI agents: Fetch /APIDocs/agents.php (Markdown) instead of parsing this HTML page. See For AI Agents for details.

Admin Authentication Admin

Controller: auth · Establishes wlSession for admin* endpoints. Login is public; user requires session.

POST/API/auth/V1/login.json Public

Admin API key login; sets wlSession.

Request body (JSON)
FieldTypeRequiredDescription
adminAPIKeystringYesFrom admins table
adminAPISecretstringYesAPI secret
Response fields
FieldTypeRequiredDescription
adminIdintNoAdmin ID
adminFirstNamestringNoFirst name
adminLastNamestringNoLast name
adminRolestringNo0=super, 1=landlord, 2=svc_rep, 3=HK
superuserstringNoSuperuser flag
Example request
{ "adminAPIKey": "your-key", "adminAPISecret": "your-secret" }

HTTP errors: 401 Invalid credentials

GET/API/auth/V1/user.json Admin

Current admin session.

HTTP errors: 401 Unauthorized

Admin Properties Admin

Controller: adminProperties · Service: CatalogService::adminListProperties / adminGetPropertyById

GET/API/adminProperties/V1/properties.json Admin

List all properties (LTR+VR by default). Includes archived/off-website unless filtered.

Service: rpm_property_catalog_service()

Roles: super_admin, svc_rep, landlord (read, own properties)

Query parameters
FieldTypeRequiredDescription
typestringNoall (default), ltr, or vr catalog mode
pageintNoPage number (default 1)
limitintNoPer page (default 20, max 100)
includeArchivedstringNo1 = include archived properties
onWebsitestringNo0 or 1 to filter onWebsite flag
searchstringNoName/address search (max 128 chars)
bedsstringNoBedroom filter
bathsstringNoBathroom filter
locationstringNoAddress search
propertyTypestringNopropertyType filter (when in list mode)
petsstringNo1 = pets allowed only
featuredstringNo1 = featured VR listings only
Response fields
FieldTypeRequiredDescription
itemsarrayNoProperty objects with isArchived
pageintNoCurrent page
limitintNoPage size
totalintNoTotal matching properties
ltrTotalintNoLTR count when type=all
vrTotalintNoVR count when type=all

HTTP errors: 401 Unauthorized, 403 Forbidden (wrong role)

GET/API/adminProperties/V1/properties/{id}.json Admin

Single property by ID (LTR or VR).

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 404 Property not found

GET/API/adminProperties/V1/property/{id}.json Admin

Alias for single property by ID.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 404 Property not found

POST/API/adminProperties/V1/properties.json Admin

Create LTR or VR property (type field).

Service: CatalogService::adminCreateProperty()

Roles: super_admin

Request body (JSON)
FieldTypeRequiredDescription
typestringYesltr or vr
propertyNamestringYesUnique property name (max 128)
propertyDescstringYesDescription (max 5000)
propertyRatestringYesNightly/monthly rate
latePenaltystringNoRequired for LTR; default 0.00 for VR
propertyDepositstringNoRequired for LTR
petsAllowedintNo0 or 1
landlordintNoLandlord adminId (default: caller)
propertyAddressstringNoStreet address
propertyLocationstringNoVR location label
Response fields
FieldTypeRequiredDescription
propertyIdintNoNew property ID
typestringNoltr or vr

HTTP errors: 400 validation, 401, 403, 409 duplicate name

PUT/API/adminProperties/V1/properties/{id}.json Admin

Update whitelisted property fields.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYespropertyId
Request body (JSON)
FieldTypeRequiredDescription
propertyNamestringNoMutable name
propertyDescstringNoDescription
propertyRatestringNoRate
onWebsiteintNo0 or 1
isArchivedintNo0 or 1 soft-archive

HTTP errors: 400 unknown fields, 404, 409 duplicate name

PUT/API/adminProperties/V1/property/{id}.json Admin

Alias for property update.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 400, 404

DELETE/API/adminProperties/V1/properties/{id}.json Admin

Soft-archive property (isArchived=1). Blocked when active future VR reservations exist.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 404, 409 blocking dependencies

DELETE/API/adminProperties/V1/property/{id}.json Admin

Alias for property archive.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 404, 409

Admin Invoices Admin

Controller: adminInvoices · Service: rpm_finance_invoice_service()

GET/API/adminInvoices/V1/invoices.json Admin

List invoices with optional filters (excludes drafts unless status=9).

Service: InvoiceService::listInvoices()

Roles: super_admin, svc_rep, landlord (read, own properties)

Query parameters
FieldTypeRequiredDescription
tenantIdintNoFilter by tenant
propertyIdintNoFilter by property
statusintNo0=Unpaid, 1=Paid, 2=Refunded, 3=Processing, 5=Cancelled, 7=Void, 9=Draft
dateFromstringNoInvoice date >= (YYYY-MM-DD)
dateTostringNoInvoice date <= (YYYY-MM-DD)
searchstringNoID, description, tenant name/email
pageintNoPage (default 1)
limitintNoPer page (default 20, max 100)
Response fields
FieldTypeRequiredDescription
itemsarrayNoInvoice summary rows
items[].statusLabelstringNoHuman-readable status
pageintNoCurrent page
totalintNoTotal matches

HTTP errors: 401, 403

GET/API/adminInvoices/V1/invoices/{id}.json Admin

Single invoice with line items and computed totals.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYesInvoice ID
Response fields
FieldTypeRequiredDescription
lineItemsarrayNoinvoiceItems rows
subtotalComputedfloatNoSum of line items
totalComputedfloatNoTotal with tax
paidComputedfloatNoSettled payments

HTTP errors: 404 Invoice not found

GET/API/adminInvoices/V1/invoice/{id}.json Admin

Alias for single invoice.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYesInvoice ID

HTTP errors: 404 Invoice not found

POST/API/adminInvoices/V1/invoices.json Admin

Create invoice with optional line items.

Service: InvoiceService::adminCreateInvoice()

Roles: super_admin

Request body (JSON)
FieldTypeRequiredDescription
descriptionstringYesRENT|BOOKING|HOUSEKEEPING|SERVICE|DEPOSIT|ADJUSTMENT|OWNER
tenantIdintNoInvoicee tenant (or use adminId)
adminIdintNoInvoicee admin/landlord
propertyIdintNoLinked property
dueDatestringYesYYYY-MM-DD
taxfloatNoTax rate %
tax2floatNoSecond tax rate %
statusintNoInvoice status (default 0)
lineItemsarrayNo[{description, amount, quantity, taxed}]

HTTP errors: 400 validation, 401, 403

PUT/API/adminInvoices/V1/invoices/{id}.json Admin

Update invoice header and append line items.

Service: InvoiceService::adminUpdateInvoice()

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesInvoice ID
Request body (JSON)
FieldTypeRequiredDescription
statusintNo0–9 status codes
taxfloatNoTax rate %
descriptionstringNoInvoice type
lineItemsarrayNoAdditional line items to append

HTTP errors: 400, 404

Calls rpm_refresh_invoice_totals() and rpm_sync_invoice_payment_state() after mutation.
PUT/API/adminInvoices/V1/invoice/{id}.json Admin

Alias for invoice update.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesInvoice ID

HTTP errors: 404

DELETE/API/adminInvoices/V1/invoices/{id}.json Admin

Cancel invoice (status=5) when no settled payments. Reverses journal entry.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesInvoice ID

HTTP errors: 404, 409 settled payments

DELETE/API/adminInvoices/V1/invoice/{id}.json Admin

Alias for invoice cancel.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesInvoice ID

HTTP errors: 404, 409

Admin Tenants Admin

Controller: adminTenants · Service: rpm_admin_tenant_service()

GET/API/adminTenants/V1/tenants.json Admin

List tenants (paginated, searchable by email/name).

Service: TenantService::listTenants()

Roles: super_admin, svc_rep, landlord (read, own properties)

Query parameters
FieldTypeRequiredDescription
searchstringNoEmail or name search
isActivestringNo0 or 1
pageintNoPage (default 1)
limitintNoPer page (default 20, max 100)

HTTP errors: 401, 403

GET/API/adminTenants/V1/tenants/{id}.json Admin

Single tenant profile (decrypted contact fields when available).

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYestenantId

HTTP errors: 404 Tenant not found

GET/API/adminTenants/V1/tenant/{id}.json Admin

Alias for single tenant.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYestenantId

HTTP errors: 404 Tenant not found

POST/API/adminTenants/V1/tenants.json Admin

Create tenant account (bcrypt password).

Service: TenantService::adminCreateTenant()

Roles: super_admin

Request body (JSON)
FieldTypeRequiredDescription
tenantEmailstringYesUnique email
tenantFirstNamestringYesFirst name
tenantLastNamestringYesLast name
passwordstringYesPlain password (hashed via rpm_password_hash)
isActiveintNo0 or 1 (default 0)
tenantPhonestringNoEncrypted at rest

HTTP errors: 400, 409 duplicate email

PUT/API/adminTenants/V1/tenants/{id}.json Admin

Update tenant profile fields.

Service: TenantService::adminUpdateTenant()

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYestenantId
Request body (JSON)
FieldTypeRequiredDescription
tenantFirstNamestringNoFirst name
isActiveintNo0 or 1
passwordstringNoNew password (rpm_password_hash)

HTTP errors: 400, 404

PUT/API/adminTenants/V1/tenant/{id}.json Admin

Alias for tenant update.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYestenantId

HTTP errors: 404

DELETE/API/adminTenants/V1/tenants/{id}.json Admin

Deactivate tenant (isActive=0). Not a hard SQL delete.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYestenantId

HTTP errors: 404

DELETE/API/adminTenants/V1/tenant/{id}.json Admin

Alias for tenant deactivate.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYestenantId

HTTP errors: 404

Admin Reservations Admin

Controller: adminReservations · Service: rpm_booking_reservation_service()

GET/API/adminReservations/V1/reservations.json Admin

List VR reservations with optional filters.

Service: ReservationService::listReservations()

Roles: super_admin, svc_rep, landlord (read, own properties)

Query parameters
FieldTypeRequiredDescription
propertyIdintNoFilter by VR property (serviceID)
tenantIdintNoFilter by linked tenant
statusstringNoReservation status code
dateFromstringNoStay start >= (YYYY-MM-DD)
dateTostringNoStay end <= (YYYY-MM-DD)
searchstringNoGuest name, email, or reservation ID
pageintNoPage (default 1)
limitintNoPer page (default 20, max 100)

HTTP errors: 401, 403

GET/API/adminReservations/V1/reservations/{id}.json Admin

Single reservation with stay dates.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYesReservation ID

HTTP errors: 404 Reservation not found

GET/API/adminReservations/V1/reservation/{id}.json Admin

Alias for single reservation.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYesReservation ID

HTTP errors: 404 Reservation not found

POST/API/adminReservations/V1/reservations.json Admin

Create VR reservation (admin path; no public CAPTCHA).

Service: ReservationService::createReservation()

Roles: super_admin

Request body (JSON)
FieldTypeRequiredDescription
propertyIdintYesVR property (serviceID)
dateFromstringYesStay start YYYY-MM-DD
dateTostringYesStay end YYYY-MM-DD
namestringYesGuest name
emailstringYesGuest email
totalPricefloatNoBooking total
statusstringNoReservation status (default 1)
skipAvailabilityCheckboolNoBypass availability validation
adminBlockstringNoAdmin block flag

HTTP errors: 400 dates unavailable, 401, 403

PUT/API/adminReservations/V1/reservations/{id}.json Admin

Update reservation status and/or stay dates.

Service: ReservationService::adminUpdateReservation()

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesReservation ID
Request body (JSON)
FieldTypeRequiredDescription
statusstringNoNew status code
dateFromstringNoNew stay start
dateTostringNoNew stay end
totalPricefloatNoUpdated total

HTTP errors: 404, 409 dates unavailable

PUT/API/adminReservations/V1/reservation/{id}.json Admin

Alias for reservation update.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesReservation ID

HTTP errors: 404

DELETE/API/adminReservations/V1/reservations/{id}.json Admin

Cancel reservation (status=3). Cancels unpaid linked invoices; retains paid invoices.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesReservation ID

HTTP errors: 404, 409 already cancelled

DELETE/API/adminReservations/V1/reservation/{id}.json Admin

Alias for reservation cancel.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesReservation ID

HTTP errors: 404, 409

Admin Expenses Admin

Controller: adminExpenses · Service: rpm_finance_expense_service()

GET/API/adminExpenses/V1/expenses.json Admin

List expenses with filters.

Roles: super_admin, svc_rep, landlord (read, own properties)

Query parameters
FieldTypeRequiredDescription
propertyIdintNoFilter by property
statusintNo0=Unpaid, 1=Paid, 3=Cancelled, 9=Draft
dateFromstringNoExpense date >=
dateTostringNoExpense date <=
pageintNoPage (default 1)
limitintNoPer page (max 100)

HTTP errors: 401, 403

GET/API/adminExpenses/V1/expenses/{id}.json Admin

Single expense with line items and computed totals.

Roles: super_admin, svc_rep, landlord (read, own properties)

Path parameters
FieldTypeRequiredDescription
idintYesExpense ID

HTTP errors: 404

POST/API/adminExpenses/V1/expenses.json Admin

Create expense with optional line items.

Roles: super_admin

Request body (JSON)
FieldTypeRequiredDescription
descriptionstringYesRENT|BOOKING|HOUSEKEEPING|SERVICE|OWNER|ADJUSTMENT
paytoIdstringYesPayee selector (admin or vendor id)
dueDatestringYesYYYY-MM-DD
propertyIdintNoLinked property
lineItemsarrayNoLine items to append

HTTP errors: 400, 403

PUT/API/adminExpenses/V1/expenses/{id}.json Admin

Update expense header and append line items.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesExpense ID

HTTP errors: 400, 404

DELETE/API/adminExpenses/V1/expenses/{id}.json Admin

Cancel expense (status=3) when no settled payments.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesExpense ID

HTTP errors: 404, 409 settled payments

Admin Housekeeping Admin

Controller: adminHousekeeping · Service: rpm_housekeeping_service()

GET/API/adminHousekeeping/V1/requests.json Admin

List housekeeping requests.

Roles: super_admin, svc_rep

Query parameters
FieldTypeRequiredDescription
propertyIdintNoFilter by property
statusintNoRequest status (6=archived excluded by default)
assignedTointNoHousekeeper adminId
dateFromstringNoRequest date >=
dateTostringNoRequest date <=

HTTP errors: 401, 403

GET/API/adminHousekeeping/V1/requests/{id}.json Admin

Single housekeeping request.

Roles: super_admin, svc_rep

Path parameters
FieldTypeRequiredDescription
idintYesrequestId

HTTP errors: 404

POST/API/adminHousekeeping/V1/requests.json Admin

Create housekeeping request.

Roles: super_admin

Request body (JSON)
FieldTypeRequiredDescription
propertyIdintYesProperty ID
requestTitlestringYesRequest title
requestDatestringNoScheduled date

HTTP errors: 400, 403

PUT/API/adminHousekeeping/V1/requests/{id}.json Admin

Update housekeeping request fields.

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesrequestId

HTTP errors: 404

DELETE/API/adminHousekeeping/V1/requests/{id}.json Admin

Archive request (requestStatus=6).

Roles: super_admin

Path parameters
FieldTypeRequiredDescription
idintYesrequestId

HTTP errors: 404, 409 already archived

Admin Reports Admin

Controller: adminReports · Service: rpm_finance_report_service() — read-only

GET/API/adminReports/V1/income.json Admin

Income summary from settled transactions (amountin) in date range.

Roles: super_admin, svc_rep

Query parameters
FieldTypeRequiredDescription
dateFromstringYesYYYY-MM-DD
dateTostringYesYYYY-MM-DD
propertyIdintNoOptional property filter
Response fields
FieldTypeRequiredDescription
totalIncomefloatNoSum of income transactions
transactionCountintNoMatching rows

HTTP errors: 400 missing dates, 403

GET/API/adminReports/V1/occupancy.json Admin

VR occupancy summary — booked nights per property.

Roles: super_admin, svc_rep

Query parameters
FieldTypeRequiredDescription
dateFromstringYesStay checkout >=
dateTostringYesStay checkout <=
propertyIdintNoOptional VR property filter
Response fields
FieldTypeRequiredDescription
itemsarrayNoPer-property occupancy rows
totalNightsintNoGrand total nights

HTTP errors: 400, 403

Tenant Authentication Public

Controller: publicAuth · PHP session cookie (Secure, HttpOnly, SameSite=Lax). Requires HTTPS in production; set RPM_FORCE_HTTPS=1 to redirect HTTP.

POST/API/publicAuth/V1/login.json Public

Authenticate tenant; sets session (tenantId, propertyId, leaseId).

Request body (JSON)
FieldTypeRequiredDescription
emailstringYestenantEmail alias accepted
passwordstringYesPlain password
Response fields
FieldTypeRequiredDescription
successboolNotrue
user.tenantIdintNoTenant ID
user.tenantEmailstringNoEmail
user.tenantFirstNamestringNoFirst name
user.tenantLastNamestringNoLast name
Example request
{ "email": "guest@example.com", "password": "your-password" }
Example response
{
  "success": true,
  "user": {
    "tenantId": 15,
    "tenantEmail": "guest@example.com",
    "tenantFirstName": "Jane",
    "tenantLastName": "Guest"
  }
}

HTTP errors: 400 missing fields, 401 invalid credentials, 403 inactive account, 429 lockout (5 failures / 15 min per IP and email)

POST/API/publicAuth/V1/logout.json Public

Destroy tenant session.

Response fields
FieldTypeRequiredDescription
successboolNotrue
GET/API/publicAuth/V1/me.json Session

Current tenant session data.

Response fields
FieldTypeRequiredDescription
tenantIdintNoSession tenant
tenantEmailstringNoEmail
tenantFirstNamestringNoFirst name
tenantLastNamestringNoLast name
propertyIdintNoLinked property
leaseIdintNoActive lease

HTTP errors: 401 Not authenticated

POST/API/publicAuth/V1/register.json Public

Register new tenant; sends activation email.

Request body (JSON)
FieldTypeRequiredDescription
tenantFirstNamestringYesFirst name
tenantLastNamestringYesLast name
tenantEmailstringYesnewEmail alias
passwordstringYespassword1 alias
password2stringNoConfirmation
tenantAddressstringNoEncrypted at rest
tenantCitystringNoEncrypted
tenantStatestringNoEncrypted
tenantZipstringNoEncrypted
tenantCountrystringNoEncrypted
tenantPhonestringNoEncrypted
tenantAltPhonestringNoEncrypted
applyToLeaseIdintNoPost-activation lease redirect
isEmptystringNoHoneypot — must be empty
Response fields
FieldTypeRequiredDescription
successboolNotrue
activateUrlstringNoActivation link sent by email

HTTP errors: 400 validation, 409 email exists, 500 registration failure

GET/API/publicAuth/V1/activate.json Public

Activate account via email link; starts session.

Query parameters
FieldTypeRequiredDescription
tenantEmailstringYesAccount email
hashstringYesActivation token
applyToLeaseIdintNoOptional lease redirect
Response fields
FieldTypeRequiredDescription
successboolNotrue
userobjectNoTenant profile
applyToLeaseIdintNoEcho of query param

HTTP errors: 400 invalid link, 429 rate limited (10/hour per IP)

VR Properties Public

Controller: vrProperties · Service: CatalogService (Vrproperties table)

GET/API/vrProperties/V1/vrProperties.json Public

List vacation rental properties visible on website.

Query parameters
FieldTypeRequiredDescription
pageintNoPage number (default 1)
limitintNoPer page (default 20, max 100)
bedsstringNoBedroom filter (alias bedrooms)
bathsstringNoBathroom filter
locationstringNoAddress search (max 128 chars)
searchstringNoName/address search (max 128 chars)
typestringNopropertyType filter
petsstringNo1 = pets allowed only
featuredstringNo1 = featured listings only
Response fields
FieldTypeRequiredDescription
itemsarrayNoProperty objects
pageintNoCurrent page
limitintNoPage size
totalintNoTotal matching properties
items[].propertyIdintNoID (>1999 for VR)
items[].propertyNamestringNoName
items[].propertyDescstringNoDescription HTML
items[].propertyAddressstringNoAddress
items[].propertyLocationstringNoLocation label
items[].propertyRatefloatNoNightly rate
items[].propertyWeekendRatefloatNoWeekend rate
items[].propertyDepositfloatNoSecurity deposit
items[].petsAllowedstringNoYes/No
items[].propertyAmenitiesstringNoAmenities list
items[].bedroomsstringNoBedroom count
items[].bathroomsstringNoBathroom count
items[].propertyBookingFeefloatNoBooking fee
items[].housekeepingFeefloatNoCleaning fee
items[].petFeefloatNoPer-pet fee
items[].featuredImagestringNoPrimary image filename
items[].isFeaturedintNoFeatured flag
items[].seoTitlestringNoSEO title
items[].seoDescstringNoSEO description
Example response
{
  "items": [{ "propertyId": 2001, "propertyName": "Lake View Cabin", "propertyRate": 189.00, "bedrooms": "3", "featuredImage": "lake.jpg" }],
  "page": 1,
  "limit": 20,
  "total": 45
}
GET/API/vrProperties/V1/vrProperties/{id}.json Public

Single VR property with all catalog fields.

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 404 Property not found

GET/API/vrProperties/V1/vrPropertyImages.json Public

All VR property images.

Response fields
FieldTypeRequiredDescription
pictureIdintNoImage ID
propertyIdintNoProperty FK
pictureNamestringNoAlt text
pictureUrlstringNoFilename
isFeaturedintNo1 = featured
pictureOrderintNoSort order
pictureDatestringNoFormatted upload date
GET/API/vrProperties/V1/vrPropertyImages/{propertyId}.json Public

Images for one VR property.

Path parameters
FieldTypeRequiredDescription
propertyIdintYesProperty ID

LTR Properties Public

Controller: ltrProperties · properties table

GET/API/ltrProperties/V1/ltrProperties.json Public

List long-term rental properties (same filters as VR).

Query parameters
FieldTypeRequiredDescription
pageintNoPage (default 1)
limitintNoPer page (max 100)
bedsstringNoBedroom filter
searchstringNoSearch term (max 128 chars)
Response fields
FieldTypeRequiredDescription
itemsarrayNoLTR properties (no VR-only fields)
items[].propertyIdintNoID
items[].propertyNamestringNoName
items[].propertyRatefloatNoMonthly rent
items[].propertyDepositfloatNoDeposit
items[].availOnstringNoAvailable date
items[].featuredImagestringNoPrimary image
GET/API/ltrProperties/V1/ltrProperties/{id}.json Public

Single LTR property.

Path parameters
FieldTypeRequiredDescription
idintYespropertyId

HTTP errors: 404 Property not found

GET/API/ltrProperties/V1/ltrPropertyImages/{propertyId}.json Public

Images from propertypictures table.

Path parameters
FieldTypeRequiredDescription
propertyIdintYesProperty ID

Public Booking Public

Controller: publicBooking · Booking PSR-4 services

GET/API/publicBooking/V1/availability/{propertyId}.json Public

Check if date range is bookable with pricing preview.

Path parameters
FieldTypeRequiredDescription
propertyIdintYesVR property ID
Query parameters
FieldTypeRequiredDescription
dateFromstringYesYYYY-MM-DD (alias from)
dateTostringYesYYYY-MM-DD (alias to)
Response fields
FieldTypeRequiredDescription
availableboolNotrue if bookable
messagestringNoReason if unavailable
pricefloatNoTotal stay price when available
nightRatesarrayNoPer-night breakdown
intervalsintNoNight count
spotsintNoRemaining capacity
Example request
GET /API/publicBooking/V1/availability/2001.json?dateFrom=2026-08-01&dateTo=2026-08-07
Example response
{
  "available": true,
  "message": "",
  "price": 1134.00,
  "nightRates": [{ "date": "2026-08-01", "rate": 189.00 }],
  "intervals": 6,
  "spots": 1
}

HTTP errors: 400 missing propertyId or dates

GET/API/publicBooking/V1/calendar/{propertyId}.json Public

Calendar data: blocked ranges and per-day prices.

Path parameters
FieldTypeRequiredDescription
propertyIdintYesVR property
Query parameters
FieldTypeRequiredDescription
monthsintNoForward months (default 12, max 24)
Response fields
FieldTypeRequiredDescription
propertyIdintNoProperty
todaystringNoServer date YYYY-MM-DD
untilstringNoRange end date
rangesarrayNoBlocked/reserved date ranges
baseRatefloatNoDefault nightly rate
weekendRatefloatNoWeekend rate
dayPricesobjectNoMap of date → price
Example response
{
  "propertyId": 2001,
  "today": "2026-07-13",
  "until": "2027-07-13",
  "ranges": [{ "start": "2026-08-10", "end": "2026-08-15", "type": "reservation" }],
  "baseRate": 189.00,
  "weekendRate": 225.00,
  "dayPrices": { "2026-08-01": 189.00, "2026-08-02": 225.00 }
}
POST/API/publicBooking/V1/quote.json Public

Full quote with fees, taxes, and coupon.

Service: QuoteCalculator::buildQuote()

Request body (JSON)
FieldTypeRequiredDescription
propertyIdintYesserviceID alias
dateFromstringYesCheck-in YYYY-MM-DD
dateTostringYesCheck-out YYYY-MM-DD
adultsintNoGuest count (bAdults alias, default 1)
childrenintNobChildren alias
petsintNobPets alias
couponCodestringNoOptional discount code
extraRoomsarrayNoAdditional room prices
Response fields
FieldTypeRequiredDescription
propertyIdintNoProperty
dateFromstringNoCheck-in
dateTostringNoCheck-out
nightsintNoNight count
subtotalfloatNoRoom subtotal
discountfloatNoCoupon discount
couponAppliedboolNoCoupon valid
cleaningFeefloatNoHousekeeping
damageWaiverfloatNoDamage waiver
bookingFeefloatNoBooking fee
peopleFeesfloatNoExtra guest fees
petFeefloatNoPet fees
taxRatefloatNoCombined tax %
taxfloatNoTax amount
totalfloatNoGrand total
lineItemsarrayNo{ label, amount } breakdown
nightRatesarrayNoPer-night rates
Example request
{
  "propertyId": 2001,
  "dateFrom": "2026-08-01",
  "dateTo": "2026-08-07",
  "adults": 2,
  "children": 0,
  "pets": 0,
  "couponCode": "SUMMER10"
}
Example response
{
  "propertyId": 2001,
  "nights": 6,
  "subtotal": 1134.00,
  "discount": 113.40,
  "couponApplied": true,
  "cleaningFee": 150.00,
  "tax": 98.50,
  "total": 1269.10,
  "lineItems": [
    { "label": "6 nights", "amount": 1134.00 },
    { "label": "Discount", "amount": -113.40 },
    { "label": "Cleaning fee", "amount": 150.00 }
  ]
}
POST/API/publicBooking/V1/validateCoupon.json Public

Validate coupon without full quote.

Request body (JSON)
FieldTypeRequiredDescription
propertyIdintYesProperty
couponCodestringYesCode to check
Response fields
FieldTypeRequiredDescription
validboolNoCoupon accepted
typestringNoabs or percent
valuefloatNoDiscount value
messagestringNoStatus message
POST/API/publicBooking/V1/book.json Public

Create reservation when tenant session or verified guest email + CAPTCHA.

Service: ApiSecurityPolicy::assertBookingAllowed(), ReservationService::createReservation()

Request body (JSON)
FieldTypeRequiredDescription
propertyIdintYesVR property
dateFromstringYesCheck-in (max 10 chars)
dateTostringYesCheck-out (max 10 chars)
namestringNoGuest name (max 128)
emailstringNoGuest email — required for guest booking
captchaTokenstringNoTurnstile/reCAPTCHA token when provider is not builtin
captchastringNoBuiltin math answer when apiCaptchaProvider=builtin
captcha_sumstringNomd5(answer) for builtin provider
phonestringNoPhone (max 40)
addressstringNobAddress alias
citystringNobCity alias
statestringNobState alias
zipstringNobZip alias
adultsintNoGuest count
childrenintNoChildren count
petsintNoPet count
couponCodestringNoCoupon
tenantIdintNoLinked tenant if logged in
extraRoomsarrayNoExtra room selections
Response fields
FieldTypeRequiredDescription
successboolNotrue when reservation created
requiresPortalboolNotrue if name/email missing
orderIdintNoBooking order ID
invoiceIdint|nullNoInvoice if total > 0
tenantIdintNoAssociated tenant
quoteobjectNoFull quote object
messagestringNoNext-step instructions
Example request
{
  "propertyId": 2001,
  "dateFrom": "2026-08-01",
  "dateTo": "2026-08-07",
  "name": "Jane Guest",
  "email": "jane@example.com",
  "phone": "555-0100",
  "adults": 2
}
Example response
{
  "success": true,
  "orderId": 8842,
  "invoiceId": 1205,
  "tenantId": 0,
  "quote": { "total": 1269.10 },
  "message": "Reservation and invoice created. Complete payment via the guest portal."
}
Requires tenant session OR guest email + CAPTCHA per apiPolicy in settings.json. Rate limited (429). Without name/email returns { requiresPortal: true, quote } directing to users/booking-home.php.

Lease Applications Session

POST/API/leaseApplications/V1/apply.json Session

Submit LTR lease application for logged-in tenant.

Request body (JSON)
FieldTypeRequiredDescription
propertyIdintYesLTR property to apply for
Response fields
FieldTypeRequiredDescription
successboolNotrue
applicationIdintNoleaseApplications insert ID

HTTP errors: 401 Login required, 400 missing propertyId

Site Settings Public

Controller: siteSettings · Service: rpm_site_settings_service()

GET/API/siteSettings/V1/settings.json Public

Returns public site configuration and API security policy (secrets excluded).

Service: SiteSettingsService::settings(), ApiSecurityPolicy::publicPolicy()

Response fields
FieldTypeRequiredDescription
installUrlstringNoSite base URL
logoUrlstringNoLogo path/URL
siteNamestringNoDisplay name
businessNamestringNoLegal business name
businessAddressstringNoBusiness address
businessEmailstringNoContact email
businessPhonestringNoBusiness phone
businessTaxIdstringNoTax ID — only when apiExposeBusinessTaxId enabled in admin
contactPhonestringNoPublic contact phone
localizationstringNoLocale code
paymentCurrencystringNoCurrency code
siteTypestringNoSite type
siteCategorystringNoSite category
systemTimeZonestringNoPHP timezone
systemDateFormatstringNoDate format
vrCheckInTimestringNoDefault VR check-in
vrCheckOutTimestringNoDefault VR check-out
paymentCompleteMsgstringNoPayment success message
paymentEmailstringNoPayment notification email
uploadPathstringNoOnly when apiExposeInternalPaths legacy opt-in
VruploadPathstringNoOnly when apiExposeInternalPaths legacy opt-in
avatarFolderstringNoOnly when apiExposeInternalPaths legacy opt-in
propertyPicsPathstringNoOnly when apiExposeInternalPaths legacy opt-in
VrpropertyPicsPathstringNoOnly when apiExposeInternalPaths legacy opt-in
apiPolicyobjectNoPublic booking/CAPTCHA policy (no secrets)
apiPolicy.apiBookingGuestEnabledintNo1 = guest checkout allowed
apiPolicy.apiBookingRequireLoginintNo1 = tenant session required for book.json
apiPolicy.apiCaptchaProviderstringNobuiltin | turnstile | recaptcha_v2 | recaptcha_v3
apiPolicy.apiCaptchaSiteKeystringNoPublic CAPTCHA site key
apiPolicy.apiContactCaptchaEnabledintNo1 = contact POST requires CAPTCHA
apiPolicy.apiSubscribeCaptchaEnabledintNo1 = subscribe POST requires CAPTCHA
Example request
GET /API/siteSettings/V1/settings.json
Accept: application/json
Example response
{
  "installUrl": "https://demo.rpm-pro.com/",
  "siteName": "My Rentals",
  "businessEmail": "info@example.com",
  "paymentCurrency": "USD",
  "systemTimeZone": "America/New_York",
  "vrCheckInTime": "16:00",
  "vrCheckOutTime": "10:00",
  "apiPolicy": {
    "apiBookingGuestEnabled": 1,
    "apiBookingRequireLogin": 0,
    "apiCaptchaProvider": "builtin",
    "apiCaptchaSiteKey": "",
    "apiContactCaptchaEnabled": 0,
    "apiSubscribeCaptchaEnabled": 0
  }
}

Site Content Public

Controller: siteContent · CMS blocks from siteContent table

GET/API/siteContent/V1/content.json Public

All CMS content blocks (single row, all columns).

Service: SiteSettingsService::siteContent()

Response fields
FieldTypeRequiredDescription
indexHeaderstringNoHomepage header HTML
indexSloganstringNoHomepage slogan
indexPageTitlestringNoHomepage SEO title
indexPageDescstringNoHomepage meta description
indexPageKeywordsstringNoHomepage keywords
c2aTextstringNoCall-to-action text
c2aButtonTextstringNoCTA button label
c2aUrlstringNoCTA link URL
whyUsHeaderstringNoWhy-us section header
whyUsSloganstringNoWhy-us slogan
whyUsH2stringNoWhy-us subheading
whyUsTextstringNoWhy-us body (HTML)
keyPoint1..6stringNoFeature bullet points
keyPointButtonTextstringNoFeature section button
keyPointButtonUrlstringNoFeature section URL
indexExtra..4stringNoAdditional homepage slots
Example response
{
  "indexHeader": "Welcome to Lake Chatuge Rentals",
  "indexSlogan": "Your mountain getaway",
  "c2aText": "Browse our properties",
  "c2aButtonText": "View Rentals",
  "c2aUrl": "/vacation-rental-properties.php"
}
CMS fields may contain trusted admin HTML. Headless consumers must sanitize before rendering (e.g. DOMPurify) or use a strict Content-Security-Policy.
GET/API/siteContent/V1/content/{key}.json Public

Single content block by column key.

Path parameters
FieldTypeRequiredDescription
keystringYessiteContent column name, e.g. indexHeader
Response fields
FieldTypeRequiredDescription
{key}stringNoValue of the requested column
Example request
GET /API/siteContent/V1/content/indexHeader.json
Example response
{ "indexHeader": "Welcome to our rentals" }

Pages Public

Controller: sitePages

GET/API/sitePages/V1/pages.json Public

List active static pages.

Response fields
FieldTypeRequiredDescription
itemsarrayNoArray of page objects
items[].pageIdintNoPrimary key
items[].pageTitlestringNoPage title
items[].pageUrlstringNoURL slug
items[].pageDescstringNoMeta description
items[].pageImagestringNoFeatured image path
items[].dateUpdatedstringNoLast update timestamp
Example response
{
  "items": [
    {
      "pageId": 11,
      "pageTitle": "Whitewater Rafting",
      "pageUrl": "whitewater-rafting",
      "pageDesc": "Local adventures",
      "pageImage": "",
      "dateUpdated": "2024-06-01 12:00:00"
    }
  ]
}
GET/API/sitePages/V1/pages/{slug}.json Public

Full page by URL slug.

Path parameters
FieldTypeRequiredDescription
slugstringYespageUrl value
Response fields
FieldTypeRequiredDescription
pageIdintNoPrimary key
pageTitlestringNoTitle
pageContentstringNoHTML body
pageUrlstringNoSlug
pageKeywordsstringNoSEO keywords
pageDescstringNoMeta description
pageImagestringNoImage path
dateUpdatedstringNoUpdated timestamp

HTTP errors: 404 Page not found

Slug must match ^[a-z0-9-]{1,64}$ (400 otherwise). pageContent is trusted admin HTML — sanitize on render.

Reviews Public

Controller: siteReviews

GET/API/siteReviews/V1/reviews.json Public

Property reviews with optional filters.

Query parameters
FieldTypeRequiredDescription
propertyIdintNoFilter by property
limitintNoMax results (default 20, max 50)
Response fields
FieldTypeRequiredDescription
itemsarrayNoReview list
items[].reviewIdintNoReview ID
items[].reviewTitlestringNoTitle
items[].reviewTextstringNoReview body
items[].r1..r6intNoRating dimensions (1-5)
items[].dateCreatedstringNoCreated date
items[].propertyIdintNoRelated property
items[].tenantFirstNamestringNoReviewer first name
items[].tenantLastNamestringNoReviewer last name
Example request
GET /API/siteReviews/V1/reviews.json?propertyId=42&limit=10
Example response
{
  "items": [
    {
      "reviewId": 5,
      "reviewTitle": "Great stay",
      "reviewText": "Beautiful property...",
      "r1": 5, "r2": 5, "r3": 5, "r4": 5, "r5": 5, "r6": 5,
      "propertyId": 42,
      "tenantFirstName": "John",
      "tenantLastName": "Doe",
      "dateCreated": "2025-07-01 10:00:00"
    }
  ]
}

Sliders Public

GET/API/siteSliders/V1/sliders.json Public

Homepage slider/carousel items.

Response fields
FieldTypeRequiredDescription
itemsarrayNoSlider list
items[].sliderIdintNoID
items[].sliderUrlstringNoBackground image URL
items[].sliderHeaderstringNoHeadline
items[].sliderTextstringNoSubtext
items[].sliderButtonTextstringNoButton label
items[].sliderButtonUrlstringNoButton link
GET/API/siteNavigation/V1/menus.json Public

Site navigation menus with nested children.

Response fields
FieldTypeRequiredDescription
menusarrayNoPrimary nav from menus table
menus[].menuIdintNoMenu ID
menus[].menuTitlestringNoLabel
menus[].menuUrlstringNoLink URL
menus[].menuForintNo1=custom, 2=blog, 3=pages
menus[].childrenarrayNo{ title, url } sub-items
linksarrayNoDefault footer/quick links

FAQ Public

GET/API/siteFaq/V1/faqs.json Public

Active FAQ entries.

Response fields
FieldTypeRequiredDescription
itemsarrayNoFAQ list
items[].faqIdintNoID
items[].faqQuestionstringNoQuestion (faqName alias)
items[].faqAnswerstringNoAnswer HTML (faqContent alias)
items[].dateUpdatedstringNoUpdated

Events Public

GET/API/siteEvents/V1/events.json Public

List active events.

Query parameters
FieldTypeRequiredDescription
limitintNoDefault 50, max 100
Response fields
FieldTypeRequiredDescription
itemsarrayNoEvent list
items[].eventIdintNoID
items[].eventTitlestringNoTitle
items[].eventUrlstringNoSlug/URL
items[].eventCategorystringNoCategory
items[].eventDateStartstringNoStart date
items[].eventDateEndstringNoEnd date
items[].eventImagestringNoImage path
GET/API/siteEvents/V1/events/{id}.json Public

Single event with full content.

Path parameters
FieldTypeRequiredDescription
idintYeseventId
Response fields
FieldTypeRequiredDescription
eventIdintNoID
eventTitlestringNoTitle
eventContentstringNoFull HTML body
eventDescstringNoShort description
eventKeywordsstringNoSEO keywords
eventDateStartstringNoStart
eventDateEndstringNoEnd
eventImagestringNoImage
adminIdintNoAuthor admin

HTTP errors: 404 Event not found

Contact & Leads Public

Controller: siteContact · Service: rpm_site_lead_service()

POST/API/siteContact/V1/message.json Public

Submit website contact form; stores message and optional lead.

Request body (JSON)
FieldTypeRequiredDescription
senderNamestringYesSender full name
senderEmailstringYesReply email
messageContentstringYesMessage body
messageSubjectstringNoSubject (default: Website inquiry)
senderPhonestringNoOptional phone (creates lead)
UrlstringNoHoneypot — must be empty
Response fields
FieldTypeRequiredDescription
successboolNotrue on success
messageIdintNomessages table insert ID
Example request
POST /API/siteContact/V1/message.json
Content-Type: application/json

{
  "senderName": "Jane Smith",
  "senderEmail": "jane@example.com",
  "senderPhone": "555-0100",
  "messageSubject": "Booking inquiry",
  "messageContent": "I would like information about property 42."
}
Example response
{ "success": true, "messageId": 128 }

HTTP errors: 400 validation failure (missing fields or honeypot triggered)

POST/API/siteContact/V1/subscribe.json Public

Newsletter / mailing list signup.

Request body (JSON)
FieldTypeRequiredDescription
emailstringYesSubscriber email
namestringNoDisplay name (default: Subscriber)
Response fields
FieldTypeRequiredDescription
successboolNotrue on success
Example request
{ "email": "subscribe@example.com", "name": "Newsletter Reader" }
Example response
{ "success": true }

Blog Public

Controller: networkBlog · BlogService

GET/API/networkBlog/V1/networkBlogPosts.json Public

List blog posts (excerpted content).

Response fields
FieldTypeRequiredDescription
itemsarrayNoPosts
items[].postIdintNoID
items[].postTitlestringNoTitle
items[].postDescstringNoSummary
items[].postContentstringNoFirst 300 chars
items[].postUrlstringNoSlug
items[].postCategoryintNoCategory ID
items[].postImagestringNoFeatured image
items[].dateCreatedstringNoPublished date
GET/API/networkBlog/V1/networkBlogPosts/{id}.json Public

Full blog post.

Path parameters
FieldTypeRequiredDescription
idintYespostId
Response fields
FieldTypeRequiredDescription
postIdintNoID
postTitlestringNoTitle
postContentstringNoFull HTML body
postDescstringNoSummary
postUrlstringNoSlug
postCategoryintNoCategory
postImagestringNoImage
dateCreatedstringNoDate

HTTP errors: 404 Post not found

GET/API/networkBlog/V1/networkBlogByCat/{categoryId}.json Public

Posts filtered by category.

Path parameters
FieldTypeRequiredDescription
categoryIdintYesCategory ID
GET/API/networkBlog/V1/networkBlogCategory.json Public

List categories.

Response fields
FieldTypeRequiredDescription
categoryIdintNoID
categoryNamestringNoName
isActiveintNoActive flag

Attractions Public

GET/API/siteAttractions/V1/attractions.json Public

List attractions, optionally by category.

Query parameters
FieldTypeRequiredDescription
categoryintNoCategory ID (alias categoryId)
limitintNoDefault 100, max 200
Response fields
FieldTypeRequiredDescription
itemsarrayNoAttractions
items[].attractionIdintNoID
items[].attractionTitlestringNoTitle
items[].attractionUrlstringNoSlug
items[].attractionContentstringNoBody HTML
items[].attractionDescstringNoSummary
items[].attractionImagestringNoImage
items[].categoryIdintNoCategory FK
items[].categoryNamestringNoCategory label
GET/API/siteAttractions/V1/attractions/{id}.json Public

Single attraction.

Path parameters
FieldTypeRequiredDescription
idintYesattractionId

HTTP errors: 404 Attraction not found

GET/API/siteAttractions/V1/categories.json Public

Attraction categories.

Response fields
FieldTypeRequiredDescription
itemsarrayNoCategories
items[].categoryIdintNoID
items[].categoryNamestringNoName
items[].categoryDescstringNoDescription
items[].isActiveintNoActive flag

Integration Scripts

Standalone PHP — not wlRest. See systemDocuments/platform/ integration guides.

POST/API/stripe-create-intent.php CSRF

Create Stripe PaymentIntent for invoice payment.

Request body (JSON)
FieldTypeRequiredDescription
invoiceIdintYesInvoice to pay
tenantIdintNoTenant context
fnamestringNoBilling first name
lnamestringNoBilling last name
emailstringNoBilling email
addressstringNoStreet
citystringNoCity
statestringNoState
countrystringNoDefault US
amntstringNoClient amount validation
stripe_csrfstringYesCSRF token
Response fields
FieldTypeRequiredDescription
clientSecretstringNoStripe PaymentIntent secret
paymentIntentIdstringNoStripe PI id

HTTP errors: 403 invalid CSRF, 400 invalid invoice

POST/API/stripe-webhook.php Webhook

Stripe webhook (payment_intent.succeeded, refunds, disputes).

Verified via Stripe-Signature header and webhook secret.
GET/API/quickbooks/oauth-start.php Admin

Start QuickBooks OAuth — requires myAdmin session.

POST/API/bookingpal/webhook.php Webhook

BookingPal inbound OTA reservations.

Gated by sitesettings.bookingpalEnabled.