Errors, limits & paging

Errors

Every error has the same shape, and every answer carries Daysli-Request-Id:

{ "error": { "code": "invalid_input", "message": "Check the field named in this error.",
             "field": "to", "requestId": "6e28c492-5607-4358-8972-5f0d2dd649dd" } }
HTTPcodeMeaning
400bad_requestThe body is not JSON.
401invalid_tokenMissing, malformed, unknown or revoked token.
401token_expiredThe token reached the end of its life. Make a new one.
403insufficient_scopeThe token was not granted the scope this needs (named in WWW-Authenticate).
403app_suspendedThe app has been suspended.
404not_foundUnknown, deleted, another owner’s, out of your scopes, or booking is off — never told apart.
405method_not_allowedThe path exists; the method does not.
409slot_unavailableThat time is no longer free.
409invalid_transitionThe request is not in a state that allows that (e.g. withdrawing one already handled).
422invalid_inputA parameter or field is wrong; `field` names it. Unknown parameters and fields are refused too.
422idempotency_mismatchThe Idempotency-Key was used with a different body.
429rate_limitedA limit was reached; wait for Retry-After.
429too_many_pendingThis person already has three requests waiting for the owner.
500internalOur fault. Quote the requestId.
503unavailableSomething we depend on is down. Retry with backoff.

Codes are stable; messages may change. Branch on code, show message.

Rate limits

WhatLimit
Reads, per token600 a minute
GET /availability, per token60 a minute
Creating and withdrawing requests, per token30 an hour and 200 a day
Everything for one owner, all tokens together3,000 a minute
Requests from one requester’s email or phone, from any source5 a day — the same limit as the booking page, so the API cannot be used to email anyone more

Every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds); a 429 carries Retry-After.

Idempotency

Every POST needs an Idempotency-Key of 16 to 64 letters, digits, - or _ — a UUID is ideal. Sending the same key and body again returns the first answer and creates nothing; the same key with a different body is 422 idempotency_mismatch. Keys last 24 hours and belong to one token. Retry a POST that timed out with its original key, never a new one.

Paging and sync

Every answer is sent with Cache-Control: no-store.