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.
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-24",
- "end": "2025-08-31",
- "source": "import"
}
], - "restrictions": {
- "min_nights": 7,
- "week_start_day": 6,
- "week_increment_only": true
}
}
}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"
}
}