# GetYourGuide All-in-One API (`romy/getyourguide-all-in-one-api`) Actor

Unofficial always-on REST API for live GetYourGuide data: search suggestions, destination activity listings, activity detail with embedded reviews, and real per-date bookable availability with live pricing — in any currency. No account needed.

- **URL**: https://apify.com/romy/getyourguide-all-in-one-api.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $23.40 / 1,000 destination activity listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does GetYourGuide All-in-One API do?

**GetYourGuide All-in-One API** is a REST endpoint for GetYourGuide's live tours & activities data — search suggestions, a destination's full bookable-activity listing, activity detail with embedded reviews, and real per-date bookable availability with live pricing. All from a single always-on API powered by [Apify Standby](https://docs.apify.com/platform/actors/development/programming-interface/standby).

It talks directly to the same internal API the official [GetYourGuide](https://www.getyourguide.com/) Android app uses, reverse-engineered by capturing and analyzing live traffic from the real app, then independently re-confirmed by calling the API directly from a plain server. No GetYourGuide account, no API key — call the endpoint, get JSON back.

### Why use GetYourGuide All-in-One API?

- **No signature or token needed** — confirmed live: this API accepts self-generated, unvalidated identity headers with no cryptographic signing scheme at all
- **Real, live pricing — not a teaser** — `/activities/{id}/availability` returns actual bookable time slots with per-participant pricing that scales exactly with participant count, confirmed live against the app's own display
- **Real, working pagination** — confirmed live on the destination activity listing: distinct pages return distinct, non-overlapping activities (36 per page)
- **Rich activity detail in one call** — title, description, full image gallery, live price, and up to ~70 real customer reviews (author, rating, date, message), all from a single request
- **Always-on** — Standby mode means no cold start, responds in milliseconds
- **No account needed** — every endpoint works fully anonymously
- **Any currency** — every price-returning endpoint takes a `currency` parameter, confirmed live to change every returned price
- **Use cases:** travel content aggregation, price monitoring, activity discovery bots, review analysis, availability tracking

### Endpoints

| Method | Path                              | Description                                              |
| ------ | ---------------------------------- | ---------------------------------------------------------- |
| `GET`  | `/home`                            | The app's own Home screen: top destinations + attractions   |
| `GET`  | `/search`                          | Live search-bar suggestions (destinations + activities)     |
| `GET`  | `/locations/{id}/activities`       | A destination's full bookable-activity listing, paginated, filterable |
| `GET`  | `/activities/{id}`                 | Full activity detail, with embedded reviews + similar activities |
| `GET`  | `/activities/{id}/reviews`         | Real, paginated reviews beyond the embedded set               |
| `GET`  | `/activities/{id}/availability`    | Real bookable time slots + live pricing for one date         |

### How to use GetYourGuide All-in-One API

1. Open this Actor's Standby API URL (shown on the Actor's page, under the API tab).
2. Call any endpoint — for example:
   ```bash
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/home"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/search?q=Bali"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/locations/347/activities"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/locations/347/activities?page=2&currency=EUR"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/locations/347/activities?filters=tc-1094"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/activities/489945"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/activities/489945?currency=USD"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/activities/489945/reviews?offset=80&limit=10"
   curl "https://romy--getyourguide-all-in-one-api.apify.actor/activities/489945/availability?date=2026-09-15&adults=2"
   ```
   Every call needs your Apify API token, either as `Authorization: Bearer <token>` or `?token=<token>` — the Actor's page API tab has a ready-to-copy version with your token filled in.
3. Read the JSON response — no setup required.

### Parameters

**`GET /home`** — no required parameters. `currency`/`language` optional, same as every other endpoint.

**`GET /search`** — `q` required (partial text, e.g. `Bali`). Returns both destinations (with a `locationId` usable directly with `/locations/{id}/activities`) and individual activities.

| Param      | Type                  | Example | Meaning                          |
| ---------- | --------------------- | ------- | --------------------------------- |
| `q`        | string                | `Bali`  | Search text                        |
| `currency` | string, default `USD` | `EUR`   | ISO 4217 currency code             |
| `language` | string, default `en`  | `en`    | ISO 639-1 language code            |

**`GET /locations/{id}/activities`** — path param `id` required (a location id, from `GET /search` or `GET /home`).

| Param      | Type                     | Example      | Meaning                                                    |
| ---------- | ------------------------ | ------------ | ---------------------------------------------------------- |
| `page`     | int, default 1           | `2`          | 1-indexed page — real pagination, confirmed live             |
| `sort`     | string, default `popularity` | `popularity` | Sort order, read from the app's own sort picker         |
| `filters`  | comma-separated          | `tc-1094`    | Interest-tag ids (e.g. "For kids", "Snorkeling") — confirmed live to narrow results with pagination still working correctly. See the response's `availableFilters` for valid values for this location |
| `currency` | string, default `USD`    | `EUR`        | ISO 4217 currency code — confirmed live to change every price |
| `language` | string, default `en`     | `en`         | ISO 639-1 language code                                     |

**`GET /activities/{id}`** — path param `id` required (an activity id, from `GET /search` or `GET /locations/{id}/activities`).

| Param      | Type                  | Example | Meaning                 |
| ---------- | --------------------- | ------- | ------------------------ |
| `currency` | string, default `USD` | `EUR`   | ISO 4217 currency code    |
| `language` | string, default `en`  | `en`    | ISO 639-1 language code   |

**`GET /activities/{id}/reviews`** — path param `id` required. Real pagination beyond the ~70 reviews already embedded in `GET /activities/{id}`.

| Param      | Type                  | Example | Meaning                                            |
| ---------- | --------------------- | ------- | --------------------------------------------------- |
| `offset`   | int, default 0        | `80`    | 0-indexed review offset — real pagination, confirmed live |
| `limit`    | int, default 10       | `10`    | Reviews per page                                     |
| `currency` | string, default `USD` | `EUR`   | ISO 4217 currency code                                |
| `language` | string, default `en`  | `en`    | ISO 639-1 language code                               |

**`GET /activities/{id}/availability`** — path param `id` required. `date` required.

| Param      | Type                  | Example      | Meaning                                                          |
| ---------- | --------------------- | ------------ | ------------------------------------------------------------------ |
| `date`     | string (date)         | `2026-09-15` | `YYYY-MM-DD`                                                       |
| `adults`   | int, default 1        | `2`          | Adult participant count                                             |
| `children` | int, default 0        | `0`          | Child participant count                                             |
| `currency` | string, default `USD` | `EUR`        | ISO 4217 currency code — confirmed live to change every returned price |
| `language` | string, default `en`  | `en`         | ISO 639-1 language code                                             |

### Output

Every response is returned directly over HTTP — this Actor does not write to an Apify dataset. Real responses (trimmed for readability):

`GET /home` (trimmed to one card each):

```json
{
    "success": true,
    "destinations": [{ "title": "Rome", "image": "https://cdn.getyourguide.com/image/{options}/location_img/f9cef1b5d3bf6e3c.jpeg", "locationId": 33 }],
    "attractions": [{ "title": "Statue of Liberty", "subtitle": "196 activities", "locationId": 158431, "poiId": 2612 }]
}
```

`GET /search?q=Bali`:

```json
{
    "success": true,
    "results": {
        "suggestions": [
            { "suggestion": "Bali", "suggestionId": "location:347", "type": "location", "locationType": "area", "locationId": 347 },
            { "suggestion": "Bali: Waterbom Bali Entry Ticket", "suggestionId": "activity:253117", "type": "activity" }
        ]
    }
}
```

`GET /locations/347/activities?currency=GBP` (trimmed to one card):

```json
{
    "success": true,
    "page": 1,
    "activities": [
        {
            "id": 489945,
            "title": "Bali: Ubud Gorilla Face ATV and Ayung Rafting Trip with Meal",
            "abstract": "Experience Ubud's vibrant nature with a combo 2.5-hour Ayung River rafting trip...",
            "rating": 4.83,
            "reviewCount": 6714,
            "price": { "formatted_starting_price": "£12", "formatted_base_price": "£15", "currency": "GBP", "starting_price": 12.09 },
            "attributes": [{ "type": "duration", "label": "3 - 8 hours" }, { "type": "freeCancellation", "label": "Free cancellation" }]
        }
    ],
    "availableFilters": [{ "label": "For kids", "value": "tc-1094" }, { "label": "Snorkeling", "value": "tc-57" }]
}
```

`GET /activities/489945?currency=USD` (trimmed):

```json
{
    "success": true,
    "activity": {
        "id": 489945,
        "title": "Bali: Ubud Gorilla Face ATV and Ayung Rafting Trip with Meal",
        "description": "Experience Ubud's vibrant nature with a combo 2.5-hour Ayung River rafting trip...",
        "images": ["https://cdn.getyourguide.com/image/{options}/tour_img/2afe7caf59feeb0d.jpeg"],
        "rating": 4.83,
        "reviewCount": 6773,
        "price": { "currency": "USD", "discounted_price": 14.79, "original_price": 18.49 },
        "reviews": [{ "reviewId": "126190156", "rating": 5, "message": "...", "authorName": "marjolein – Netherlands", "authorDetail": "August 3, 2026 - Verified booking" }],
        "similar": [{ "id": 489942, "title": "Ubud: Gorilla Face ATV Quad Bike Adventure with Lunch", "rating": 4.8, "reviewCount": 1551 }]
    }
}
```

`GET /activities/489945/reviews?offset=80&limit=1`:

```json
{
    "success": true,
    "reviews": [
        {
            "reviewId": "125811614",
            "rating": 5,
            "message": "Rafting and ATV were definitely a highlight of Ubud",
            "authorName": "Adam – Australia",
            "authorDetail": "July 24, 2026 - Verified booking"
        }
    ]
}
```

`GET /activities/489945/availability?date=2026-09-15&adults=2` (trimmed to one option):

```json
{
    "success": true,
    "options": [
        {
            "optionId": 902997,
            "title": "Rafting Only Adventure with Meeting Point (No ATV)",
            "slots": [
                {
                    "label": { "text": "9:00 AM" },
                    "startTime": "2026-09-15T09:00:00+0800",
                    "priceBreakDown": [{ "startLabel": { "text": "2 Adult × $20.62" }, "endLabel": { "text": "$41.24" } }],
                    "totalPrice": { "price": 41.24, "currency": "USD" }
                }
            ]
        }
    ]
}
```

### Data notes

- **No signature or token required, confirmed from two independent angles.** First captured live from the real Android app with all real API traffic passed through an SSL-intercepting proxy; every request carried nothing but plain, self-generated identity headers. Then independently re-confirmed by calling the same API directly from a plain server, with fabricated identity headers and no device involved at all — it worked identically. This Actor sends the same simple headers a fresh app install would.
- **GetYourGuide's edge does reject Apify's datacenter IP ranges, though.** Confirmed live: a request byte-for-byte identical to one that succeeds from a non-Apify server got back an HTML error page (GetYourGuide's own branded error page, not a third-party bot-challenge) from the deployed Standby actor — an IP-reputation block, not a signing or logic issue. All outbound requests route through Apify's residential proxy pool to avoid it, one proxy session per Actor run for a stable IP, same as a real device would have.
- **The app's native code was checked for anti-bot protection and found clean.** Every native library bundled with the app was inspected; none matches any known bot-detection SDK. The only fraud-prevention vendor found in the app's traffic is invoked for checkout/payment flows, not for any endpoint this Actor uses.
- **Pagination is real, confirmed live via a two-step process.** The plain listing page always returns page 1 regardless of a `page` query parameter — real pagination lives behind a second, POST-based endpoint the app calls when scrolling or changing sort/filters, which this Actor uses internally. Confirmed live: page 2 returned 36 activities with zero id overlap against page 1.
- **`/activities/{id}/availability`'s pricing is genuinely live, not a static "from" price.** Confirmed live: requesting 2 adults for a specific date returned a total price exactly equal to 2× the per-person price shown in the same response, matching the app's own on-screen total to the cent.
- **Currency is a real, caller-controlled parameter on every price-returning endpoint, not just a display label.** Confirmed live: the same activity/listing request returns genuinely different numeric prices (not just a different currency symbol) when `currency` changes — e.g. a listing's starting price came back as `£12`/`GBP` with no currency param and `€14`/`EUR` with `currency=EUR` for the exact same activity, same request otherwise.
- **Activity detail responses are a generic, deeply nested UI-description format** rather than a flat product object — this Actor extracts the underlying clean data (title, description, images, price, reviews) from GetYourGuide's own embedded analytics payloads and a small set of well-known content blocks, rather than attempting to interpret the full UI layout, which keeps extraction stable even if GetYourGuide changes how the page visually renders.
- **`/activities/{id}/reviews` mirrors the app's own "See more reviews" modal**, confirmed live: `offset=80` returned 10 reviews with zero id overlap against the ~70 already embedded in `GET /activities/{id}`, in the same page-of-10 batching the app itself uses.
- **`filters` genuinely narrows results and pagination still works on the filtered set** — confirmed live: applying a "For kids" filter returns a completely different top result than the unfiltered listing, and the same real, non-overlapping pagination behavior holds with a filter applied.
- **`similar` reuses the exact same product-card data shape as the listing endpoint** — confirmed live: the app's own "You might also like" recommendation cards on the activity detail page carry the identical embedded analytics object as `/locations/{id}/activities`'s cards, just for different activities.
- **`/home`'s cards use a different, messier embedding than activities** — destination cards carry their location id as a JSON-encoded string inside a `metadata` tracking field rather than a direct property (attraction/POI cards do carry it directly) — this Actor handles both. A few more Home-tab rails ("Go beyond the guidebook" and similar curated/brand rails) were checked and found to be lower-value marketing picks with their own distinct embedding shape, not wrapped here.

### Pricing

Pay-per-event, billed only on a successful call — one event per request, tiered by your Apify plan (Free/Bronze/Silver/Gold/Platinum/Diamond get progressively cheaper rates). See the Actor's Pricing tab for the exact current rate per tier.

| Event | What it charges for |
| ----- | -------------------- |
| `search` | Live search-bar suggestions |
| `home-feed` | Home screen curated rails |
| `activity-reviews` | Paginated reviews beyond the embedded set |
| `activity-detail` | Full activity detail + embedded reviews + similar activities |
| `location-activities` | A destination's activity listing (36 activities/page) |
| `activity-availability` | Real bookable time slots + live per-participant pricing for one date |

### Known limitations

- **No booking/checkout endpoints.** This Actor only wraps guest-accessible, read-only search/browse/pricing endpoints — no login flow, cart, or payment/booking submission is implemented or planned, by design.
- **Sort values for `/locations/{id}/activities`'s `sort` parameter are read from the app's own sort picker but not exhaustively enumerated** — `popularity` (the default) is confirmed; other values are passed through unvalidated and may not all be accepted by the backend.
- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by GetYourGuide Deutschland GmbH. Behavior may change if GetYourGuide changes its API.

Found a bug or have a feature request? Use the Issues tab on this Actor's page.

# Actor input Schema

## Actor input object example

```json
{}
```

# Actor output Schema

## `api` (type: `string`):

This Actor doesn't write to a dataset — every response is returned directly over HTTP by its Standby web server. See the README / web server OpenAPI schema (webServerSchema) for the full endpoint list and response shapes (GET /search).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/getyourguide-all-in-one-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("romy/getyourguide-all-in-one-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call romy/getyourguide-all-in-one-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/getyourguide-all-in-one-api"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QDJjeQS2VA1b3L9Rd/builds/Lt0OgsnOqhyfzgNCK/openapi.json
