Connect

API reference

v1 public endpoints. Mostly read-only (GET); reservation requests and live-status questions are writes (POST). Every endpoint except /meta requires a Bearer key.

OpenAPI →
GET/api/v1/places

Search places

Search refined places (the oneset) by keyword, region, category, and confidence. Default sort is discovery (query fit, recency, cross-source verification, and completeness together), paginated. Use fields to shape the response.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • keywordstringoptionalPartial match on name/address/menu item. English or romanized venue names (Starbucks) and foreign dish names (bibimbap, ビビンバ, 拌饭) work as-is; when a dish name is translated to Korean, meta.keywordTranslated says so. · example: 버거킹
  • region_codestringoptionalRegion (admin-dong) code
  • business_categorystringoptionalBusiness type (restaurant/cafe/bar, plus Yumi partner non-food types salon/gym/esthetic/nail). Non-food types return approved partners only and never mix into plain food searches. Values: GET /api/v1/meta → filters.businessCategory · example: restaurant
  • min_confidencenumberoptionalMinimum confidence (0-1) · example: 0.6
  • sortstringoptionaldiscovery (default, only value) — recommendation sort. distance is unavailable without coordinates. meta.sort reports the sort actually applied and may degrade to reviews on very broad searches. · example: discovery
  • recommended_forstringoptionalNarrow by occasion (comma, all must match). Natural language resolves too. Values: solo_dining, date, group_dining, family, business_meeting, formal_gathering, late_night… Full list & aliases at /api/v1/meta. · example: group_dining
  • atmospherestringoptionalAtmosphere (comma). quiet, lively, view, cozy, trendy, spacious, traditional, clean, work_study, rainy_mood. · example: quiet
  • parkingbooleanoptionalOnly places with confirmed parking. See parking_type for the kind. · example: true
  • parking_typestringoptionalParking type: onsite, valet, partner, nearby, none. Natural language (e.g. 발렛→valet) resolves. · example: onsite
  • reservablebooleanoptionalOnly reservable places (crawl-confirmed plus Yumi Partner venues). · example: true
  • payment_methodsstringoptionalRequire payment methods (comma, all must match). cash, card, naver_pay, kakao_pay, toss_pay, alipay, wechat_pay, unionpay, apple_pay, samsung_pay… apple_pay/samsung_pay/unionpay are owner-confirmed. · example: alipay
  • servesstringoptionalServes (comma). coffee, alcohol, dessert, vegetarian, vegan. · example: alcohol
  • dietarystringoptionalDietary (comma). vegan_options, vegetarian_options, fully_vegan, mixed_group_suitable, vegetarian_mixed_group_suitable, gluten_free. Natural words (KR/EN) resolve (vegan/plant-based → vegan_options, mixed → mixed_group_suitable, gf → gluten_free). For a mixed group use mixed_group_suitable (confirmed vegan MEAL, not just a drink). gluten_free is owner-confirmed only; if a region has fewer than 10 confirmed venues the result is withheld and meta.dietaryCoverage reports it. · example: vegan_options
  • foreign_languagesstringoptionalLanguages the venue can serve customers in (ISO 639-1, comma, all must match). en, zh, ja, es, de, fr. Owner-confirmed. Natural language (영어→en, 일본어→ja) resolves. e.g. English-speaking venues for foreign guests. · example: en
  • subtypestringoptionalNormalized venue sub-type (comma = OR, 40+). Food: korean, korean_bbq, gukbap_soup, noodles, chinese, japanese, sushi_sashimi, italian, seafood… Cafe: coffee, dessert, bakery, brunch, traditional_tea… Bars: cocktail_bar, wine_bar, izakaya, pocha, hof_beer… Natural language resolves. Prefer subtype over broad business_category for venue-type intent. Full list at /api/v1/meta. · example: korean_bbq
  • bbq_meatstringoptionalMeat type a Korean BBQ venue serves (comma = OR): pork, beef, duck, lamb. Independent of subtype — subtype=korean_bbq picks the venue type, bbq_meat=pork narrows the meat. Mixed venues match both. · example: pork
  • viewstringoptionalView type (comma = OR): ocean, sunset, river, mountain, night, city, garden. A venue with ocean+sunset matches both. Natural language (바다뷰→ocean, 한강뷰→river, 야경→night) resolves. · example: ocean
  • max_dish_priceintegeroptionalOnly venues with at least one dish at or under this price (KRW). 'Meals under 10,000 won' = max_dish_price=10000. Judged on the cheapest real dish (sides like rice or noodle add-ons excluded); venues with unknown prices are not included. For 'good value' without a number, use good_value=true. · example: 10000
  • foreigner_friendlybooleanoptionalPlaces you can manage without Korean: a foreign-language menu OR confirmed foreign-language service (either one). Menu only: english_menu=true. A specific language: foreign_languages. · example: true
  • legacybooleanoptionalOfficially designated long-running venues only (Centennial Stores, Seoul Oraegage, Seoul Future Heritage). For 'old-school / heritage restaurants' use this instead of a keyword. · example: true
  • local_foodstringoptionalVenues whose name or signature dish is a local specialty of that region (Busan = dwaeji-gukbap, milmyeon…). Value: a region name (local_food=부산) or sido code, or true together with region_code. All 17 provinces. · example: 부산
  • excludestringoptional'Anything but…'. Removes venues whose name or signature dish is that food (comma = exclude all). Venues that merely list it as a side item stay. · example: 돼지국밥
  • muslim_friendlybooleanoptionalVenues known to welcome Muslim guests (halal wording in the name/menu, or owner-confirmed). NOT official halal certification — the response meta always carries a note to confirm certification, a pork-free kitchen, and alcohol with the venue. · example: true
  • featured_bystringoptionalOnly venues introduced by a consenting ambassador (influencer). Partial match on name, handle, or channel. If nobody matches, you get 0 results plus meta.featuredBy listing who is available. · example: 성시경
  • associated_withstringoptionalOnly venues publicly reported as linked to a celebrity, group, or show ('where BTS ate', 'Goblin filming spot'). If nothing matches, you get 0 results plus meta.associatedWith listing available subjects. · example: BTS
  • pet_friendlybooleanoptionalExample boolean presence filter. Attach the param to require =true (only confirmed places). All 54 boolean filters supported today: wifi, parking, outdoor_seating, group_friendly, kids_friendly, reservable, takeout, delivery, dine_in, catering, corkage_free, corkage_available, wheelchair_accessible, high_chair, no_kids_zone, smoking_area, restroom_gender_separated, power_outlets, stroller_storage, deposit_required, restroom_clean, waiting_expected, leftover_packing, repeat_customers, private_room, has_promotion, real_bar, english_menu, foreigner_friendly, good_value, rooftop, hanok, photo_spot, local_favorite, nursing_room, live_music, fireplace, floor_seating, counter_seating, inside_market, board_game, sports_bar, temple_food, natural_wine, craft_beer, omakase, unlimited_refill, charcoal_grill, domestic_ingredients, traditional_liquor, kids_play_area, fine_dining, michelin_star. Special filters (muslim_friendly, legacy, local_food, exclude, featured_by, associated_with) at /api/v1/meta. · example: true
  • open_atstringoptionalOnly places open at that time — a point or a meal window (KST). Point: 2026-08-26T19:00, '2026-08-26 19:00', '19:00' (today), 'now'. Meal windows: 'lunch' (11:00-14:00), 'dinner' (17:30-21:00), breakfast, brunch, late_night, a custom range '11:00-14:00', or combined with a date '2026-08-29 lunch'. Relative days: only 오늘/내일/모레 (today/tomorrow) are understood — send any other date absolutely. A window matches venues open for at least part of it, and the resolved range is echoed in meta.openAt.window. Based on regular hours, last order, and break times, including past-midnight sessions. Temporary closures and being full are not knowable. Venues with unconfirmed hours are excluded by default and reported via meta.openAt.unknownHoursExcluded. · example: 2026-08-26T19:00
  • include_unknown_hoursbooleanoptionalEscape hatch for open_at only. true also returns venues whose hours are unconfirmed (those are 'unknown', not 'open at that time'). · example: true
  • reservation_channelstringoptionalHow the venue can be booked (comma = OR): yumi (bookable via POST /api/v1/reservations) · phone. 'Accepts reservations' is not 'has a table at that time' — actual availability is only known by placing a request. · example: yumi
  • fieldsstringoptionalPick fields (Field Mask). Comma-separated tier names (core/contact_hours/quality/edge/media), 'all', or individual field names. Defaults to core. Call tokens = the highest field tier requested (per-request; page_size does not affect tokens). Owner-uploaded photos come via photos (media tier, highest cost 8 — venue & menu image URLs); in lists use photoCount (quality) for a cheap count. recommendedFor may include occasion tags such as solo_dining, late_night, and late_night_eatery. · example: core,reviewCount,accessHints
  • pageintegeroptionalPage (default 1) · example: 1
  • page_sizeintegeroptionalItems per page (max 100). Does not affect tokens (per-request billing). Live API keys can reach a per-plan result window (free 100 · Starter 1,000 · Pro/Scale 5,000); beyond that use Bulk Export. · example: 20

Response example

json

{
  "success": true,
  "data": [
    {
      "id": "11892345",
      "name": "콩부자 홍제점",
      "category": "restaurant",
      "categoryLabel": "국밥",
      "location": {
        "lat": 37.5891,
        "lng": 126.9436
      },
      "address": {
        "road": "서울 서대문구 통일로 450",
        "jibun": "서울 서대문구 홍제동 330"
      },
      "regionCode": "1141011100",
      "confidence": 0.64,
      "sourceCount": 2,
      "possiblyClosed": false,
      "lastSeenAt": "2026-06-18T03:00:00.000Z",
      "placeUrl": "https://heyyumi.ai/places/11892345"
    }
  ],
  "meta": {
    "total": 5,
    "page": 1,
    "pageSize": 20,
    "totalPages": 1
  }
}
GET/api/v1/places/nearby

Nearby search

Find places around a coordinate (lat·lng) within a radius (m), nearest first. Each result includes distanceM (meters from center). sort=discovery switches to recommendation ranking within the radius. fields/tokens behave like Search places.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • latnumberrequiredLatitude · example: 37.5704
  • lngnumberrequiredLongitude · example: 126.9921
  • radiusintegeroptionalRadius in meters (default 1000, max 5000) · example: 500
  • business_categorystringoptionalBusiness type filter (same values as search; non-food = approved partners only) · example: cafe
  • keywordstringoptionalPartial match on name/address/menu item. English or romanized venue names (Starbucks) and foreign dish names (bibimbap, ビビンバ, 拌饭) work as-is; when a dish name is translated to Korean, meta.keywordTranslated says so.
  • sortstringoptionaldistance (default, nearest first) or discovery (recommendation ranking within the radius). Use distance for 'closest to me', discovery for 'somewhere good near here'. meta.sort reports the sort actually applied (may degrade to distance on deep pages or wide radii). · example: discovery
  • recommended_forstringoptionalNarrow by occasion (comma, all must match). Natural language resolves too. Values: solo_dining, date, group_dining, family, business_meeting, formal_gathering, late_night… Full list & aliases at /api/v1/meta. · example: group_dining
  • atmospherestringoptionalAtmosphere (comma). quiet, lively, view, cozy, trendy, spacious, traditional, clean, work_study, rainy_mood. · example: quiet
  • parkingbooleanoptionalOnly places with confirmed parking. See parking_type for the kind. · example: true
  • parking_typestringoptionalParking type: onsite, valet, partner, nearby, none. Natural language (e.g. 발렛→valet) resolves. · example: onsite
  • reservablebooleanoptionalOnly reservable places (crawl-confirmed plus Yumi Partner venues). · example: true
  • payment_methodsstringoptionalRequire payment methods (comma, all must match). cash, card, naver_pay, kakao_pay, toss_pay, alipay, wechat_pay, unionpay, apple_pay, samsung_pay… apple_pay/samsung_pay/unionpay are owner-confirmed. · example: alipay
  • servesstringoptionalServes (comma). coffee, alcohol, dessert, vegetarian, vegan. · example: alcohol
  • dietarystringoptionalDietary (comma). vegan_options, vegetarian_options, fully_vegan, mixed_group_suitable, vegetarian_mixed_group_suitable, gluten_free. Natural words (KR/EN) resolve (vegan/plant-based → vegan_options, mixed → mixed_group_suitable, gf → gluten_free). For a mixed group use mixed_group_suitable (confirmed vegan MEAL, not just a drink). gluten_free is owner-confirmed only; if a region has fewer than 10 confirmed venues the result is withheld and meta.dietaryCoverage reports it. · example: vegan_options
  • foreign_languagesstringoptionalLanguages the venue can serve customers in (ISO 639-1, comma, all must match). en, zh, ja, es, de, fr. Owner-confirmed. Natural language (영어→en, 일본어→ja) resolves. e.g. English-speaking venues for foreign guests. · example: en
  • subtypestringoptionalNormalized venue sub-type (comma = OR, 40+). Food: korean, korean_bbq, gukbap_soup, noodles, chinese, japanese, sushi_sashimi, italian, seafood… Cafe: coffee, dessert, bakery, brunch, traditional_tea… Bars: cocktail_bar, wine_bar, izakaya, pocha, hof_beer… Natural language resolves. Prefer subtype over broad business_category for venue-type intent. Full list at /api/v1/meta. · example: korean_bbq
  • bbq_meatstringoptionalMeat type a Korean BBQ venue serves (comma = OR): pork, beef, duck, lamb. Independent of subtype — subtype=korean_bbq picks the venue type, bbq_meat=pork narrows the meat. Mixed venues match both. · example: pork
  • viewstringoptionalView type (comma = OR): ocean, sunset, river, mountain, night, city, garden. A venue with ocean+sunset matches both. Natural language (바다뷰→ocean, 한강뷰→river, 야경→night) resolves. · example: ocean
  • max_dish_priceintegeroptionalOnly venues with at least one dish at or under this price (KRW). 'Meals under 10,000 won' = max_dish_price=10000. Judged on the cheapest real dish (sides like rice or noodle add-ons excluded); venues with unknown prices are not included. For 'good value' without a number, use good_value=true. · example: 10000
  • foreigner_friendlybooleanoptionalPlaces you can manage without Korean: a foreign-language menu OR confirmed foreign-language service (either one). Menu only: english_menu=true. A specific language: foreign_languages. · example: true
  • legacybooleanoptionalOfficially designated long-running venues only (Centennial Stores, Seoul Oraegage, Seoul Future Heritage). For 'old-school / heritage restaurants' use this instead of a keyword. · example: true
  • local_foodstringoptionalVenues whose name or signature dish is a local specialty of that region (Busan = dwaeji-gukbap, milmyeon…). Value: a region name (local_food=부산) or sido code, or true together with region_code. All 17 provinces. · example: 부산
  • excludestringoptional'Anything but…'. Removes venues whose name or signature dish is that food (comma = exclude all). Venues that merely list it as a side item stay. · example: 돼지국밥
  • muslim_friendlybooleanoptionalVenues known to welcome Muslim guests (halal wording in the name/menu, or owner-confirmed). NOT official halal certification — the response meta always carries a note to confirm certification, a pork-free kitchen, and alcohol with the venue. · example: true
  • featured_bystringoptionalOnly venues introduced by a consenting ambassador (influencer). Partial match on name, handle, or channel. If nobody matches, you get 0 results plus meta.featuredBy listing who is available. · example: 성시경
  • associated_withstringoptionalOnly venues publicly reported as linked to a celebrity, group, or show ('where BTS ate', 'Goblin filming spot'). If nothing matches, you get 0 results plus meta.associatedWith listing available subjects. · example: BTS
  • pet_friendlybooleanoptionalExample boolean presence filter. Attach the param to require =true (only confirmed places). All 54 boolean filters supported today: wifi, parking, outdoor_seating, group_friendly, kids_friendly, reservable, takeout, delivery, dine_in, catering, corkage_free, corkage_available, wheelchair_accessible, high_chair, no_kids_zone, smoking_area, restroom_gender_separated, power_outlets, stroller_storage, deposit_required, restroom_clean, waiting_expected, leftover_packing, repeat_customers, private_room, has_promotion, real_bar, english_menu, foreigner_friendly, good_value, rooftop, hanok, photo_spot, local_favorite, nursing_room, live_music, fireplace, floor_seating, counter_seating, inside_market, board_game, sports_bar, temple_food, natural_wine, craft_beer, omakase, unlimited_refill, charcoal_grill, domestic_ingredients, traditional_liquor, kids_play_area, fine_dining, michelin_star. Special filters (muslim_friendly, legacy, local_food, exclude, featured_by, associated_with) at /api/v1/meta. · example: true
  • open_atstringoptionalOnly places open at that time — a point or a meal window (KST). Point: 2026-08-26T19:00, '2026-08-26 19:00', '19:00' (today), 'now'. Meal windows: 'lunch' (11:00-14:00), 'dinner' (17:30-21:00), breakfast, brunch, late_night, a custom range '11:00-14:00', or combined with a date '2026-08-29 lunch'. Relative days: only 오늘/내일/모레 (today/tomorrow) are understood — send any other date absolutely. A window matches venues open for at least part of it, and the resolved range is echoed in meta.openAt.window. Based on regular hours, last order, and break times, including past-midnight sessions. Temporary closures and being full are not knowable. Venues with unconfirmed hours are excluded by default and reported via meta.openAt.unknownHoursExcluded. · example: 2026-08-26T19:00
  • include_unknown_hoursbooleanoptionalEscape hatch for open_at only. true also returns venues whose hours are unconfirmed (those are 'unknown', not 'open at that time'). · example: true
  • reservation_channelstringoptionalHow the venue can be booked (comma = OR): yumi (bookable via POST /api/v1/reservations) · phone. 'Accepts reservations' is not 'has a table at that time' — actual availability is only known by placing a request. · example: yumi
  • fieldsstringoptionalPick fields (Field Mask). Comma-separated tier names (core/contact_hours/quality/edge/media), 'all', or individual field names. Defaults to core. Call tokens = the highest field tier requested (per-request; page_size does not affect tokens). Owner-uploaded photos come via photos (media tier, highest cost 8 — venue & menu image URLs); in lists use photoCount (quality) for a cheap count. recommendedFor may include occasion tags such as solo_dining, late_night, and late_night_eatery. · example: core,reviewCount,accessHints
  • pageintegeroptionalPage (default 1) · example: 1
  • page_sizeintegeroptionalItems per page (max 100). Does not affect tokens (per-request billing). Live API keys can reach a per-plan result window (free 100 · Starter 1,000 · Pro/Scale 5,000); beyond that use Bulk Export. · example: 20

Response example

json

{
  "success": true,
  "data": [
    {
      "id": "11892345",
      "name": "콩부자 홍제점",
      "category": "restaurant",
      "categoryLabel": "국밥",
      "location": {
        "lat": 37.5891,
        "lng": 126.9436
      },
      "address": {
        "road": "서울 서대문구 통일로 450",
        "jibun": "서울 서대문구 홍제동 330"
      },
      "regionCode": "1141011100",
      "confidence": 0.64,
      "sourceCount": 2,
      "possiblyClosed": false,
      "lastSeenAt": "2026-06-18T03:00:00.000Z",
      "placeUrl": "https://heyyumi.ai/places/11892345",
      "distanceM": 0
    }
  ],
  "meta": {
    "total": 12,
    "page": 1,
    "pageSize": 20,
    "totalPages": 1,
    "center": {
      "lat": 37.5704,
      "lng": 126.9921
    },
    "radius": 500
  }
}
GET/api/v1/places/{id}

Place detail

A single place. Use fields to fetch only the tiers you need (fields=all returns hours, menu, access hints, recommendation context, and more).

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • idstringrequiredPlace id (canonical) · example: 11782345
  • fieldsstringoptionalPick fields (Field Mask). Comma-separated tier names (core/contact_hours/quality/edge/media), 'all', or individual field names. Defaults to core. Call tokens = the highest field tier requested (per-request; page_size does not affect tokens). Owner-uploaded photos come via photos (media tier, highest cost 8 — venue & menu image URLs); in lists use photoCount (quality) for a cheap count. recommendedFor may include occasion tags such as solo_dining, late_night, and late_night_eatery. · example: core,reviewCount,accessHints

Response example

json

{
  "success": true,
  "data": {
    "id": "11892345",
    "name": "콩부자 홍제점",
    "category": "restaurant",
    "categoryLabel": "국밥",
    "location": {
      "lat": 37.5891,
      "lng": 126.9436
    },
    "address": {
      "road": "서울 서대문구 통일로 450",
      "jibun": "서울 서대문구 홍제동 330"
    },
    "regionCode": "1141011100",
    "confidence": 0.64,
    "sourceCount": 2,
    "possiblyClosed": false,
    "lastSeenAt": "2026-06-18T03:00:00.000Z",
    "placeUrl": "https://heyyumi.ai/places/11892345",
    "rating": null,
    "reviewCount": 10731,
    "latestReviewDate": "2026-06-15",
    "freshnessScore": 0.82,
    "dataQuality": {
      "veracity": 5,
      "completeness": 1,
      "confidence": 0.64,
      "recency": 0.99,
      "last_verified_days_ago": 4
    },
    "price": {
      "level": 2,
      "avg": 8000,
      "min": 4500,
      "max": 12000
    },
    "menuSummary": {
      "count": 12,
      "items": [
        "콩나물국밥",
        "수육",
        "모둠전"
      ]
    },
    "openNow": {
      "open": true,
      "reason": "open",
      "lastOrderPassed": false
    },
    "closureSignal": null,
    "promotion": null,
    "nearestStation": {
      "station": "홍제",
      "walkMin": 5
    },
    "photoCount": 5,
    "photos": {
      "count": 5,
      "main": "https://<supabase>/storage/v1/object/public/owner-photos/<uid>/11892345/1718000000000.jpg",
      "gallery": [
        {
          "category": "interior",
          "url": "https://<supabase>/storage/v1/object/public/owner-photos/<uid>/11892345/1718000000000.jpg",
          "isMain": true
        },
        {
          "category": "exterior",
          "url": "https://<supabase>/storage/v1/object/public/owner-photos/<uid>/11892345/1718000000001.jpg",
          "isMain": false
        }
      ],
      "menu": [
        {
          "menuItem": "콩나물국밥",
          "url": "https://<supabase>/storage/v1/object/public/owner-photos/<uid>/11892345/1718000000002.jpg"
        }
      ],
      "menuBoard": [
        "https://<supabase>/storage/v1/object/public/owner-photos/<uid>/11892345/1718000000003.jpg"
      ]
    },
    "phone": "02-123-4567",
    "homepage": null,
    "bookingUrl": null,
    "yumiReservable": false,
    "reservationChannels": [
      "phone"
    ],
    "snsLinks": null,
    "businessHours": [
      {
        "day": "mon",
        "closed": false,
        "open": "00:00",
        "close": "24:00",
        "endsNextDay": false,
        "breaks": [],
        "lastOrder": null
      }
    ],
    "is24h": true,
    "temporaryClosures": null,
    "accessHints": {
      "subway": [
        {
          "station": "홍제",
          "lines": [
            "3호선"
          ],
          "distanceM": 360,
          "walkMin": 5
        },
        {
          "station": "무악재",
          "lines": [
            "3호선"
          ],
          "distanceM": 920,
          "walkMin": 13
        }
      ]
    },
    "recommendedFor": [
      "solo_dining",
      "late_night",
      "late_night_eatery"
    ],
    "atmosphere": [
      "캐주얼",
      "빠른"
    ],
    "menu": [
      {
        "name": "콩나물국밥",
        "price": 8000,
        "recommend": true,
        "isNew": false,
        "description": "24시간 끓인 진한 국물에 아삭한 콩나물."
      },
      {
        "name": "매생이굴국밥",
        "price": 9500,
        "recommend": false,
        "isNew": true
      }
    ],
    "serviceAttributes": {
      "parking": true,
      "parking_type": "onsite",
      "parking_fee": "paid",
      "parking_note": "매장 주차 가능(유료)",
      "dine_in": true,
      "reservable": true,
      "venue_subtype": "gukbap_soup",
      "foreign_languages": [
        "en"
      ],
      "dietary": {
        "fully_vegan": false,
        "vegan_options": true,
        "vegetarian_options": true,
        "mixed_group_suitable": true,
        "vegan_menu_count": 3,
        "vegan_main_count": 2,
        "non_vegan_menu_count": 8,
        "confidence": 0.62,
        "note": "비건 메뉴와 일반 메뉴가 함께 있어 비건과 비(非)비건이 같이 가기 좋아요. 조리 분리는 확인이 필요해요."
      }
    },
    "atmosphereScores": {
      "late_night": 6,
      "late_night_eatery": 8,
      "quiet": 6.5,
      "lively": 4
    },
    "aiSummary": "홍제역 근처 캐주얼 국밥집, 혼밥·심야식당 수요에 적합.",
    "influencerFeatures": [
      {
        "platform": "instagram",
        "account": "example.creator",
        "profileUrl": "https://www.instagram.com/example.creator",
        "featuredAt": "2026-08-19",
        "dishes": [],
        "contentUrls": [
          {
            "url": "https://www.instagram.com/reel/EXAMPLE1/",
            "postedAt": "2026-08-19"
          }
        ],
        "media": [
          {
            "kind": "video_cover",
            "url": "https://…/influencer-media/example.creator/1/0.jpg",
            "posterUrl": null,
            "postUrl": "https://www.instagram.com/reel/EXAMPLE1/",
            "postedAt": "2026-08-19",
            "credit": "@example.creator (Instagram)"
          }
        ]
      }
    ]
  }
}
GET/api/v1/places/{id}/history

Place history

A record of the days when the review count or latest review date changed (updated nightly, newest first, up to 365 rows). Gaps between dates mean nothing changed in between. Use it to judge changes in a place's activity yourself. Star ratings are not provided, so rating is always null.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • idstringrequiredPlace id (canonical) · example: 11782345

Response example

json

{
  "success": true,
  "data": [
    {
      "date": "2026-10-16",
      "reviewCount": 10812,
      "rating": null,
      "latestReviewDate": "2026-10-15",
      "freshnessScore": 0.97
    },
    {
      "date": "2026-06-18",
      "reviewCount": 10731,
      "rating": null,
      "latestReviewDate": "2026-06-15",
      "freshnessScore": 0.82
    }
  ],
  "meta": {
    "recording": "change_only",
    "note": "A row is recorded only on days when reviewCount, latestReviewDate or source count changed; gaps mean no change."
  }
}
GET/api/v1/regions

Regions · resolve dong name

Resolves a dong (neighborhood) name into codes & coordinates (location lookup when you have no GPS). Dong names are not unique (e.g. Hongje-dong = Seoul Seodaemun-gu + Gangwon Gangneung), so candidates are returned disambiguated by sido/sigungu, with place counts and a representative center. Feed a chosen center into /places/nearby to also cover adjacent dongs. Without dong, lists all regions that have places.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • dongstringoptionalDong name (e.g. 홍제동) — returns candidates · example: 홍제동
  • sigungustringoptionalNarrow by sigungu (e.g. 서대문구)
  • sidostringoptionalNarrow by sido (e.g. 서울특별시)
  • region_codestringoptionalLook up a single region code
  • include_emptybooleanoptionalInclude regions with no places yet (default false)

Response example

json

{
  "success": true,
  "data": [
    {
      "regionCode": "1141011100",
      "sido": "서울특별시",
      "sigungu": "서대문구",
      "dong": "홍제동",
      "fullName": "서울특별시 서대문구 홍제동",
      "center": {
        "lat": 37.577976,
        "lng": 126.938483
      },
      "placeCount": 280
    }
  ]
}
GET/api/v1/categories

Categories

Place counts per category in the oneset.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

No parameters

Response example

json

{
  "success": true,
  "data": [
    {
      "category": "restaurant",
      "count": 354029
    }
  ]
}
GET/api/v1/stats

Dataset stats

Total places, regions, multi-source share, average confidence, category breakdown.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

No parameters

Response example

json

{
  "success": true,
  "data": {
    "totalPlaces": 523685,
    "totalRegions": 2453,
    "multiSourcePlaces": 414650,
    "avgConfidence": 0.869,
    "byCategory": [
      {
        "category": "restaurant",
        "count": 354029
      },
      {
        "category": "cafe",
        "count": 134241
      },
      {
        "category": "bar",
        "count": 35239
      }
    ]
  }
}
GET/api/v1/meta

Filter & field vocabulary

Key-free (no billing, 1h cache). Returns the supported attribute filters, values, natural-language aliases, and field tiers. The single source of truth for filter vocabulary, which MCP and SDKs sync from automatically.

Key-free · no billing

Run in playground →

Parameters

No parameters

Response example

json

{
  "version": 1,
  "filters": {
    "boolean": [
      "wifi",
      "parking",
      "outdoor_seating",
      "pet_friendly",
      "group_friendly",
      "kids_friendly",
      "reservable",
      "takeout",
      "delivery",
      "dine_in",
      "catering",
      "corkage_free",
      "corkage_available",
      "wheelchair_accessible",
      "high_chair",
      "no_kids_zone",
      "smoking_area",
      "restroom_gender_separated",
      "power_outlets",
      "stroller_storage",
      "deposit_required",
      "restroom_clean",
      "waiting_expected",
      "leftover_packing",
      "repeat_customers",
      "private_room",
      "has_promotion",
      "real_bar",
      "english_menu",
      "foreigner_friendly",
      "good_value",
      "rooftop",
      "hanok",
      "photo_spot",
      "local_favorite",
      "nursing_room",
      "live_music",
      "fireplace",
      "floor_seating",
      "counter_seating",
      "inside_market",
      "board_game",
      "sports_bar",
      "temple_food",
      "natural_wine",
      "craft_beer",
      "omakase",
      "unlimited_refill",
      "charcoal_grill",
      "domestic_ingredients",
      "traditional_liquor",
      "kids_play_area",
      "fine_dining",
      "michelin_star"
    ],
    "enum": {
      "parking_type": [
        "onsite",
        "valet",
        "partner",
        "nearby",
        "none"
      ]
    },
    "subtype": [
      "cocktail_bar",
      "whisky_bar",
      "wine_bar",
      "bar_generic",
      "izakaya",
      "pocha",
      "hof_beer",
      "korean_pub",
      "coffee",
      "dessert",
      "bakery",
      "ice_cream",
      "brunch",
      "tea",
      "traditional_tea",
      "juice_fruit",
      "themed",
      "korean",
      "korean_bbq",
      "gopchang",
      "jokbal_bossam",
      "chicken",
      "chinese",
      "japanese",
      "sushi_sashimi",
      "western",
      "italian",
      "vietnamese",
      "asian",
      "noodles",
      "bunsik",
      "burger",
      "gukbap_soup",
      "jjigae",
      "shabu",
      "seafood",
      "salad_healthy",
      "sandwich_deli",
      "lunchbox",
      "buffet"
    ],
    "bbq_meat": [
      "pork",
      "beef",
      "duck",
      "lamb"
    ],
    "view": [
      "ocean",
      "sunset",
      "river",
      "mountain",
      "night",
      "city",
      "garden"
    ],
    "reservationChannel": [
      "yumi",
      "phone"
    ],
    "array": {
      "payment_methods": [
        "cash",
        "card",
        "toss_pay",
        "kakao_pay",
        "naver_pay",
        "zero_pay",
        "local_gift",
        "gov_support",
        "alipay",
        "wechat_pay",
        "apple_pay",
        "samsung_pay",
        "unionpay"
      ],
      "serves": [
        "coffee",
        "alcohol",
        "dessert",
        "vegetarian",
        "vegan"
      ],
      "dietary": [
        "vegan_options",
        "vegetarian_options",
        "fully_vegan",
        "mixed_group_suitable",
        "vegetarian_mixed_group_suitable",
        "gluten_free"
      ],
      "foreign_languages": [
        "en",
        "zh",
        "ja",
        "es",
        "de",
        "fr"
      ],
      "recommended_for": [
        "solo_dining",
        "solo_drinking",
        "date",
        "group_dining",
        "group_drinking",
        "family",
        "business_meeting",
        "formal_gathering",
        "late_night",
        "late_night_eatery"
      ],
      "atmosphere": [
        "cozy",
        "quiet",
        "lively",
        "spacious",
        "view",
        "trendy",
        "traditional",
        "clean",
        "work_study",
        "rainy_mood"
      ]
    },
    "aliases": {
      "recommended_for": {
        "회식": "group_dining",
        "혼밥": "solo_dining",
        "상견례": "formal_gathering"
      },
      "atmosphere": {
        "조용한": "quiet",
        "뷰맛집": "view"
      },
      "parking_type": {
        "발렛": "valet"
      },
      "foreign_languages": {
        "영어": "en",
        "일본어": "ja"
      },
      "subtype": {
        "삼겹살": "korean_bbq",
        "국밥": "gukbap_soup",
        "칵테일바": "cocktail_bar"
      },
      "bbq_meat": {
        "삼겹살": "pork",
        "한우": "beef",
        "오리": "duck"
      },
      "view": {
        "바다뷰": "ocean",
        "한강뷰": "river",
        "야경": "night"
      },
      "dietary": {
        "비건": "vegan_options",
        "글루텐프리": "gluten_free"
      }
    }
  },
  "fields": {
    "tiers": {
      "core": 1,
      "contact_hours": 2,
      "quality": 2,
      "edge": 4,
      "media": 8
    },
    "byField": {
      "name": "core",
      "temporaryClosures": "contact_hours",
      "reviewCount": "quality",
      "serviceAttributes": "edge",
      "influencerFeatures": "edge",
      "photos": "media"
    }
  },
  "coverage": {
    "supported": [
      "서울",
      "경기",
      "부산",
      "제주",
      "인천",
      "대전",
      "세종",
      "충북",
      "충남"
    ],
    "note": "현재 서울·경기·부산·제주·인천·대전·세종·충남·충북 9개 시/도를 공식 제공(coverage 확대 중). 그 밖 지역(대구·광주·강원 등)은 결과가 비면 '아직 미지원'으로 안내."
  }
}
POST/api/v1/reservations

Request a reservation

Request a table reservation at any venue that takes requests (detail shows yumiBooking.canRequest=true — Yumi Partners plus most other venues). No prepayment. The request goes straight to the venue and the response starts as status='pending' (not yet confirmed). The owner accepting → confirmed, declining → cancelled, no response (~5 min) → expired. Poll the status endpoint (GET) for the outcome. The guest is texted progress via KakaoTalk/SMS. Non-partner venues (yumiBooking.partner=false) take requests daily from 10:00 to 20:00 KST. Outside those hours you get 422 reservation_requests_closed (retryAfter = next opening), unless you send deferIfClosed:true: then the request is held and the venue reviews it from the next 10:00 (response reviewStartsAt; the reservation time must be at least an hour after that; the guest gets the result by text or email). if the venue is closed at the requested time, 422 venue_closed_at_requested_time (pick another time); if the time is later than 2 hours before closing, 422 reservation_too_close_to_closing (latestReservation = the latest time accepted); venues that can't take requests return 422 reservation_not_available (do not retry — tell the user this venue can't be booked through HeyYumi yet). Pass idempotencyKey to safely retry the same request without creating duplicates. To test an integration, send the `X-Map3-Sandbox: 1` header: validation and the partner check run for real, but nothing is stored and no owner push or guest text goes out. You get a simulated reservation (reservationId starts with sbx_r_, sandbox:true) that settles after about 8 seconds (confirmed by default, change it with sandboxOutcome). The playground always runs in sandbox mode.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

No parameters

Request body (JSON)

  • placeIdstringrequiredCanonical place id. Get it from a search first. The example is a Yumi Partner venue. · example: 1726507251
  • reservationTimestringrequiredRequested date & time in ISO 8601 with timezone offset (future). Korea is +09:00. · example: 2026-12-01T19:00:00+09:00
  • guestCountintegerrequiredParty size (at least 1). · example: 2
  • guestPhonestringrequiredGuest phone (required) — for status texts (KakaoTalk/SMS) and no-show contact. Missing → guest_phone_required. · example: 010-1234-5678
  • guestNamestringoptionalGuest name (recommended) so the owner knows who's coming. · example: 홍길동
  • guestEmailstringoptionalGuest email. Required when the phone is not a Korean number — we can't text international numbers, so status updates and the view/cancel link go by email. Missing → guest_email_required. · example: guest@example.com
  • guestLanguagestringoptionalLanguage the guest reads (ISO 639-1, e.g. en, ja, zh). Guest notices go out in this language. If omitted we guess from the note and phone number. · example: en
  • notestringoptionalOptional note to the owner (seating, occasion, allergies).
  • idempotencyKeystringrequiredStable key (e.g. a UUID) to safely retry the same reservation. Required on REST; the MCP request_reservation tool generates one if omitted, and so does the playground on each run.
  • deferIfClosedbooleanoptionalIf true, a non-partner request outside request hours (10:00–20:00 KST) is held and the venue reviews it from the next 10:00. The response carries reviewStartsAt, and you don't need to keep polling meanwhile (the guest is told by text or email). Omit it to get 422 reservation_requests_closed. · example: true
  • sandboxOutcomestringoptionalSandbox only: the outcome to simulate, confirmed (default), cancelled, or expired (after 5 min). Ignored in live mode. · example: confirmed

Response example

json

{
  "success": true,
  "data": {
    "reservationId": "b1f2c3d4-0000-0000-0000-000000000000",
    "status": "pending",
    "placeId": "1726507251",
    "expiresAt": "2026-12-01T10:05:00.000Z"
  }
}
GET/api/v1/reservations/{id}

Reservation status (long-poll)

Check a reservation's current status. status: pending, confirmed, cancelled, expired, no_show. Pass ?wait=<sec> (max 25) to long-poll — it returns the moment the reservation settles (confirmed/cancelled/expired); if still pending, call again to fill the ~5-minute window, then report the final settled outcome. Sandbox ids (sbx_r_…) are polled the same way.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • idstringrequiredThe reservationId returned by the create call. · example: b1f2c3d4-0000-0000-0000-000000000000
  • waitintegeroptionalLong-poll seconds (0-25). Omit for a one-shot check. · example: 25

Response example

json

{
  "success": true,
  "data": {
    "reservationId": "b1f2c3d4-0000-0000-0000-000000000000",
    "placeId": "11782345",
    "status": "confirmed",
    "settled": true,
    "reservationTime": "2026-09-01T19:00:00+09:00",
    "guestCount": 2,
    "approvedAt": "2026-09-01T10:02:11.000Z",
    "createdAt": "2026-09-01T10:00:00.000Z",
    "expiresAt": "2026-09-01T10:05:00.000Z"
  }
}
POST/api/v1/live-status

Live status (ask the venue right now)

Send the owner a time-sensitive question that map/review/static data can't answer and that changes through the day — (A) is this menu item available now / today's fresh stock / sold out (kind=item), (D) how long is the wait right now (kind=wait), (E) can a party of N get in right now (kind=seats, headcount required). Same rail as reservations: at a venue with an active owner (on the Yumi Partners app) the app gets an instant push and the response starts as status='pending' (5-minute answer window). The owner answers with one tap → available, limited, unavailable, soon, or not_offered; poll GET /api/v1/live-status/{queryId} (long-poll) for the outcome. To avoid re-bothering the owner, if a fresh answer already exists for the same venue+topic it's reused instantly (reused=true), and a pending identical question is joined. If 'now' is outside confirmed opening hours the owner is not disturbed and you get blocked='closed_now' immediately (do not retry — surface the hours). Venues without an active owner return 422 live_status_not_available. Do not use this for static info like hours, parking, or pet policy — answer those from search. With the `X-Map3-Sandbox: 1` header, the venue check and opening-hours guard run for real, nothing is sent to the owner, and a simulated answer arrives after about 8 seconds (queryId starts with sbx_l_, sandbox:true). The playground always runs in sandbox mode.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

No parameters

Request body (JSON)

  • placeIdstringrequiredCanonical place id. Get it from a search first. The example is a Yumi Partner venue. · example: 1726507251
  • kindstringrequiredQuestion kind: item (menu/stock) · wait (queue) · seats (immediate seating, include headcount). · example: item
  • topicstringrequiredThe subject as a bare token, not a sentence. e.g. '두바이 쫀득 쿠키', 'yellowtail', 'wait', 'party of 10'. For item, use the venue's actual menu name. · example: 두바이 쫀득 쿠키
  • questionstringoptionalThe guest's original wording (optional), for owner context. · example: 지금 두바이 쫀득 쿠키 있어요?
  • sandboxOutcomestringoptionalSandbox only: the answer to simulate, available, limited, unavailable, soon, not_offered, or no_response (after 5 min). Omit for a default answer by kind. Ignored in live mode.

Response example

json

{
  "success": true,
  "data": {
    "queryId": "c2e4f6a8-0000-0000-0000-000000000000",
    "placeId": "11782345",
    "kind": "item",
    "topic": "두바이 쫀득 쿠키",
    "status": "pending",
    "note": null,
    "settled": false,
    "fresh": false,
    "interestedCount": 1,
    "expiresAt": "2026-09-04T00:05:00.000Z"
  }
}
GET/api/v1/live-status/{queryId}

Live status result (long-poll)

Check a live question's current status. status: pending, available, limited, unavailable, soon, not_offered, no_response (owner didn't answer in 5 min). Pass ?wait=<sec> (max 25) to long-poll — it returns the moment the owner answers or the 5-minute window lapses (settled); if still pending, call again to fill the ~5-minute window, then report the result with the verified time. note may carry the owner's extra memo (e.g. wait '20분', 'we can seat you separately'). verifiedAt = when it was confirmed; validUntil = how long the answer stays reusable for other guests (varies by kind).

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • queryIdstringrequiredThe queryId returned by the create call. · example: c2e4f6a8-0000-0000-0000-000000000000
  • waitintegeroptionalLong-poll seconds (0-25). Omit for a one-shot check. · example: 25

Response example

json

{
  "success": true,
  "data": {
    "queryId": "c2e4f6a8-0000-0000-0000-000000000000",
    "placeId": "11782345",
    "kind": "wait",
    "topic": "웨이팅",
    "status": "limited",
    "note": "20분",
    "settled": true,
    "verifiedAt": "2026-09-04T00:02:30.000Z",
    "verifiedBy": "merchant",
    "validUntil": "2026-09-04T00:12:30.000Z",
    "fresh": true,
    "interestedCount": 3,
    "createdAt": "2026-09-04T00:00:00.000Z",
    "expiresAt": "2026-09-04T00:05:00.000Z"
  }
}
GET/api/v1/live-status

Fresh live answer (optional)

If a still-valid owner-confirmed answer exists for placeId + topic, it's returned without asking (found:true + status, note, verifiedAt, validUntil). Otherwise found:false — then POST to ask fresh. You usually only need POST (it reuses on its own); use this only to peek at 'just-confirmed' info without triggering anything.

Auth required (Bearer / X-API-Key header preferred)

Run in playground →

Parameters

  • placeIdstringrequiredCanonical place id. · example: 11782345
  • topicstringrequiredThe subject token (same as POST's topic). · example: 두바이 쫀득 쿠키

Response example

json

{
  "success": true,
  "data": {
    "found": true,
    "queryId": "c2e4f6a8-0000-0000-0000-000000000000",
    "placeId": "11782345",
    "kind": "item",
    "topic": "두바이 쫀득 쿠키",
    "status": "available",
    "note": null,
    "verifiedAt": "2026-09-04T00:02:30.000Z",
    "verifiedBy": "merchant",
    "validUntil": "2026-09-04T00:32:30.000Z",
    "fresh": true,
    "interestedCount": 4
  }
}