Pricing
Retrieve nightly prices, availability, and stay rules for your units.
π° Pricing
Retrieve the rate calendar for your units: nightly price, availability, and minimum/maximum stay rules per date. Results are scoped to your permitted units and ordered by unit, then date.
Method: GET
Endpoint:
https://api.okup.ai/data/pricingAuth: header
X-API-Key: YOUR_API_KEY(required)
π Query parameters
from
string, optional
Start date (YYYY-MM-DD). Default: today
to
string, optional
End date (YYYY-MM-DD). Default: today + 365 days
unit
string, optional
Case-insensitive substring match on the unit's friendly_name
okupai_property_id
string, optional
Filter to a single unit by its UUID (same ID as in the Bookings endpoint)
changed_since
string, optional
ISO-8601 timestamp; return only rows changed after this moment β ideal for incremental syncs
sync_mode
string, optional
Use bootstrap for an initial or recovery full import
limit
integer, optional
Page size; default 1000, max 5000
offset
integer, optional
Items to skip; default 0
π¦ Pricing item fields
One item per unit per date:
okupai_property_id
string
UUID of the unit in OkupAI
friendly_name
string
Human-readable unit name
date
string
The night this row applies to (ISO date)
price
number
Nightly price for that date
available
boolean
Whether the night is open for sale
min_nights
number
Minimum nights for arrival on this date
max_nights
number
Maximum stay length; null when unlimited
changed_at
string
Last change timestamp; always included and used for incremental sync
The top-level response also includes "currency": "EUR" β all prices are returned in EUR.
π¨ Multi-room listings (parent & child units)
For multi-room setups (e.g. a building with several bookable rooms), pricing data lives on the parent object only:
The parent object carries the pricing rows β it is the only one with availability values (
>= 0)Child objects return no pricing data β they inherit price, availability, and stay rules from their parent
When querying by okupai_property_id, always use the parent's UUID to get the rate calendar. If a unit returns no pricing rows, it is most likely a child unit β resolve its parent and query that instead.
β‘ Basic example
Example response (truncated):
π Incremental sync with changed_since
Poll only for changes instead of re-downloading the full calendar. Every item includes changed_at; pass the highest value from your completed sync as changed_since on the next run:
Process every page before advancing your saved timestamp. Use a small overlap and upsert by okupai_property_id plus date, so retries are safe. Collection responses also include an ETag; send it in If-None-Match for the exact same request URL and handle 304 Not Modified without parsing a body.
π Required synchronization mode
Use changed_since for recurring synchronization. Broad scans are deprecated and, for existing API keys, return 422 incremental_sync_required from 26 October 2026 at 00:00 UTC. You can perform an initial or recovery import with sync_mode=bootstrap; this opens a 30-minute pagination window and can start only once per API key every 24 hours.
A focused pricing lookup remains exempt when it includes okupai_property_id, from, and to and the date window is at most 90 days. See Pagination and incremental synchronization for the migration workflow, warning headers, bootstrap procedure, and error examples.
β Error codes
400 Bad Request β invalid parameter (bad date format, invalid UUID, window over 550 days,
tobeforefrom)401 Unauthorized β missing
X-API-Keyheader403 Forbidden β invalid key or verification failed
422 Unprocessable Entity β recurring broad sync requires
changed_since; see the pagination guide429 Too Many Requests β wait for the
Retry-Afterheader before retrying