Base URL
/v1 path prefix, e.g.
Two hostnames
/ The API uses two hostnames, each with a distinct purpose:
You authenticate against
integrations.daysync.com, then call integration.daysync.com with the resulting token. See Authentication.
Data model at a glance
Everything hangs off an organization. A tour belongs to one organization; days belong to one tour; day-scoped resources (schedule items, guest list entries) belong to one day. Practical consequences:- Every integration starts with
GET /v1/organizationsto obtain anorg_id, thenGET /v1/tours?org_id=…for tours and theirtourDays(the day IDs). - Schedule and guest list routes are day-scoped (
/tours/{tourId}/days/{dayId}/…); venues, accommodation, and bulletins are tour-scoped (/tours/{tourId}/…). - Deleting a tour (or a day via
day_list) takes its children with it.
How a request is processed
Every request passes through the same pipeline:- Partner authentication — your
x-api-key/x-api-secretpair identifies and authenticates your application. - User authentication — the
Authorization: Bearer <token>identifies the Daysync user the call acts on behalf of. - Scope check — the endpoint’s required scope must be among the scopes granted to your partner application.
- Business rules — subscription status, soft-delete state, and input validation are enforced before the request reaches Daysync’s services.
- Execution — the request runs as the authenticated user, honouring that user’s roles and access.
Conventions
Content type
Requests with a body must sendContent-Type: application/json and a valid JSON body. Malformed JSON returns 400 INVALID_JSON. Request bodies are limited to 512 KB (413 PAYLOAD_TOO_LARGE if exceeded).
Success envelope
Every successful (2xx) response uses the same envelope:
status— alwaystrueon success.message— a human-readable result message.data— the resource payload. Shape depends on the endpoint (object, array, ornull).
Error envelope
Errors return a machine-readableerror code plus a message and numeric status:
Identifiers
Tours and organizations are referenced by UUID strings; most child resources use integer IDs. Passing the wrong type generally results in a
400 or 404.
Field naming
ID field names are not consistent across resources. Most resources usesnake_case (tour_id, day_id, org_id), but Accommodation and Bulletins use camelCase (tourId, dayId):
Pagination
List endpoints acceptlimit and offset query parameters, and they are capped server-side whether or not you send them.
This applies to the day- and tour-scoped list reads:
The pagination object
Each of those six reads answers with a pagination object alongside data — a sibling of it, not a field inside it — so you can tell a complete page from a shortened one without inferring anything from the row count:
The object is additive, and it only appears where it can be trusted: an unpaged read does not grow the key, and a response that cannot report both counts omits it entirely rather than returning a half-filled envelope that would read as a complete page.
Over MCP, the six equivalent tools (
get_schedule, list_venues, list_accommodation, get_guest_list, list_bulletins, list_pass_types) append a one-line [pagination] note to the result whenever a page is incomplete, naming the offset to call back with. A complete, untruncated page carries no note.
GET /v1/tours/{tourId}/files reports totalCount, returnedCount and hasMore on the same principle. Chat reads take a limit and a message-id cursor. GET /v1/reference/types is uncapped and returns every lookup table.
The whole-tour read takes its own per-resource limits (scheduleLimit, staysLimit, guestLimit, bulletinLimit) and reports truncated per day, so a day whose collections were shortened is distinguishable from a day that is genuinely short.
Also worth planning for:
- Cache responses where possible; reference data changes very rarely.
- Avoid polling list endpoints on short intervals.
Dates & times
Date-time fields (tourstart_date/end_date, tour day date, schedule start_time/end_time) use ISO 8601 / AWSDateTime format, e.g. 2026-06-01T00:00:00Z. Time zones are IANA names, e.g. Australia/Sydney. Accommodation check-in/check-out fields use numeric date/time values — see the Accommodation page.
Rate limits
Rate limiting is not currently enforced, but limits may be introduced in a future version. Design your integration to handle
429 Too Many Requests responses gracefully — implement exponential backoff and avoid tight polling loops.Retries & idempotency
Send anX-Idempotency-Key header on a write and the API will run it at most once — a retry carrying the same key returns the original result instead of creating a second record.
Without a key, retry safety still depends on the method:
Which responses are worth retrying:
Versioning
All endpoints are prefixed with/v1. When breaking changes are introduced, they will be released under a new prefix (/v2), and the previous version will continue to be served for a transition period so existing integrations keep working.
Webhooks & real-time updates
The API does not currently support webhooks or event subscriptions. To detect changes, poll the relevant list endpoints. Webhook support is planned for a future release.OpenAPI specification
A machine-readable OpenAPI specification is not yet published. The API follows standard REST conventions and can be used with any HTTP client. Once a spec is available it will be linked here for use with Postman, Swagger UI, and client-code generators.Next steps
- Quickstart — make your first call in a few minutes.
- Authentication — the dual auth model and OAuth flow.
- Scopes & Permissions — what each scope unlocks.
- Errors — status codes and error handling.
- Endpoint reference — every endpoint, grouped by resource.

