Skip to main content
A tour is the top-level container in Daysync — it holds days, schedule items, venues, accommodation, guest lists, and bulletins. Tours are identified by a UUID string. All endpoints require the standard authentication headers.

List tours

Returns every tour in an organization that the authenticated user can see. Scope: tours.read Query parameters Example
Response data — array of tour memberships:
  • role — the authenticated user’s role on the tour.
  • member_count — number of members on the tour.
  • tour.tourDays — the tour’s days; each day id is used as dayId in schedule and guest-list routes.

Create a tour

Scope: tours.write Body Day object (days[]) Example
Response data: { "id": "2f1c…" } — the new tour’s ID.
Tour creation is subject to the subscription requirement (402) for non-exempt organizations, and to the validation rules in Errors.

Edit a tour

Scope: tours.write Path parameters Body — all fields optional; send only what you want to change.
day_list replaces the tour’s day set — omitted days are permanently deleted, including everything on them.When you send day_list, any existing day whose day_id is not in the list is hard-deleted (not soft-deleted), and the deletion cascades to all content on that day — schedule items, guest list entries, and day-scoped links are destroyed and cannot be recovered through the API.To safely update one day:
  1. GET /v1/tours?org_id=… and collect every day.id from the tour’s tourDays.
  2. Send day_list containing all existing days (just { "day_id": … } is enough to preserve one unchanged), with your modifications on the day you’re editing.
If you only want to change tour-level fields (name, dates, timeZone, …), omit day_list entirely — days are untouched when the field is absent.
Response data: none (status + message only).

Delete a tour

Soft-deletes the tour. After deletion, any request referencing the tour returns 404 TOUR_NOT_FOUND. Scope: tours.write Path parameters Response data: none.

Read a whole tour in one call

Returns a tour’s days — each with its own date, name, day type, time zone and location, plus the schedule items, venues, stays, guest list entries, bulletins and pass types on it. Everything you would otherwise assemble from six separate endpoints per day, and from a second GET /v1/tours call to find out which day is which. Scope: tours.readplus schedule.read, venues.read, accommodation.read, guestlist.read and bulletins.read.
This endpoint requires more than one scope. Because a single response spans six resources, a partner holding only tours.read cannot use it as a side door — you must hold all six read scopes. Missing any one returns 403 INSUFFICIENT_SCOPE, and the message names exactly which are absent — see Scopes → Endpoints that need more than one scope, which lists the others.
Query parameters — all optional.
Each *Limit is clamped to 500. A response covering six resources across every day of a long tour can approach Lambda’s 6 MB ceiling, so the limits are capped rather than letting the response be truncated or the call fail. Pass dayIds and skipEmptyDays to keep responses small on long tours.A malformed dayIds (anything that isn’t a comma-separated list of integers) returns 400 VALIDATION_ERROR rather than being ignored — a typo must not quietly widen the response to the whole tour. Each *Limit must be a positive integer.
Example
Response data
Day fields Each day identifies itself, so you do not need a second GET /v1/tours call and a client-side join on the day ID. These field names are identical to the day object inside List tours, so the two reads are interchangeable for day identity.
A field that the day does not have is returned as an explicit null, never omitted — so "type_id": null means “this day has no day type”, which is distinguishable from a field this API cannot supply.
This is a leaner projection than the per-resource endpoints — it carries the fields useful for an overview, not every field. When you need a full record, read it from its own endpoint (GET /v1/venues/{venueId}, GET /v1/accommodation/{accommodationId}, and so on). The *Count fields are the true totals for the day even when a *Limit truncated the corresponding array.
dayIds is scoped to the tour in the path. A day ID belonging to a different tour is simply absent from the response — it behaves exactly like an ID that does not exist.

Day sheet

A day sheet is one tour day rendered the way a production office prints it: header, running order, venues, stays, a consolidated key-contact list, guest-list totals, bulletins, and a strip of the next few days. Two endpoints — read the model, then render it. Both require tours.read plus schedule.read, venues.read, accommodation.read, guestlist.read and bulletins.read, for the same reason the whole-tour read does: one response spans all six resources. See Scopes. Everything is filtered to what the authenticated user can see. A private schedule item they are not on is absent from the model and from the PDF.

Read the day sheet model

Returns the assembled sheet as data, so you can decide what to include before rendering — or use it instead of the PDF if you are laying the day out yourself. Query parameters Response data
Take defaultOptions, switch off what you do not want, and post the result back as options. You never have to construct the option shape yourself, and you cannot accidentally name an id the caller cannot see.

Render the PDF

Renders the day and returns a short-lived signed URL. Non-destructive: it creates nothing on the tour and changes no record. Body — all optional.
tourId and dayId come from the path. A tourId or dayId in the body is ignored, so a body cannot redirect the render at another tenant’s day.
Example
Response data
url is signed and short-lived. Fetch it or hand it to the user straight away; do not store it, embed it, or treat it as a permanent link. Call the endpoint again for a fresh one — a repeat call with the same options is served from cache (cached: true) and does not re-render.
Check ignoredIdCount. A non-zero value means the sheet you received is narrower than the one you asked for, because some ids you named are not visible to this user. The request still succeeds — it does not fail, and it does not tell you which ids were dropped, so that it cannot be used to probe for records on the tour.

List tour members

Returns the tour’s members and any pending invites. Scope: users.read Path parameters Response data

List Day Types

Returns the valid day_type_id values used in the days array when creating or editing a tour. Scope: tours.read No parameters. Day types are global — the same list applies to every organization and tour. Example
Response data — array of day types:
Call this once and cache the result — day types change rarely. Fetch the live list rather than hardcoding IDs.

See also: Schedule, Venues, Accommodation, Guest List, Bulletins.