PUBLIC
Returns a single product by ID within a merchant.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Cache —Cache-Control: public, max-age=7200(2 hours)
Part of the catalog — The product catalog explains how merchants, products, calendars and timeslots fit together.
Why this endpoint exists
The single-product read, for a product detail page or a deep link. It returns the same Product object as list products, so if you already hold the list you do not need this call.
Where it genuinely matters is the companion to the calendar. GET .../calendar returns a deliberately slim product wrapper carrying only the fields the calendar owns — no localised title, no conditions, no age_group. This endpoint is where those live. A product page showing per-day pricing therefore fetches both, and the split is not an oversight: the two are served by different views, so the calendar can stay cheap and refresh on a five-minute cycle while metadata caches for two hours.
How to use it
curl "https://api.acc.funtrips.io/v2/merchants/8a2f4c61-9d3e-4b57-a0c8-1e5f7b2d9a30/products/d4b8f2a1-6c3e-4957-b18d-2f5a9c7e3b04" \
-H "x-campaign-id: 3c1e5a90-7b2d-4f61-9a83-1d4e7f2b8c05" \
-H "Accept-Language: nl-NL"Path parameters
| Parameter | Type | Notes |
|---|---|---|
merchant_id | UUID | The owning merchant |
product_uuid | UUID | The product |
Both are required: a product is addressed within its merchant. The pair must be consistent — a valid product id under the wrong merchant id will not resolve.
The response is one Product object. See list products for the field-by-field walkthrough, including the four behavioural flags (no_date, requires_timeslot, physical_product, sold_out).
Errors
| Status | type | Cause |
|---|---|---|
400 | — | Either path parameter is not a UUID, or x-campaign-id is missing |
404 | urn:qup:error:product-not-found | No such product under that merchant in this campaign |
500 | urn:qup:error:product-internal-error | Unexpected fault |
A 404 is scoped by campaign and by merchant. Before assuming the product is gone, check that the merchant id is the right one and that x-campaign-id matches the call the id came from.
