# Korea Tourism Data API - Attractions, Festivals & Hotels 관광정보 (`elabstudio/korea-tourism-data`) Actor

South Korea tourist attractions, festivals and events, hotels, restaurants, shopping and leisure spots from the official Korea Tourism Organization English API: names, addresses, GPS, dates, hours, fees, overviews and licensed photos.

- **URL**: https://apify.com/elabstudio/korea-tourism-data.md
- **Developed by:** [E:LAB STUDIO](https://apify.com/elabstudio) (community)
- **Categories:** Travel, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 places

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Korea Tourism Data API: Attractions, Festivals, Hotels & Restaurants (관광정보)

Get **South Korea tourist attractions, festivals and events, hotels, restaurants, shopping, leisure and cultural spots** as clean English JSON / CSV / Excel, straight from the **official Korea Tourism Organization (KTO, 한국관광공사) English tourism database**. Every row has the English and Korean name, category, province and district, address, GPS coordinates, phone, event dates for festivals and a representative photo with its license. Turn on details for English overviews, opening hours, closed days, fees, parking, check-in times, signature menus and event venues.

No scraping of private websites: the data comes from the government open data API, with a license that allows commercial use.

### What you can use it for

- **Travel apps and trip planners**: fill a Seoul, Busan or Jeju guide with attractions, restaurants and hotels in English, with coordinates ready for a map.
- **Festival and event calendars**: list every festival in Korea running between two dates, with venue, times, fees and organizer.
- **Travel content and SEO**: build "things to do in Gangneung" pages from official English descriptions and licensed photos.
- **Tourism research and market analysis**: count hotels, restaurants or cultural facilities per district, compare regions.
- **AI agents and chatbots**: ground a Korea travel assistant in an authoritative, structured source.

### Input

| Field | Example | Notes |
|---|---|---|
| `contentTypes` | `["attractions", "festivals"]` | `attractions`, `culture`, `festivals`, `leisure`, `accommodation`, `shopping`, `restaurants`, `transportation`. |
| `regions` | `["Seoul", "Haeundae-gu, Busan", "Jeju-do"]` | Provinces, cities or districts in English or Korean. Empty = all of South Korea. |
| `keywords` | `["palace", "market"]` | Optional English name search. |
| `festivalDateFrom` / `festivalDateTo` | `2026-12-01` / `2026-12-31` | For festivals: events running in this window. Default from today. |
| `latitude` / `longitude` / `radiusMeters` | `37.5796` / `126.9770` / `2000` | Optional: places around a point (up to 20 km), adds `distanceMeters`. |
| `includeDetails` | `true` | Adds `overview`, `website` and an `info` object with type-specific fields. |
| `includeAllImages` | `false` | With details: every licensed photo of the place. |
| `onlyWithImage` | `true` | Only listings with a photo (usually the better-known places). |
| `imageLicenses` | `["Type1", "Type3"]` | Photo URLs are returned only for these KOGL license types. |
| `sortBy` | `modified` | `modified`, `created`, `title` or `distance`. |
| `maxItems` | `100` | Total places, split across types and regions. `0` = no limit. |

Example: festivals in Korea in December

```json
{ "contentTypes": ["festivals"], "festivalDateFrom": "2026-12-01", "festivalDateTo": "2026-12-31", "maxItems": 0, "includeDetails": true }
```

Example: restaurants and cafes within 1 km of Gyeongbokgung Palace

```json
{ "contentTypes": ["restaurants"], "latitude": "37.5796", "longitude": "126.9770", "radiusMeters": 1000, "includeDetails": true }
```

Example: hotels in Jeju

```json
{ "contentTypes": ["accommodation"], "regions": ["Jeju-do"], "maxItems": 200 }
```

### Output example

Attraction with details:

```json
{
  "contentId": "1729904",
  "name": "Templestay Information Center",
  "nameKo": "템플스테이 홍보관",
  "contentType": "attractions",
  "contentTypeName": "Tourist attraction",
  "category": "Exhibition Halls",
  "categoryGroup": "Exhibition Facilities",
  "categoryTheme": "Cultural Tourism",
  "province": "Seoul",
  "district": "Jongno-gu",
  "address": "56 Ujeongguk-ro, Jongno-gu, Seoul",
  "zipcode": "03145",
  "latitude": 37.5738766687,
  "longitude": 126.9831652256,
  "imageUrl": "https://tong.visitkorea.or.kr/cms/resource/83/3050183_image2_1.JPG",
  "imageLicense": "KOGL Type 3 (attribution required, commercial use allowed, no modification)",
  "imageCredit": "Korea Tourism Organization (한국관광공사)",
  "modifiedAt": "2026-10-30T16:28:52+09:00",
  "overview": "Templestay Information Center offers various information and services regarding templestays and temple meals for domestic and international visitors...",
  "website": "https://www.templestay.com",
  "info": {
    "openingHours": "09:00-18:00",
    "closedDays": "Public holidays",
    "infoPhone": "+82-2-2031-2000",
    "parking": "Available",
    "experienceGuide": "Various temple experience activities"
  }
}
```

Festival:

```json
{
  "contentId": "3043397",
  "name": "Gwanghwamun Market",
  "nameKo": "광화문 마켓",
  "contentType": "festivals",
  "category": "Other Events",
  "province": "Seoul",
  "district": "Jongno-gu",
  "address": "B172 Sejong-daero, Jongno-gu, Seoul",
  "phone": "+82-2-3788-8105",
  "eventStartDate": "2026-12-11",
  "eventEndDate": "2027-01-10",
  "info": { "venue": "Gwanghwamun Square & Sejongno Park", "eventTimes": "17:30-23:00", "organizer": "Seoul Tourism Organization", "fees": "Free" }
}
```

### Pricing

Pay per result:

- **$2.00 per 1,000 places** (list data: names, category, address, GPS, phone, dates, photo)
- **+$1.00 per 1,000 places with details** when `includeDetails` is on

You can set a maximum cost per run in Apify and the Actor stops when it is reached.

### Good to know

- **English first**: names, addresses, overviews and info fields come from KTO's English database. The Korean name is kept in `nameKo` for matching with Korean sources.
- **Coverage**: KTO's English database lists the places it promotes to international visitors (thousands of attractions, festivals, hotels and restaurants), not every shop in Korea.
- **Photos and licenses**: every photo carries its Korea Open Government License type. Type 1 allows edits; Type 3 allows commercial use but not modification (no cropping into new artworks). Credit "Korea Tourism Organization" when you publish them. Photos without a stated license are never returned.
- **Daily limits**: the upstream API has a daily request quota. Very large pulls with details can hit it; the run then stops with a clear warning and keeps what it already saved.
- **Regions**: for newer listings KTO uses the legal-dong region codes, which this Actor uses, so filters cover new and old listings alike.

### FAQ

**Is there an English API for Korean tourist attractions?**
Yes. This Actor wraps the official Korea Tourism Organization English tourism API and returns clean English fields, so you do not need a Korean data.go.kr account or key.

**How do I get all festivals in Korea next month?**
Choose `festivals`, set `festivalDateFrom` and `festivalDateTo`, leave regions empty and set `maxItems` to `0`.

**Can I get opening hours and admission fees?**
Yes, turn on `includeDetails`. The `info` object holds opening hours, closed days, fees, parking and more, depending on the place type.

**Can I use the photos commercially?**
Photos are returned only with KOGL Type 1 or Type 3 licenses, both of which allow commercial use with attribution. Type 3 photos must not be modified.

**Does it include reviews or ratings?**
No. It uses official tourism data only, not user reviews.

### Source and license

Data: Korea Tourism Organization (한국관광공사), 영문 관광정보서비스 (English tourism information service, EngService2), published on the Public Data Portal (공공데이터포털, data.go.kr) under a license with **no usage restrictions (이용허락범위 제한 없음)**, commercial use allowed. Photos are licensed individually under the Korea Open Government License (공공누리) Type 1 or Type 3 as stated on each row; credit the Korea Tourism Organization. This Actor is an independent tool by E:LAB STUDIO and is not affiliated with or endorsed by the Korea Tourism Organization.

Questions or a missing field? Open an issue on the Actor page.

# Actor input Schema

## `contentTypes` (type: `array`):

What to list: attractions, culture (museums, galleries, theaters), festivals (festivals and events with dates), leisure, accommodation, shopping, restaurants, transportation.

## `regions` (type: `array`):

Provinces or cities ("Seoul", "Busan", "Jeju-do", "Gangwon-do") or districts ("Haeundae-gu, Busan", "Jongno-gu, Seoul"). English or Korean. Empty = all of South Korea.

## `keywords` (type: `array`):

Search names in English, for example "palace", "market", "beach", "temple". Combined with content types and regions.

## `festivalDateFrom` (type: `string`):

For festivals: events running on or after this date (YYYY-MM-DD). Default: today.

## `festivalDateTo` (type: `string`):

For festivals: optional end date (YYYY-MM-DD).

## `latitude` (type: `string`):

Optional: search around a point instead of regions, e.g. 37.5796.

## `longitude` (type: `string`):

Optional: e.g. 126.9770.

## `radiusMeters` (type: `integer`):

Radius around the point, up to 20,000 m.

## `includeDetails` (type: `boolean`):

Adds the English overview, website and type-specific info (opening hours, closed days, fees, parking, check-in times, signature menu, event venue and times). Billed as an extra event.

## `includeAllImages` (type: `boolean`):

With details: adds every licensed photo of the place.

## `onlyWithImage` (type: `boolean`):

Skip listings without a representative photo (usually the better-known places).

## `imageLicenses` (type: `array`):

Photo URLs are returned only for these Korea Open Government License (KOGL) types. Type1 = attribution, commercial use and edits allowed. Type3 = attribution, commercial use allowed, no edits.

## `sortBy` (type: `string`):

Order of results. Distance only applies to latitude/longitude searches.

## `maxItems` (type: `integer`):

Maximum places in total (split across content types and regions). 0 = no limit.

## Actor input object example

```json
{
  "contentTypes": [
    "attractions",
    "festivals"
  ],
  "regions": [
    "Seoul"
  ],
  "radiusMeters": 2000,
  "includeDetails": false,
  "includeAllImages": false,
  "onlyWithImage": true,
  "imageLicenses": [
    "Type1",
    "Type3"
  ],
  "sortBy": "modified",
  "maxItems": 20
}
```

# Actor output Schema

## `places` (type: `string`):

No description

# 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 = {
    "contentTypes": [
        "attractions",
        "festivals"
    ],
    "regions": [
        "Seoul"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("elabstudio/korea-tourism-data").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 = {
    "contentTypes": [
        "attractions",
        "festivals",
    ],
    "regions": ["Seoul"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("elabstudio/korea-tourism-data").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 '{
  "contentTypes": [
    "attractions",
    "festivals"
  ],
  "regions": [
    "Seoul"
  ],
  "maxItems": 20
}' |
apify call elabstudio/korea-tourism-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,elabstudio/korea-tourism-data"
        }
    }
}
```

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/2qbuDgWic97V55VV6/builds/GP5X6HrdTRV0fo9yY/openapi.json
