Multimodal Public Transit Directions
This API provides the optimal route from an origin to a destination by combining walking, subway, and bus. It also returns the detailed information a user needs to follow the route, such as route information, stops served, transfer guidance, and alighting door information.
DANGER
You need a REST API key to use this API. To register an app and get a REST API key, see Getting Started.
Request
This section describes the request method and the content to include in each request header. If the request fails, see Troubleshooting for detailed error information.
Request Method
| Method | URL |
|---|---|
GET | https://apis-navi.kakaomobility.com/affiliate/publictransit/v1/multimodal/directions |
Request Headers
| Parameter | Description |
|---|---|
| Authorization | KakaoAK ${REST_API_KEY} {REST_API_KEY}: The REST API key issued from Kakao Developers |
| Content-Type | application/json |
Sample request
curl -X 'GET' \
'https://apis-navi.kakaomobility.com/affiliate/publictransit/v1/multimodal/directions?start=127.111181,37.394717&goal=127.027819,37.498185&date=-1&hhmmss=-1&day_type=Weekday&route_type=All' \
-H 'accept: application/json' \
-H "Authorization: KakaoAK ${REST_API_KEY}" // The REST API key issued from Kakao DevelopersThe request parameters are as follows:
| Name | Type | Description | Required |
|---|---|---|---|
start | String | Origin coordinates (WGS84) Request in the format ${lng},${lat}, in longitude, latitude order (Example: 127.111181,37.394717) | Required |
goal | String | Destination coordinates (WGS84) Request in the format ${lng},${lat}, in longitude, latitude order (Example: 127.027819,37.498185) | Required |
date | Integer | Date YYYYMMDD format (Example: 20250531)(Default: -1. If not specified, the current date is used.) | Optional |
hhmmss | Integer | Departure time An integer formed by concatenating hours, minutes, and seconds (Example: 153000 = 15:30:00)(Default: -1. If not specified, the current time is used.) | Optional |
day_type | String | Day type Use one of the following: • Weekday: Weekday• Saturday: Saturday• Holiday: Public holiday(Default: Weekday) | Optional |
route_type | String | Combination of route types to use Use one of the following: • All: All• Subway: Subway• Bus: Bus(Default: All) | Optional |
Response
On a successful response, the result of the request is delivered as an HTTP status code, and the response body is delivered in JSON format.
Sample response
{
"trans_id": "019fee6c0b52790d8e0622a0633d4616",
"result_code": 0,
"result_message": "성공",
"journeys": [
{
"summary": {
"score": 1144,
"distance": 14371,
"total_time": 1089,
"moving_time": 1089,
"waiting_time": 0,
"walking_time": 278,
"transfer_count": 0,
"moving_stop_count": 4,
"transport_type": [
"Subway"
]
},
"sections": [
{
"departure_stop": {
"stop_name": "출발지",
"x": 123.74176686017732,
"y": 32.522050568904874,
"arrival_time": -1,
"departure_time": 37703,
"boardable": true
},
"arrival_stop": {
"stop_id": "SS0528",
"stop_name": "판교",
"x": 127.11118924971723,
"y": 37.39476903466787,
"arrival_time": 37831,
"departure_time": -1,
"boardable": true
},
"route": {
"route_short_name": "Walk",
"route_full_name": "Walk"
},
"path": [
127.11116740884869,
37.39470579515886,
127.11117177090183,
37.39433638666676,
127.11099108700814,
37.39433502838185,
127.1109930024199,
37.3941728490443,
127.11123025590503,
37.39416562176231,
127.11123025590503,
37.39416562176231
],
"distance": 96,
"time": 128,
"waiting_time": 0,
"first_trip": false,
"last_trip": false,
"walking_transfer_section": false
},
{
"departure_stop": {
"stop_id": "SS0528",
"stop_name": "판교",
"x": 127.11118924971723,
"y": 37.39476903466787,
"arrival_time": 37796,
"departure_time": 37831,
"boardable": true
},
"arrival_stop": {
"stop_id": "SS0524",
"stop_name": "강남",
"x": 127.02818282789538,
"y": 37.49677408896288,
"arrival_time": 38642,
"departure_time": 38677,
"boardable": true
},
"passing_stops": [
{
"stop_id": "SS0527",
"stop_name": "청계산입구",
"x": 127.05466778928293,
"y": 37.44837676589618,
"arrival_time": -1,
"departure_time": -1,
"boardable": true
},
{
"stop_id": "SS0526",
"stop_name": "양재시민의숲",
"x": 127.03846500348334,
"y": 37.47013284411478,
"arrival_time": -1,
"departure_time": -1,
"boardable": true
},
{
"stop_id": "SS0525",
"stop_name": "양재",
"x": 127.03515087026057,
"y": 37.48345952178811,
"arrival_time": -1,
"departure_time": -1,
"boardable": true
}
],
"route": {
"route_id": "SBD01",
"route_short_name": "신분당",
"route_full_name": "수도권 신분당선",
"vehicle_type_name": "GENERAL",
"branch_id": "SHINBUNDANG",
"branch_direction": "UP",
"train_type": "GENERAL",
"last_stop_id_of_trip": "SS0534",
"last_stop_name_of_trip": "신사"
},
"path": [
127.11118924971723,
37.39476903466787,
127.11120142439634,
37.39660732146608,
127.11120496545158,
37.398220273876824,
127.11103871230895,
37.402733411804164,
127.11098768179471,
37.40322861938216,
127.11092407891427,
37.40383186134391,
127.11060891283441,
37.40469452284903,
127.11028532148646,
37.40531382980909,
127.11001095244829,
37.405591097990985,
127.10888512120738,
37.40623139174164,
127.1061466587737,
37.407598374688206,
127.1028964958957,
37.40924074460957,
127.10142265885608,
37.41063522673524,
127.09967767828458,
37.41202762536604,
127.09842730565474,
37.41267588007562,
127.09662050814738,
37.413563160538374,
127.08562091854125,
37.419795109072396,
127.07408283932051,
37.42831952660031,
127.06699203730055,
37.43430092706447,
127.06163736473371,
37.43961988614554,
127.05882128249235,
37.443409003874784,
127.0562495808895,
37.44661431005451,
127.05466778928293,
37.44837676589618,
127.05134246539868,
37.45216162151642,
127.04356349556487,
37.460379687659426,
127.0415233691119,
37.46257976975773,
127.03955555123449,
37.464419978461436,
127.03884495810996,
37.46606314217026,
127.03882015888499,
37.467117181430055,
127.0385263749596,
37.468871859212996,
127.03844539633917,
37.46989840892825,
127.03851759366886,
37.471322671285954,
127.03858333582836,
37.47236843565812,
127.03866384582449,
37.47314400207878,
127.0386566911291,
37.47370260084017,
127.0386562295291,
37.47373863946807,
127.03865137764697,
37.47500008327963,
127.03866683182152,
37.475558865817966,
127.03866648560202,
37.47558589478043,
127.03867408667122,
37.47764037150194,
127.03867166296128,
37.47782957416983,
127.03866889297933,
37.478045805782635,
127.03866843131279,
37.478081844383965,
127.03865608744682,
37.47816283925346,
127.03865493325867,
37.478252935754256,
127.03862955286756,
37.4784689833797,
127.03860521115737,
37.478603944146364,
127.03859298255335,
37.478675929350814,
127.03854510680385,
37.478882783305764,
127.03852122654466,
37.47898170544763,
127.03849723077832,
37.47908963723046,
127.03843804919346,
37.47929639911899,
127.03841451500801,
37.479368292285635,
127.03836756195642,
37.47950306895304,
127.03828576897449,
37.47970964671112,
127.03822739462353,
37.479853340932664,
127.03820409101107,
37.47990721475285,
127.03809980179946,
37.48010459864674,
127.0378098883925,
37.48066990490002,
127.03778681528276,
37.480705759334896,
127.03771748027724,
37.48082233225297,
127.03769440707525,
37.480858186667625,
127.0376367239726,
37.48094782268226,
127.03755608295715,
37.48106430340717,
127.03747555726143,
37.48117177442888,
127.03745259940946,
37.481198619148785,
127.03738361017,
37.481288162921615,
127.03729177838677,
37.48139554169499,
127.03718864072734,
37.48150282826133,
127.03710846088242,
37.48158327008843,
127.03708550277156,
37.48161011473155,
127.03626131424774,
37.482396325936556,
127.03604372713585,
37.48261080481651,
127.03524247596245,
37.48337016406037,
127.03515087026057,
37.48345952178811,
127.03444109256985,
37.48413852717639,
127.03405065677026,
37.48460388566319,
127.03402769663018,
37.48463072967029,
127.03400462046939,
37.48466658330041,
127.03398166029336,
37.48469342729777,
127.03395858409081,
37.48472928091794,
127.03393562387883,
37.48475612490557,
127.03392385373077,
37.484792070966186,
127.03390077746948,
37.484827924573636,
127.0337843515385,
37.48508827917539,
127.03372642836315,
37.4851959323591,
127.03358704066817,
37.48548313066824,
127.03336630256422,
37.485940864137234,
127.03309905904817,
37.48649733285104,
127.03292470197462,
37.48686533924082,
127.03269206826491,
37.4873680267812,
127.03266910677665,
37.48739487049315,
127.03241350789986,
37.487924401094865,
127.03213494332606,
37.48848077464184,
127.03189052728348,
37.489019406155926,
127.03163480084956,
37.48955794438808,
127.03137930335487,
37.490078462741515,
127.03067037267843,
37.491559391331904,
127.02996141345375,
37.4930403149068,
127.02918259777407,
37.494673839137725,
127.02818282789538,
37.49677408896288
],
"alighting": {
"door_direction": "LEFT",
"fast_alighting_door_list": "6-4,3-2"
},
"distance": 14172,
"time": 811,
"waiting_time": 0,
"first_trip": false,
"last_trip": false,
"walking_transfer_section": false
},
{
"departure_stop": {
"stop_id": "SS0524",
"stop_name": "강남",
"x": 127.02818282789538,
"y": 37.49677408896288,
"arrival_time": -1,
"departure_time": 38642,
"boardable": true
},
"arrival_stop": {
"stop_name": "목적지",
"x": 123.74176686017732,
"y": 32.522050568904874,
"arrival_time": 38792,
"departure_time": -1,
"boardable": true
},
"route": {
"route_short_name": "Walk",
"route_full_name": "Walk"
},
"path": [
127.02786116383426,
37.49803291977578,
127.02839065877372,
37.498190455363655,
127.02829797581137,
37.49836089351186,
127.02859081989868,
37.49845340750207,
127.02856773676302,
37.49848925989071,
127.0285564286201,
37.49848916689907
],
"distance": 103,
"time": 150,
"waiting_time": 0,
"first_trip": false,
"last_trip": false,
"walking_transfer_section": false
}
]
},
{
"summary": {
"score": 2007,
"distance": 16836,
"total_time": 1826,
"moving_time": 1826,
"waiting_time": 0,
"walking_time": 905,
"transfer_count": 0,
"moving_stop_count": 8,
"transport_type": [
"Bus"
]
},
"sections": [
{
"departure_stop": {
"stop_name": "출발지",
"x": 123.74176686017732,
"y": 32.522050568904874,
"arrival_time": -1,
"departure_time": 87435,
"boardable": true
},
"arrival_stop": {
"stop_id": "KS323703",
"stop_name": "판교역.낙생육교.현대백화점",
"x": 127.11111015559987,
"y": 37.391903016956675,
"arrival_time": 87798,
"departure_time": -1,
"boardable": true
},
"route": {
"route_short_name": "Walk",
"route_full_name": "Walk"
},
"path": [
127.11116730245614,
37.39471480512179,
127.11117177090183,
37.39433638666676,
127.11117772869953,
37.39383182868806,
127.11119295763818,
37.39349854488041,
127.11114778716608,
37.3934982053496,
127.11114938301404,
37.39336305587693,
127.11114970218237,
37.393336025982016,
127.11107065402831,
37.39333543176507,
127.11107427156098,
37.39302909295372,
127.1110753355308,
37.39293899330021,
127.11107576111735,
37.39290295343844,
127.11107810183006,
37.392704734194545,
127.11107969775742,
37.392569584706166,
127.11106957563376,
37.39247039018952,
127.11107000121592,
37.39243435032492,
127.11107074598286,
37.392371280561306,
127.11107180993157,
37.3922811808978,
127.11107308666381,
37.39217306129972,
127.1110762784645,
37.39190276229568,
127.11109886322137,
37.391902932070764
],
"distance": 326,
"time": 363,
"waiting_time": 0,
"first_trip": false,
"last_trip": false,
"walking_transfer_section": false
},
{
"departure_stop": {
"stop_id": "KS323703",
"stop_name": "판교역.낙생육교.현대백화점",
"x": 127.11111015559987,
"y": 37.391903016956675,
"arrival_time": 87798,
"departure_time": 87798,
"boardable": true
},
"arrival_stop": {
"stop_id": "KS332988",
"stop_name": "신논현역.유화빌딩",
"x": 127.02556344158106,
"y": 37.50166326057349,
"arrival_time": 88719,
"departure_time": 88719,
"boardable": true
},
"passing_stops": [
{
"stop_id": "KS333699",
"stop_name": "판교TG(미정차)",
"x": 127.10315666018009,
"y": 37.395942857821375,
"arrival_time": -1,
"departure_time": -1,
"boardable": false
},
{
"stop_id": "KS318288",
"stop_name": "금토JC(미정차)",
"x": 127.08531433082632,
"y": 37.41527837084757,
"arrival_time": -1,
"departure_time": -1,
"boardable": false
},
{
"stop_id": "KS320642",
"stop_name": "서울진입(미정차)",
"x": 127.06657958333804,
"y": 37.43384713699376,
"arrival_time": -1,
"departure_time": -1,
"boardable": false
},
{
"stop_id": "KS336691",
"stop_name": "청계산입구역(미정차)",
"x": 127.05419327409582,
"y": 37.44836395880759,
"arrival_time": -1,
"departure_time": -1,
"boardable": false
},
{
"stop_id": "KS327155",
"stop_name": "양재IC(미정차)",
"x": 127.04044050949763,
"y": 37.46328282018592,
"arrival_time": -1,
"departure_time": -1,
"boardable": false
},
{
"stop_id": "KS326376",
"stop_name": "서초IC(미정차)",
"x": 127.02632436919144,
"y": 37.4831258037927,
"arrival_time": -1,
"departure_time": -1,
"boardable": false
},
{
"stop_id": "KS319915",
"stop_name": "KCC사옥",
"x": 127.02027526893939,
"y": 37.503025164060396,
"arrival_time": -1,
"departure_time": -1,
"boardable": true
}
],
"route": {
"route_id": "KB304122",
"route_short_name": "1101N",
"route_full_name": "1101N",
"vehicle_type_name": "DIRECT",
"last_stop_id_of_trip": "KS331081",
"last_stop_name_of_trip": "단국대.치과병원"
},
"alternative_routes": [
{
"route_id": "KB304699",
"route_short_name": "1101",
"route_full_name": "1101",
"vehicle_type_name": "DIRECT"
}
/// Content omitted
{
"departure_stop": {
"stop_id": "SS0445",
"stop_name": "신논현",
"x": 127.02548864689048,
"y": 37.50480732294818,
"arrival_time": -1,
"departure_time": 42070,
"boardable": true
},
"arrival_stop": {
"stop_name": "목적지",
"x": 123.74176686017732,
"y": 32.522050568904874,
"arrival_time": 42747,
"departure_time": -1,
"boardable": true
},
"route": {
"route_short_name": "Walk",
"route_full_name": "Walk"
},
"path": [
127.02786116383426,
37.49803291977578,
127.02771474298407,
37.497986661980434,
127.02761343771817,
37.49794978592996,
127.02740393315295,
37.49840759935346,
127.02732232210717,
37.49859614897418,
127.02752505101647,
37.49866089191224,
127.0274669911619,
37.49877755109666,
127.02753460657807,
37.49879612883737,
127.0274301452786,
37.49900251151141,
127.02713972515906,
37.499594816390726,
127.02697673243563,
37.499953895897576,
127.02675544194577,
37.50044765307321,
127.02646442578869,
37.5010850039087,
127.02634841569038,
37.50130931142545,
127.02616279806358,
37.501668203177346,
127.0257555239647,
37.502547878278264,
127.02568568115237,
37.50270048147215,
127.02539511525742,
37.50330179087496
],
"distance": 675,
"time": 677,
"waiting_time": 0,
"first_trip": false,
"last_trip": false,
"walking_transfer_section": false
}
]
}
]
}The response object information is as follows:
| Name | Type | Description | Required |
|---|---|---|---|
trans_id | String | Transaction ID | Required |
result_code | Int | Route search result code | Required |
result_message | String | Result message | Required |
journeys | Object[] | List of routes Not provided when the search fails | Conditional |
summary | Object | Summary information | Required |
score | Int | Route score (the score used to determine the recommended route) | Required |
distance | Int | Total travel distance (unit: m) | Required |
total_time | Int | Total time taken [travel + waiting] (unit: seconds) | Required |
moving_time | Int | Time spent actually traveling [excluding waiting time] (unit: seconds) The sum of the walk from the origin to the first stop (station), travel along the routes, transfer walks, and the walk from the last stop (station) to the destination | Required |
waiting_time | Int | Total waiting time [excluding the wait before the first boarding] (unit: seconds) | Required |
walking_time | Int | Total walking time. The sum of the walking time for the origin, destination, and transfer sections (unit: seconds) | Required |
transfer_count | Int | Number of transfers | Required |
moving_stop_count | Int | Number of stops (stations) traveled through | Required |
transport_type | String[] | List of transportation modes used (Walk, Subway, Bus) | Required |
sections | Object[] | Section information | Required |
departure_stop | Object | Departure stop (station) | Required |
stop_id | String | Stop (station) ID | Required |
stop_name | String | Stop name | Required |
x | Double | Stop coordinate x | Required |
y | Double | Stop coordinate y | Required |
arrival_time | Int | Arrival time An integer counting the seconds elapsed since midnight (seconds from midnight, 00:00:00) (Example: 47460 = 13:11:00, 47,460 ÷ 3600 = 13 hours, with the remaining 660 seconds ÷ 60 = 11 minutes) | Required |
departure_time | Int | Departure time Seconds elapsed since midnight (00:00:00) (Example: 47490 = 47460 + 30, departing after a 30-second stop) | Required |
boardable | Boolean | Whether boarding and alighting are possible (Default: true)• true: The vehicle stops at this stop (station), so boarding and alighting are possible• false: The vehicle passes through, so boarding and alighting are not possible (for example, a station an express train passes without stopping)ex) false for a station that an express train passes without stopping | Required |
arrival_stop | Object | Arrival stop (station) The object structure is the same as departure_stop | Required |
passing_stops | Object[] | List of all intermediate stops (stations) between the departure stop (station) and the arrival stop (station) The object structure is the same as departure_stop | Optional |
route | Object | Route information | Required |
route_id | String | Route ID | Required |
route_short_name | String | Route short name (Example: 1호선 "Line 1", 740) ※ For a walking section, the value Walk is returned | Required |
route_full_name | String | Route name (Example: 수도권 1호선 "Seoul Metropolitan Line 1", 740) ※ For a walking section, the value Walk is returned | Required |
vehicle_type_name | String | Vehicle type Subway: • GENERAL: Regular train• EXPRESS: Express train• LIMITED_EXPRESS: Limited express train• DIRECT: Direct trainBus: • EMPTY: Undefined• BLUE: Trunk• GREEN: Branch• RED: Wide-area• YELLOW: Circular• AIRPORT: Airport• GENERAL: Regular• SEAT: Seat• EXPRESS: Express• MAUL: Village• DIRECT: Direct• OUTER: Outer• INTERCITY: Intercity• RURAL: RuralWalking: • Walk | Required |
branch_id | String | Subway line branch ID. Even on the same line, separate IDs are assigned depending on the terminal station, travel direction, express service, and other factors (Example: METROPOLITAN_01_FROM_INCHEON, Line 1 toward Incheon) ※ Provided for a subway section | Conditional |
branch_direction | String | Subway line branch direction • UP: Up direction• DOWN: Down direction※ Provided for a subway section | Conditional |
train_type | String | Train type Subway: • GENERAL: Regular train• EXPRESS: Express train• LIMITED_EXPRESS: Limited express train• DIRECT: Direct train | Conditional |
last_stop_id_of_trip | String | ID of the trip's terminal station (final destination) | Conditional |
last_stop_name_of_trip | String | Name of the trip's terminal station (final destination) | Conditional |
alternative_routes | Object[] | List of alternative routes. Other routes for which the "boarding stop → passing stop → alighting stop" sequence is identical in every section The object structure is the same as route | Optional |
path | Double[] | Array of coordinates for the section path Vertex list format: [x1, y1, x2, y2, ...] (x and y pairs in sequence) | Optional |
alighting | Object | Alighting information ※ Provided for a subway section | Conditional |
door_direction | String | Alighting door direction • LEFT: Left• RIGHT: Right• BOTH: Both sides• UNKNOWN: Unknown | Required |
fast_alighting_door_list | String | List of fast alighting doors Format: {car number-door number},{car number-door number},... (comma-separated) (Example: 3-2,3-3 — car 3 door 2, car 3 door 3) | Required |
transfer | Object | Transfer information ※ Provided when a next section exists and that section is a subway section | Conditional |
transfer_type | String | Transfer type • NONE: No transfer (for example, the last section)• NORMAL: Regular transfer• CURRENT: In-place transfer• OPPOSITE: Opposite-side transfer• UNKNOWN: No accurate transfer information available※ Provided for a subway section | Required |
fast_transfer_door_list | String | List of fast transfer doors The value depends on the transfer type: • NORMAL: A regular door number (Example: 1-1, 5-4) or all doors• CURRENT, OPPOSITE: All doors• NONE, UNKNOWN: Not provided | Optional |
platform_number | String | Transfer platform number | Optional |
transfer_time | Int | Transfer time (unit: seconds) | Required |
distance | Int | Travel distance (unit: m) ※ The pure route travel distance, excluding transfers | Required |
time | Int | Travel time (unit: seconds) ※ The pure route travel time, excluding transfers | Required |
waiting_time | Int | Waiting time before boarding the route (unit: seconds) Departure time of the current section - arrival time of the previous section | Required |
first_trip | Boolean | Whether this is the first service of the day (Default: false)• true: The vehicle is the first service on the route's service start date• false: Any other regular service vehicle | Required |
last_trip | Boolean | Whether this is the last service of the day (Default: false)• true: The vehicle is the last service on the route's service end date• false: Any other regular service vehicle | Required |
walking_transfer_section | Boolean | Whether this is a walking section for transferring between different transportation modes (Default: false)(A transfer between route types, such as subway ↔ bus. Subway ↔ subway transfers are excluded.) • true: A walking section for a transfer between different modes• false: Any other caseExample: • Section #0 - origin → first stop: false• Section #1 - subway or bus: false• Section #2 - walking transfer: true• Section #3 - subway or bus: false• Section #4 - final alighting point → destination: false | Required |