For the complete documentation index, see llms.txt. This page is also available as Markdown.

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/pricing

  • Auth: header X-API-Key: YOUR_API_KEY (required)

πŸ” Query parameters

Parameter
Type
Description

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:

Field
Type
Description

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, to before from)

  • 401 Unauthorized β€” missing X-API-Key header

  • 403 Forbidden β€” invalid key or verification failed

  • 422 Unprocessable Entity β€” recurring broad sync requires changed_since; see the pagination guide

  • 429 Too Many Requests β€” wait for the Retry-After header before retrying