A Tour in go~mus is a guided experience that does not happen on fixed dates but is scheduled on request or booking - classic guided tours, school workshops, private tours, children's birthday parties. Unlike events, there are no pre-defined dates per session; instead you query when a tour would be generally available, and the concrete date materializes only with the request or booking.
The two most common use cases for this resource are:
1. Tour overview on the website with filtering by language, audience, special exhibition
2. Request or booking form on the website that lands in go~mus (the pattern used by Museumsdienst Berlin, Hamburg and many others)
Full endpoint and schema reference: Swagger.
Tour vs Event - the difference
| Tour | Event | |
|---|---|---|
| Dates | flexible, proposed by the customer | predefined in the back office (dates) |
| Booking primitive | the tour itself plus desired date/time | the date |
| Main flow | request or direct booking | direct booking |
| Availability endpoint | start_times | dates / calendar |
Technically a date per tour exists too - once a tour is booked, an internal booking record with a concrete time is created. From the outside API view, however, the resource is the tour, not the date.
Anatomy of a tour object
The index and show responses contain per tour:
id- stable, use it in items of requests and orderstitle,sub_title,description- translatable via?locale=demuseum_id,exhibition_id- assignmentcategory- embedded category (tour, workshop, lecture, children's birthday, ...)bookable,registerable- context-dependent flags for your auth contextfeatured- boolean, highlight flagmin_persons,max_persons,max_participants- per-booking limits and group capduration- duration in minutesequipment- list of required equipment (e.g. headphones, projector)entry_fee- mode for entry-fee display
The show response additionally embeds: tickets, quotas, limitations, validities, content (long descriptions), documents (attachments), sellabilities.
Full field list: Swagger.
Endpoints at a glance
| Endpoint | What | When to use |
|---|---|---|
GET /api/v4/tours | Tour list | Overview page with filters |
GET /api/v4/tours/:id | Tour detail | Full description, configuration |
GET /api/v4/tours/:id/start_times | Available start times | "When can I book this tour?" |
GET /api/v4/tours/:id/prices | Price calculation | What the tour costs for X people on date Y |
GET /api/v4/tours/:id/categories | Categories of a tour | for filter UI |
GET /api/v4/tours/:id/languages | Available languages | for filter UI |
GET /api/v4/tours/:id/audiences | Audiences | for filter UI |
GET /api/v4/tours/:id/age_groups | Age groups | for filter UI |
POST /api/v4/requests | Create a request | Customer asks for a date, museum confirms manually |
POST /api/v4/orders | Create a direct booking | Customer books immediately |
Common tasks
List tours
curl "https://demo.gomus.de/api/v4/tours?by_museum_ids[]=20&by_audience_ids[]=4&locale=de"
The filters mirror those for events - all optional, all combinable:
by_museum_ids[]=20- tours of one house onlyby_exhibition_ids[]=2057- tours for one special exhibition (-1for "no exhibition link")by_category_ids[]=12orby_categories[]=tour- category filterby_audience_ids[]=4- e.g. only tours for familiesby_age_group_ids[]=2- e.g. only tours for adultsby_grade_ids[]=8- school gradeby_language_ids[]=1- only German-language toursby_catch_word_ids[],by_disablement_ids[],by_proposal_category_ids[]- further classificationsby_featured=true- highlights only
Populate a filter UI with available values
As with events, sub-resource endpoints return values actually used in the instance:
curl "https://demo.gomus.de/api/v4/tours/categories?locale=de"
curl "https://demo.gomus.de/api/v4/tours/audiences?locale=de"
curl "https://demo.gomus.de/api/v4/tours/languages?locale=de"
Find available start times
curl "https://demo.gomus.de/api/v4/tours/512/start_times?start_at=2026-05-01&end_at=2026-05-31&participants=15&language_ids[]=1"
Parameters:
start_at,end_at- time window (default: today to end of month). Maximum range: 60 days - larger windows return a validation error. For a 12-month datepicker make several calls in 60-day buckets.participants- headcount, affects availability (default: 1 or the tour'smin_persons)language_ids[],age_group_ids[]- filters that flow into the availability calculationdepth-any(at least one slot per day, boolean answer) orall(every bookable slot, list); defaultany
depth=any is the typical datepicker case ("which days are bookable"). depth=all is the slot-picker case ("which times on the chosen day").
Compute a price
Tour prices are context-dependent - they depend on date, time, headcount, language and the price group (PriceTargetAudience, e.g. "private customer", "school class", "reseller"). The endpoint computes that in one call:
curl "https://demo.gomus.de/api/v4/tours/512/prices?date=2026-05-15&time=14:00&participants=15&language_id=1"
Parameters:
date(default: today)timeasHH:MM(default:12:00)participants(default: 1)language_id(default: first language assigned to the tour)price_target_audience_id(default: from auth context, otherwise the instance default PTA)
The response contains line items and the total - exactly what to display in the booking form.
Tour detail
curl "https://demo.gomus.de/api/v4/tours/512?locale=de"
The show response delivers description, embedded tickets/quotas, validity rules and attachments - enough for a full detail page.
From wish to booking - the two paths
Path 1: Request (POST /api/v4/requests)
The standard solution for school inquiries, group tours and anything the museum wants to review editorially before confirming (dispatch, guide assignment, special arrangements). The request lands in go~mus with status registered, runs through the inquiry inbox, the back office responds manually.
curl -X POST "https://demo.gomus.de/api/v4/requests" \
-H "Authorization: Bearer YOUR_API_USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"request": {
"participants": 25,
"companions": 2,
"date": "2026-06-15",
"notes": "Class 7a, history advanced, focus on 19th century",
"language": "Deutsch",
"age_group": "School class",
"grade": "Secondary II",
"items": [
{ "tour_id": 512, "time": "10:00" },
{ "tour_id": 519, "time": "13:00" }
],
"customer": {
"name": "Müller", "surname": "Anna",
"email": "teacher@example-school.de",
"phone": "+49 30 12345",
"street": "Schulweg 1", "zip": "10115", "city": "Berlin"
}
}
}'
Important:
- Authentication via an API user token with permission. A public token is not enough.
itemsis required and must contain at least onetour_idplus the desiredtime. Multiple items in one request = multi-tour day.payment_mode,language,age_group,grade,proposal_category,categoryaccept either an id or a translated name.skip_confirmation_email: truesuppresses the automatic confirmation mail (e.g. if your system sends its own).
The response returns id, created_at, updated_at. Validation errors come as 422 with field details.
Path 2: Direct booking (POST /api/v4/orders)
When the tour should sell directly - private tour, fixed-price workshop, tickets on demand - it works like for events via order plus finalize.
Create the order with the tour as an item:
curl -X POST "https://demo.gomus.de/api/v4/orders" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"order": {
"items": [
{
"tour_id": 512,
"date": "2026-06-15",
"start_time": "14:00",
"participants": 8,
"language_id": 1
}
],
"customer": { "email": "user@example.com", "..." : "..." }
}
}'
Then finalize:
curl -X POST "https://demo.gomus.de/api/v4/orders/ORDER_TOKEN/finalize" \
-H "Authorization: Bearer YOUR_TOKEN"
Exact payload structures, validation rules and payment options: Swagger and Best Practices.
Request vs direct booking - when to use what
| Criterion | Request | Direct booking |
|---|---|---|
| Immediately binding? | No, manual confirmation | Yes |
| Price fixed at submit? | Optional (group prices auto-applied) | Yes |
| Payment at submit? | No | Yes, in finalize |
| Typical use | School classes, group tours, special wishes | Private tours, workshop tickets |
| Auth | API user token with permission | Public token, reseller token or API user |
If you offer both, the pattern is: form on the website with a "Request" button for schools/groups and a "Book now" button for individuals.
Relationships
Tour
├── Category ............ e.g. tour, workshop, lecture
├── Museum .............. house
├── Exhibition (0..1) ... special exhibition
├── Audience (0..n) ..... e.g. families, school classes
├── AgeGroup (0..n) ..... e.g. children, adults
├── Language (0..n) ..... languages offered
├── Guide (0..n) ........ qualified guides
├── Equipment (0..n) .... required equipment
├── Request (via items) if submitted as a request
└── OrderItem .......... if booked directly
Pitfalls
- Requests need an API user token. Unlike tour listing or price calculation (public token suffices),
POST /requestsrequires an authenticated API user with permission. Do not expose that token in the frontend - the request must be relayed server-side. - Call
start_timeswithparticipants. Without it you get availability for the tour'smin_persons. Not wrong, but optimistic for large groups - on booking day the group may no longer fit. pricesis context-dependent. Withoutprice_target_audience_idthe endpoint falls back to the default PTA (e.g. "private customer"). For resellers, school classes or members, set it explicitly or you compute the wrong tariff.depthonstart_timesmatters.anyis much cheaper and enough for datepicker logic.allonly pays off when displaying slots for a day.start_timeshas a 60-day cap. For longer preview windows, make several calls. Rarely a problem in practice since datepickers usually show only the current or next month.- Translated names instead of ids. The request accepts
language: "Deutsch"in addition to the id. Handy for forms without an id lookup, but the value must match the stored translation exactly.
Related pages
- Events - the counterpart with fixed dates
- Tickets - the other booking primitive
- Concepts - quota, order, order finalize, requests
- Authentication - token types, permissions
- Best Practices - caching, errors, idempotency
- Scenario: Website integration - request form and booking flow end to end