Daylet API (1.0.0)

Download OpenAPI specification:

The Daylet API lets you integrate your property's availability, pricing, and booking creation into your own website or backend system.

Authentication

Every request requires a Bearer API key in the Authorization header:

Authorization: Bearer dlk_live_<48 hex chars>

Keys are generated in the Daylet dashboard → API Keys page (Pro plan). A key is scoped to exactly one property — the property ID is never passed in the request; it is derived from the key itself.

Pricing

The API is included with the Pro plan: 10,000 API calls per month across your account, then £0.50 (or €0.50) per additional 1,000 calls.

Rate limits

Window Limit
Per IP (before auth) 60 req / 60 s
Read endpoints 120 req / 60 s
Write endpoints 20 req / 60 s

Rate-limit state is returned in X-RateLimit-* response headers.

Response envelope

All responses use a consistent JSON envelope:

Success: { "data": { ... } }

Error: { "error": { "code": "<error_code>", "message": "..." } }

CORS

This API is server-to-server only. CORS is intentionally not enabled — your API key must never be embedded in browser-shipped code.

Property

Discover the property's configuration, rooms, and extras — the IDs and flags the other endpoints expect

Get property configuration

Returns the configuration of the property the API key is scoped to. Start here: booking_mode tells you whether bookings need room_ids (rooms mode) or not (property mode), payments_enabled whether require_payment: true bookings will work, and deposit_enabled whether those bookings only charge a deposit upfront rather than the full total.

Authorizations:
bearerAuth

Responses

Request samples

curl https://www.dayletus.com/api/v1/property \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

List rooms

Lists the active rooms of the property (rooms-mode properties only). Use the returned IDs as room_ids when creating bookings, and as room_id when querying availability or quoting. Returns 400 for property-mode properties, which have no rooms.

Authorizations:
bearerAuth

Responses

Request samples

curl https://www.dayletus.com/api/v1/rooms \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

List extras

Lists the active extras (add-on services and items) configured for the property. Use the returned IDs as extras[].extra_id when quoting or creating bookings. Extras with is_required: true are charged and recorded automatically on every booking — only optional extras need to be passed.

Authorizations:
bearerAuth

Responses

Request samples

curl https://www.dayletus.com/api/v1/extras \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

Availability

Query availability, and block or open dates

Get availability

Returns unavailable date ranges and booking restrictions for the property within a given window. Use this to pre-validate dates before quoting or creating a booking.

Ranges are half-open [start, end): the end date is checkout-style — the last blocked night is the day before end, and end itself is a valid check-in date.

If the owner keeps a turnover gap between stays, the nights it reserves are returned as their own ranges with source: "gap" — booking and import ranges always name the dates a stay actually runs. Treat every returned range as unbookable regardless of its source.

A gap range can appear without the stay that caused it, when that stay falls outside the window you asked for but the nights it reserves fall inside it. Every range returned overlaps your window, and every night in your window that cannot be booked is covered by one.

Rooms-mode properties must pass room_id (availability is tracked per room); list room IDs with GET /api/v1/rooms.

Authorizations:
bearerAuth
query Parameters
from
required
string^\d{4}-\d{2}-\d{2}$
Example: from=2025-08-01

Start of the window (inclusive), ISO 8601 date

to
required
string^\d{4}-\d{2}-\d{2}$
Example: to=2025-08-31

End of the window (inclusive), ISO 8601 date

room_id
string <uuid>

Room to query. Required for rooms-mode properties; invalid otherwise.

Responses

Request samples

curl -G https://www.dayletus.com/api/v1/availability \
  -H "Authorization: Bearer dlk_live_your_key_here" \
  -d from=2025-08-01 \
  -d to=2025-08-31

Response samples

Content type
application/json
{
  • "data": {
    }
}

Block or open dates

Blocks ranges of nights (status: "blocked") so guests can't book them, or opens them (status: "open") by removing blocks the owner added. Bookings and stays imported from other calendars are never changed, and blocking a night with a confirmed booking is refused (409).

Unlike the ranges GET returns, these ranges are inclusive at both ends: end_date is the last night, not a check-out date. All ranges are saved together or not at all.

Authorizations:
bearerAuth
Request Body schema: application/json
required
room_id
string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA...

Room to act on. Required for rooms-mode properties, where prices and availability are kept per room; invalid otherwise.

status
required
string
Enum: "blocked" "open"

blocked stops guests booking these nights; open removes blocks you added (never bookings or stays imported from other calendars)

required
Array of objects [ 1 .. 100 ] items
reason
string [ 1 .. 500 ] characters

Optional note shown on the blocked dates

Responses

Request samples

Content type
application/json
{
  • "status": "blocked",
  • "ranges": [
    ],
  • "reason": "Owners' week"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Prices & availability

Read and change nightly prices, seasons and blocked dates, one change at a time or as a CSV file

Get the price calendar

Returns each night's price, status and booking rule between from and to (both inclusive, at most 366 nights), plus the seasons and custom prices overlapping that window. price is what a guest pays for the night before extras, extra-guest charges and discounts — the same figure the dashboard calendar shows.

Unlike GET /api/v1/availability, every range on the prices & availability endpoints is a range of nights with both ends inclusive: end_date is the last night, not a check-out date.

Rooms-mode properties must pass room_id: prices are kept per room.

Authorizations:
bearerAuth
query Parameters
from
required
string <date>
Example: from=2027-07-01

First night (inclusive), ISO 8601 date

to
required
string <date>
Example: to=2027-07-31

Last night (inclusive), ISO 8601 date

room_id
string <uuid>

Room to act on. Required for rooms-mode properties; invalid otherwise.

Responses

Request samples

curl -G https://www.dayletus.com/api/v1/rates \
  -H "Authorization: Bearer dlk_live_your_key_here" \
  -d from=2027-07-01 \
  -d to=2027-07-31

Response samples

Content type
application/json
{
  • "data": {
    }
}

Set or remove prices on dates

Sets a custom price on each range of nights, or with price: null removes custom prices so the season or default rate applies again. Custom prices already on those nights are replaced (a longer one is trimmed around them); seasons are left as they are. Where a custom price and a season's price cover the same night, whichever was saved most recently applies.

A fixed price with unit: "week" covers 7 nights: each night costs amount / 7, so a 7-night stay costs exactly amount. A percent price changes the default rate, e.g. -10 for 10% off.

Every range is inclusive at both ends. All ranges are saved together or not at all.

Authorizations:
bearerAuth
Request Body schema: application/json
required
room_id
string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA...

Room to act on. Required for rooms-mode properties, where prices and availability are kept per room; invalid otherwise.

required
Array of objects [ 1 .. 100 ] items

Responses

Request samples

Content type
application/json
{
  • "ranges": [
    ]
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

List seasons

Returns every season, earliest first. A season is a named range of nights with its own price, its own booking rules, or both. A stay follows the booking rules of the season containing its check-in date.

Authorizations:
bearerAuth
query Parameters
room_id
string <uuid>

Room to act on. Required for rooms-mode properties; invalid otherwise.

Responses

Request samples

curl https://www.dayletus.com/api/v1/seasons \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

Create a season

Creates a season with a price, booking rules, or both. Seasons' booking rules can't overlap: creating one whose rules overlap another season's returns 409. rules replace the default booking rules as a whole for arrivals in the season — fields left out take their defaults (no minimum, any day).

Authorizations:
bearerAuth
Request Body schema: application/json
required
room_id
string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA...

Room to act on. Required for rooms-mode properties, where prices and availability are kept per room; invalid otherwise.

name
required
string [ 1 .. 100 ] characters

The season's name

start_date
required
string^\d{4}-\d{2}-\d{2}$

First night (inclusive)

end_date
required
string^\d{4}-\d{2}-\d{2}$

Last night (inclusive). This is the last night of the range, not a check-out date.

object or null
Default: null

The season's price, or null to keep the default rate

object or null
Default: null

The season's booking rules, or null to keep the default rules

Responses

Request samples

Content type
application/json
{
  • "name": "Peak summer",
  • "start_date": "2027-07-03",
  • "end_date": "2027-08-27",
  • "price": {
    },
  • "rules": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Replace a season

Replaces the season's name, dates, price and booking rules with the body. Send the whole season: a price or rules left out is removed. The season's ID may change; use the one returned.

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>

Season ID, from GET /api/v1/seasons

Request Body schema: application/json
required
room_id
string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA...

Room to act on. Required for rooms-mode properties, where prices and availability are kept per room; invalid otherwise.

name
required
string [ 1 .. 100 ] characters

The season's name

start_date
required
string^\d{4}-\d{2}-\d{2}$

First night (inclusive)

end_date
required
string^\d{4}-\d{2}-\d{2}$

Last night (inclusive). This is the last night of the range, not a check-out date.

object or null
Default: null

The season's price, or null to keep the default rate

object or null
Default: null

The season's booking rules, or null to keep the default rules

Responses

Request samples

Content type
application/json
{
  • "name": "Peak summer",
  • "start_date": "2027-07-03",
  • "end_date": "2027-09-03",
  • "price": {
    },
  • "rules": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete a season

Deletes the season. Its nights go back to the default rate and booking rules, unless a custom price covers them.

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>

Season ID, from GET /api/v1/seasons

query Parameters
room_id
string <uuid>

Room to act on. Required for rooms-mode properties; invalid otherwise.

Responses

Request samples

curl -X DELETE https://www.dayletus.com/api/v1/seasons/5f0c2a9e-1b2c-4d5e-8f90-1234567890ab \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

Export prices and availability as CSV

Returns the property's seasons, custom prices and blocked dates as CSV text — the same file as the dashboard's Import / export → Download as CSV — with a blank template and a description of the format. Edit the file and send it back to POST /api/v1/rates/csv.

Authorizations:
bearerAuth

Responses

Request samples

curl https://www.dayletus.com/api/v1/rates/csv \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

Check or import a CSV file

Checks (dry_run: true) or imports a CSV file of seasons, prices and blocked dates. A dry run saves nothing and reports problems line by line, plus what importing would change. Check a file with a dry run first: an import with any problem is refused (422) without saving anything.

An import is all or nothing. Between the first and last date in the file, it replaces the kinds of row the file contains — seasons, prices and/or blocks — so re-sending an edited export does what you expect. rows_replaced says how many existing rows that removes. Bookings and stays imported from other calendars are never changed, and a block over a confirmed booking is refused (409).

Format

One row per date range; the header row is required. Columns: type,name,start_date,end_date,price,price_unit,min_nights,arrival_days,departure_days,weekly_only (and room, for rooms-mode properties)

  • type: season (a named period with a price and/or booking rules), price (a price for specific nights) or block (blocked nights).
  • name: required for a season; optional note for a block.
  • start_date / end_date: first and last night, both inclusive, as YYYY-MM-DD or DD/MM/YYYY.
  • price: a number (e.g. 1050 or £1,050), or a change to the default rate like +20% or -10%. Leave empty on a season to keep the default rate.
  • price_unit: night or week (a weekly price covers 7 nights). Empty = the unit of the property's base price.
  • min_nights, arrival_days, departure_days, weekly_only: booking rules, on season rows only. Days are names separated by | (e.g. Sat or Fri|Sat), in English, French, Spanish or German. weekly_only is yes or no.
  • room: the room's name, on every row, for rooms-mode properties. Importing replaces, between the file's first and last date, the kinds of row it contains (seasons, prices and/or blocks). Bookings and dates from other calendars are never changed. Up to 1,000 rows covering up to 3 years.
Authorizations:
bearerAuth
Request Body schema: application/json
required
csv
required
string [ 1 .. 500000 ] characters

The CSV file's text, header row first

dry_run
boolean
Default: false

When true, check the file and report what would change without saving anything

expected_rows_replaced
integer [ 0 .. 9007199254740991 ]

Optional: the total rows_replaced a dry run reported. The import is refused (409) if it would now replace a different number of rows, e.g. because someone changed the calendar in between.

Responses

Request samples

Content type
application/json
{
  • "csv": "type,name,start_date,end_date,price,price_unit,min_nights,arrival_days,departure_days,weekly_only\nseason,Peak summer,2027-07-03,2027-08-27,1050,week,7,Sat,Sat,yes\nprice,,2027-10-08,2027-10-14,480,week,,,,\nblock,Owners' week,2027-06-05,2027-06-11,,,,,,\n",
  • "dry_run": true
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Pricing

Get server-computed price quotes

Get a price quote

Returns a server-computed price quote for a prospective stay. Uses the same pricing engine as the guest booking flow, so quotes and real charges never diverge. Returns 422 if pricing is not enabled for the property.

Rooms-mode properties must pass room_id (single room) or room_ids (multi-room stay) — the same rooms you would pass when creating the booking. Required extras are included in the quote automatically.

Optional discount_code previews a discount before booking — final_total already nets it out. Returns 400 if the code doesn't match an active code for this property.

Authorizations:
bearerAuth
Request Body schema: application/json
required
check_in
required
string^\d{4}-\d{2}-\d{2}$

Desired check-in date

check_out
required
string^\d{4}-\d{2}-\d{2}$

Desired check-out date

required
object

Guest counts for the stay

room_id
string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA...

Room to quote (rooms-mode only). Shorthand for room_ids with a single entry.

room_ids
Array of strings <uuid> non-empty [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ]

Rooms to quote (rooms-mode only). Use this to quote a multi-room stay — the same rooms you would pass when creating the booking.

Array of objects

Extras to include in the quote

discount_code
string non-empty

Discount code to preview. The request fails with 400 if the code doesn't match an active code for this property.

Responses

Request samples

Content type
application/json
{
  • "check_in": "2025-08-16",
  • "check_out": "2025-08-23",
  • "guests": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Bookings

Create, retrieve, and cancel bookings

Create a booking

Creates a booking for the property the API key is scoped to.

Bookings created with require_payment: false start as pending and await the owner's approval. With require_payment: true they start as awaiting_payment and are confirmed automatically once Stripe reports the payment.

When require_payment is true, a Stripe Checkout Session is created in the same request and checkout_url is returned — no second round trip needed. Pass success_url and cancel_url to redirect the guest back to your own site after payment.

Rooms-mode properties require room_ids — list them with GET /api/v1/rooms. Optional extras are passed in extras (see GET /api/v1/extras); required extras are recorded and charged automatically. Optional discount_code applies a discount — the request fails with 400 if it doesn't match an active code for this property.

When the property has deposit_enabled (see GET /api/v1/property) and require_payment is true, only the deposit is charged now — the response's deposit_amount, balance_amount, and balance_due_at describe the split, and payment_status is awaiting_deposit rather than awaiting_payment. Both fields are null when the booking isn't on a deposit.

Idempotency

Pass an Idempotency-Key header (any unique string, e.g. a UUID) to make retries safe. The first request for a key is processed and the response stored; later requests with the same key replay the stored response. A 409 is returned if the same key is reused with a different request body.

Authorizations:
bearerAuth
header Parameters
Idempotency-Key
string
Example: 550e8400-e29b-41d4-a716-446655440000

Unique string (e.g. UUID) to make the request idempotent

Request Body schema: application/json
required
check_in
required
string^\d{4}-\d{2}-\d{2}$

Check-in date

check_out
required
string^\d{4}-\d{2}-\d{2}$

Check-out date

required
object

Guest counts for the stay

room_ids
Array of strings <uuid> non-empty [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ]

Room IDs to book (rooms-mode properties only)

guest_name
required
string non-empty

Guest's full name

guest_email
string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z...

Guest's email address

guest_phone
string non-empty

Guest's phone number

object

Guest's billing address

Array of objects
discount_code
string non-empty

Discount code to apply. The request fails with 400 if the code doesn't match an active code for this property.

require_payment
required
boolean
Default: false

When true, a Stripe Checkout Session is created and checkout_url is returned

success_url
string <uri>

URL to redirect the guest to after successful payment

cancel_url
string <uri>

URL to redirect the guest to if they cancel payment

locale
string
Enum: "en" "fr" "es" "de"

Locale for confirmation emails

Responses

Request samples

Content type
application/json
{
  • "check_in": "2025-08-16",
  • "check_out": "2025-08-23",
  • "guests": {
    },
  • "guest_name": "Alice Smith",
  • "guest_email": "alice@example.com",
  • "require_payment": false
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get a booking

Returns the details of a single booking. The booking must belong to the property the API key is scoped to — mismatched booking IDs return 404 (not 403) to avoid confirming the existence of another owner's bookings. This is the endpoint for a "view your booking" page: fetch it by the ID returned from POST /bookings whenever the guest returns.

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>

Booking UUID

Responses

Request samples

curl https://www.dayletus.com/api/v1/bookings/b1a2c3d4-e5f6-7890-abcd-ef1234567890 \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}

Cancel a booking

Cancels a booking and notifies the guest by email. Paid bookings are refused with 409 — a cancellation with money involved needs the property owner's refund decision, so it must be done from the Daylet dashboard. Bookings still awaiting_payment can be cancelled; if the guest completes a stale checkout afterwards, the payment is refunded automatically instead of confirming the booking.

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>

Booking UUID

Responses

Request samples

curl -X POST https://www.dayletus.com/api/v1/bookings/b1a2c3d4-e5f6-7890-abcd-ef1234567890/cancel \
  -H "Authorization: Bearer dlk_live_your_key_here"

Response samples

Content type
application/json
{
  • "data": {
    }
}