Download OpenAPI specification:
The Daylet API lets you integrate your property's availability, pricing, and booking creation into your own website or backend system.
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.
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.
| 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.
All responses use a consistent JSON envelope:
Success: { "data": { ... } }
Error: { "error": { "code": "<error_code>", "message": "..." } }
This API is server-to-server only. CORS is intentionally not enabled — your API key must never be embedded in browser-shipped code.
Discover the property's configuration, rooms, and extras — the IDs and flags the other endpoints expect
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.
curl https://www.dayletus.com/api/v1/property \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "id": "0a1b2c3d-4e5f-6789-abcd-ef0123456789",
- "name": "Maison Lavande",
- "slug": "maison-lavande-provence",
- "booking_mode": "property",
- "currency": "GBP",
- "pricing_enabled": true,
- "payments_enabled": true,
- "max_guests": 6,
- "deposit_enabled": true,
- "deposit_percentage": 30
}
}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.
curl https://www.dayletus.com/api/v1/rooms \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "rooms": [
- {
- "id": "9f8e7d6c-5b4a-3210-fedc-ba9876543210",
- "title": "Blue Room",
- "description": "Double bed, garden view",
- "pricing_enabled": true,
- "base_price_per_night": 80,
- "display_order": 0
}
]
}
}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.
curl https://www.dayletus.com/api/v1/extras \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "extras": [
- {
- "id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
- "name": "Cleaning fee",
- "description": null,
- "price": 45,
- "price_type": "per_stay",
- "is_required": true
}, - {
- "id": "2b3c4d5e-6f70-8901-bcde-f12345678901",
- "name": "Breakfast",
- "description": "Continental breakfast, per guest per night",
- "price": 12,
- "price_type": "per_guest_per_night",
- "is_required": false
}
]
}
}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.
| 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. |
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
{- "data": {
- "unavailable_dates": [
- {
- "start": "2025-08-10",
- "end": "2025-08-17",
- "source": "booking"
}, - {
- "start": "2025-08-17",
- "end": "2025-08-18",
- "source": "gap"
}, - {
- "start": "2025-08-24",
- "end": "2025-08-31",
- "source": "import"
}
], - "restrictions": {
- "min_nights": 3,
- "weekend_min_nights": 2,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": null,
- "checkout_days": null,
- "week_start_day": null,
- "week_increment_only": false,
- "seasons": [
- {
- "label": "Peak summer",
- "start_date": "2026-07-01",
- "end_date": "2026-08-31",
- "min_nights": 3,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 1,
- 5
], - "checkout_days": [
- 1,
- 5
], - "week_start_day": null,
- "week_increment_only": false
}
]
}
}
}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.
| 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"
|
required | Array of objects [ 1 .. 100 ] items |
| reason | string [ 1 .. 500 ] characters Optional note shown on the blocked dates |
{- "status": "blocked",
- "ranges": [
- {
- "start_date": "2027-06-05",
- "end_date": "2027-06-11"
}
], - "reason": "Owners' week"
}{- "data": {
- "rows_added": 1,
- "rows_removed": 0
}
}Read and change nightly prices, seasons and blocked dates, one change at a time or as a CSV file
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.
| 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. |
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
{- "data": {
- "currency": "GBP",
- "days": [
- {
- "date": "2027-07-02",
- "price": 120,
- "price_source": "default",
- "status": "open",
- "min_nights": 3,
- "arrival_allowed": true
}, - {
- "date": "2027-07-03",
- "price": 150,
- "price_source": "season",
- "status": "booked",
- "min_nights": 7,
- "arrival_allowed": true
}
], - "seasons": [
- {
- "id": "5f0c2a9e-1b2c-4d5e-8f90-1234567890ab",
- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-08-27",
- "price": {
- "mode": "fixed",
- "amount": 1050,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}
], - "custom_prices": [
- {
- "start_date": "2027-07-24",
- "end_date": "2027-07-30",
- "price": {
- "mode": "fixed",
- "amount": 1200,
- "unit": "week"
}
}
]
}
}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.
| 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 |
{- "ranges": [
- {
- "start_date": "2027-07-24",
- "end_date": "2027-07-30",
- "price": {
- "mode": "fixed",
- "amount": 1200,
- "unit": "week"
}
}, - {
- "start_date": "2027-08-02",
- "end_date": "2027-08-05",
- "price": null
}
]
}{- "data": {
- "rows_added": 1,
- "rows_removed": 1
}
}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.
| room_id | string <uuid> Room to act on. Required for rooms-mode properties; invalid otherwise. |
curl https://www.dayletus.com/api/v1/seasons \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "seasons": [
- {
- "id": "5f0c2a9e-1b2c-4d5e-8f90-1234567890ab",
- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-08-27",
- "price": {
- "mode": "fixed",
- "amount": 1050,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}
]
}
}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).
| 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 |
{- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-08-27",
- "price": {
- "mode": "fixed",
- "amount": 1050,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}{- "data": {
- "season": {
- "id": "5f0c2a9e-1b2c-4d5e-8f90-1234567890ab",
- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-08-27",
- "price": {
- "mode": "fixed",
- "amount": 1050,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}
}
}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.
| id required | string <uuid> Season ID, from |
| 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 |
{- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-09-03",
- "price": {
- "mode": "fixed",
- "amount": 1100,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}{- "data": {
- "season": {
- "id": "5f0c2a9e-1b2c-4d5e-8f90-1234567890ab",
- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-08-27",
- "price": {
- "mode": "fixed",
- "amount": 1050,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}
}
}Deletes the season. Its nights go back to the default rate and booking rules, unless a custom price covers them.
| id required | string <uuid> Season ID, from |
| room_id | string <uuid> Room to act on. Required for rooms-mode properties; invalid otherwise. |
curl -X DELETE https://www.dayletus.com/api/v1/seasons/5f0c2a9e-1b2c-4d5e-8f90-1234567890ab \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "deleted": {
- "id": "5f0c2a9e-1b2c-4d5e-8f90-1234567890ab",
- "name": "Peak summer",
- "start_date": "2027-07-03",
- "end_date": "2027-08-27",
- "price": {
- "mode": "fixed",
- "amount": 1050,
- "unit": "week"
}, - "rules": {
- "min_nights": 7,
- "weekend_min_nights": null,
- "weekend_days": [
- 5,
- 6
], - "checkin_days": [
- 6
], - "checkout_days": [
- 6
], - "week_increment_only": true
}
}
}
}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.
curl https://www.dayletus.com/api/v1/rates/csv \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "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\n",
- "template": "type,name,start_date,end_date,price,price_unit,min_nights,arrival_days,departure_days,weekly_only\n…",
- "format": "One row per date range; …"
}
}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).
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)
| 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 |
{- "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
}{- "data": {
- "dry_run": true,
- "valid": true,
- "file_error": null,
- "errors": [ ],
- "changes": [
- {
- "room": null,
- "from": "2027-06-05",
- "to": "2027-10-14",
- "rows_added": 3,
- "rows_replaced": 1
}
]
}
}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.
| 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 | 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. |
{- "check_in": "2025-08-16",
- "check_out": "2025-08-23",
- "guests": {
- "adults": 2,
- "children": 1,
- "infants": 0,
- "pets": 0
}
}{- "data": {
- "nights": 7,
- "currency": "GBP",
- "base_total": 280,
- "adjustments_total": 0,
- "extras_total": 45,
- "final_total": 325,
- "breakdown": [
- {
- "label": "Cleaning fee",
- "amount": 45
}
], - "discount_code": null,
- "discount_amount": null
}
}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.
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.
| Idempotency-Key | string Example: 550e8400-e29b-41d4-a716-446655440000 Unique string (e.g. UUID) to make the request idempotent |
| 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 |
{- "check_in": "2025-08-16",
- "check_out": "2025-08-23",
- "guests": {
- "adults": 2,
- "children": 0,
- "infants": 0,
- "pets": 0
}, - "guest_name": "Alice Smith",
- "guest_email": "alice@example.com",
- "require_payment": false
}{- "data": {
- "id": "b1a2c3d4-e5f6-7890-abcd-ef1234567890",
- "status": "pending",
- "payment_status": "not_required",
- "total_nights": 7,
- "total_price_snapshot": null,
- "currency_snapshot": null,
- "discount_code": null,
- "discount_amount": null,
- "deposit_amount": null,
- "balance_amount": null,
- "balance_due_at": null
}
}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.
| id required | string <uuid> Booking UUID |
curl https://www.dayletus.com/api/v1/bookings/b1a2c3d4-e5f6-7890-abcd-ef1234567890 \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "id": "b1a2c3d4-e5f6-7890-abcd-ef1234567890",
- "status": "confirmed",
- "payment_status": "not_required",
- "check_in": "2025-08-16",
- "check_out": "2025-08-23",
- "total_nights": 7,
- "guests": {
- "adults": 2,
- "children": 0,
- "infants": 0,
- "pets": 0
}, - "guest_name": "Alice Smith",
- "guest_email": "alice@example.com",
- "guest_identity_provider": null,
- "guest_phone": null,
- "total_price_snapshot": null,
- "currency_snapshot": null,
- "discount_code": null,
- "discount_amount": null,
- "deposit_amount": null,
- "balance_amount": null,
- "balance_due_at": null,
- "rooms": [ ],
- "extras": [ ],
- "created_at": "2025-07-01T10:15:00Z"
}
}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.
| id required | string <uuid> Booking UUID |
curl -X POST https://www.dayletus.com/api/v1/bookings/b1a2c3d4-e5f6-7890-abcd-ef1234567890/cancel \ -H "Authorization: Bearer dlk_live_your_key_here"
{- "data": {
- "id": "b1a2c3d4-e5f6-7890-abcd-ef1234567890",
- "status": "cancelled",
- "payment_status": "not_required"
}
}