Bimba.git

ref: 5069bf915e804ee4ed5d7a4f755b3494be0055e5

specs/motis2.yml


   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
openapi: 3.1.0
info:
  title: MOTIS API
  description: This is the MOTIS routing API.
  contact:
    email: felix@triptix.tech
  license:
    name: MIT
    url: https://opensource.org/license/mit
  version: v1
externalDocs:
  description: Find out more about MOTIS
  url: https://github.com/motis-project/motis
  # https://raw.githubusercontent.com/motis-project/motis/refs/heads/master/openapi.yaml
servers:
  - url: https://europe.motis-project.de
paths:
  /api/v1/one-to-many:
    get:
      tags:
        - geocode
      summary: |
        Street routing from one to many places or many to one.
        The order in the response array corresponds to the order of coordinates of the \`many\` parameter in the query.        
      operationId: oneToMany
      parameters:
        - name: one
          in: query
          required: true
          description: geo location as latitude,longitude
          schema:
            type: string
        - name: many
          in: query
          required: true
          description: geo locations as latitude;longitude,latitude;longitude,...
          schema:
            type: array
            items:
              type: string
        - name: mode
          in: query
          required: true
          description: |
                        routing profile to use (currently supported: \`WALK\`, \`BIKE\`, \`CAR\`)
          schema:
            $ref: '#/components/schemas/Mode'
        - name: max
          in: query
          required: true
          description: maximum travel time in seconds
          schema:
            type: number
        - name: maxMatchingDistance
          in: query
          required: true
          description: maximum matching distance in meters to match geo coordinates to the street network
          schema:
            type: number
        - name: arriveBy
          in: query
          required: true
          description: |
            true = many to one
            false = one to many            
          schema:
            type: boolean
      responses:
        200:
          description: |
            A list of distance + duration pairs.
            If no path was found, the object doesn't contain distance and duration.            
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Duration'

  /api/v1/reverse-geocode:
    get:
      tags:
        - geocode
      summary: Translate coordinates to the closest address(es)/places/stops.
      operationId: reverseGeocode
      parameters:
        - name: place
          in: query
          required: true
          description: latitude, longitude in degrees
          schema:
            type: string
      responses:
        200:
          description: A list of guesses to resolve the coordinates to a location
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Match'

  /api/v1/geocode:
    get:
      tags:
        - geocode
      summary: Autocompletion & geocoding that resolves user input addresses including coordinates
      operationId: geocode
      parameters:
        - name: text
          in: query
          required: true
          description: the (potentially partially typed) address to resolve
          schema:
            type: string

        - name: language
          in: query
          required: false
          description: |
            language tags as used in OpenStreetMap
            (usually ISO 639-1, or ISO 639-2 if there's no ISO 639-1)            
          schema:
            type: string

      responses:
        200:
          description: A list of guesses to resolve the text to a location
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Match'

  /api/v1/trip:
    get:
      tags:
        - timetable
      summary: Get a trip as itinerary
      operationId: trip
      parameters:
        - name: tripId
          in: query
          schema:
            type: string
          required: true
          description: trip identifier (e.g. from an itinerary leg or stop event)
      responses:
        200:
          description: the requested trip as itinerary
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Itinerary'

  /api/v1/stoptimes:
    get:
      tags:
        - timetable
      summary: Get the next N departures or arrivals of a stop sorted by time
      operationId: stoptimes
      parameters:
        - name: stopId
          in: query
          schema:
            type: string
          required: true
          description: stop id of the stop to retrieve departures/arrivals for

        - name: time
          in: query
          required: false
          description: |
                        Optional. Defaults to the current time.
          schema:
            type: string
            format: date-time

        - name: arriveBy
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: |
            Optional. Default is `false`.
            
              - `arriveBy=true`: the parameters `date` and `time` refer to the arrival time
              - `arriveBy=false`: the parameters `date` and `time` refer to the departure time            

        - name: n
          in: query
          schema:
            type: integer
          required: true
          description: the number of events

        - name: radius
          in: query
          schema:
            type: integer
          required: false
          description: |
            Optional. Radius in meters.
            
            Default is that only stop times of the parent of the stop itself
            and all stops with the same name (+ their child stops) are returned.
            
            If set, all stops at parent stations and their child stops in the specified radius
            are returned.            

        - name: pageCursor
          in: query
          required: false
          description: |
            Use the cursor to go to the next "page" of stop times.
            Copy the cursor from the last response and keep the original request as is.
            This will enable you to search for stop times in the next or previous time-window.            
          schema:
            type: string

      responses:
        200:
          description: A list of guesses to resolve the text to a location
          content:
            application/json:
              schema:
                type: object
                required:
                  - stopTimes
                  - previousPageCursor
                  - nextPageCursor
                properties:
                  stopTimes:
                    description: list of stop times
                    type: array
                    items:
                      $ref: '#/components/schemas/StopTime'
                  previousPageCursor:
                    description: |
                      Use the cursor to get the previous page of results. Insert the cursor into the request and post it to get the previous page.
                      The previous page is a set of stop times BEFORE the first stop time in the result.                      
                    type: string
                  nextPageCursor:
                    description: |
                      Use the cursor to get the next page of results. Insert the cursor into the request and post it to get the next page.
                      The next page is a set of stop times AFTER the last stop time in this result.                      
                    type: string

  /api/v1/plan:
    get:
      tags:
        - routing
      summary: Computes optimal connections from one place to another.
      operationId: plan
      parameters:
        - name: fromPlace
          in: query
          required: true
          description: \`latitude,longitude,level\` tuple in degrees OR stop id
          schema:
            type: string

        - name: toPlace
          in: query
          required: true
          description: \`latitude,longitude,level\` tuple in degrees OR stop id
          schema:
            type: string

        - name: time
          in: query
          required: false
          description: |
            Optional. Defaults to the current time.
            
            Departure time ($arriveBy=false) / arrival date ($arriveBy=true),            
          schema:
            type: string
            format: date-time

        - name: maxTransfers
          in: query
          required: false
          description: |
            The maximum number of allowed transfers.
            If not provided, the routing uses the server-side default value
            which is hardcoded and very high to cover all use cases.
            
            *Warning*: Use with care. Setting this too low can lead to
            optimal (e.g. the fastest) journeys not being found.
            If this value is too low to reach the destination at all,
            it can lead to slow routing performance.            
          schema:
            type: integer

        - name: maxHours
          in: query
          required: false
          description: |
            The maximum travel time in hours.
            If not provided, the routing to uses the value
            hardcoded in the server which is usually quite high.
            
            *Warning*: Use with care. Setting this too low can lead to
            optimal (e.g. the least transfers) journeys not being found.
            If this value is too low to reach the destination at all,
            it can lead to slow routing performance.            
          schema:
            type: number

        - name: minTransferTime
          in: query
          required: false
          description: Minimum transfer time for each transfer.
          schema:
            type: integer

        - name: transferTimeFactor
          in: query
          required: false
          description: Factor to multiply transfer times with.
          schema:
            type: integer
            default: 1

        - name: wheelchair
          in: query
          description: Whether the trip must be wheelchair accessible.
          required: false
          schema:
            type: boolean
            default: false

        - name: mode
          in: query
          required: false
          description: |
            A comma separated list of allowed modes.
            
            Default if not provided: `WALK,TRANSIT`            
          schema:
            default:
              - WALK
              - TRANSIT
            type: array
            minItems: 1
            items:
              $ref: '#/components/schemas/Mode'
          explode: false

        - name: numItineraries
          in: query
          required: false
          description: |
            The minimum number of itineraries to compute.
            This is only relevant if `timetableView=true`.
            The default value is 5.            
          schema:
            type: integer
            default: 5

        - name: pageCursor
          in: query
          required: false
          description: |
            Use the cursor to go to the next "page" of itineraries.
            Copy the cursor from the last response and keep the original request as is.
            This will enable you to search for itineraries in the next or previous time-window.            
          schema:
            type: string

        - name: timetableView
          in: query
          required: false
          description: |
            Optional. Default is `true`.
            
            Search for the best trip options within a time window.
            If true two itineraries are considered optimal
            if one is better on arrival time (earliest wins)
            and the other is better on departure time (latest wins).
            In combination with arriveBy this parameter cover the following use cases:
            
            `timetable=false` = waiting for the first transit departure/arrival is considered travel time:
              - `arriveBy=true`: event (e.g. a meeting) starts at 10:00 am,
                compute the best journeys that arrive by that time (maximizes departure time)
              - `arriveBy=false`: event (e.g. a meeting) ends at 11:00 am,
                compute the best journeys that depart after that time
            
            `timetable=true` = optimize "later departure" + "earlier arrival" and give all options over a time window:
              - `arriveBy=true`: the time window around `date` and `time` refers to the arrival time window
              - `arriveBy=false`: the time window around `date` and `time` refers to the departure time window            
          schema:
            type: boolean
            default: false

        - name: arriveBy
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: |
            Optional. Default is `false`.
            
              - `arriveBy=true`: the parameters `date` and `time` refer to the arrival time
              - `arriveBy=false`: the parameters `date` and `time` refer to the departure time            

        - name: searchWindow
          in: query
          required: false
          description: |
            Optional. Default is 2 hours which is `7200`.
            
            The length of the search-window in seconds. Default value two hours.
            
              - `arriveBy=true`: number of seconds between the earliest departure time and latest departure time
              - `arriveBy=false`: number of seconds between the earliest arrival time and the latest arrival time            
          schema:
            type: integer
            default: 7200
            minimum: 0

        - name: maxPreTransitTime
          in: query
          required: false
          description: |
            Optional. Default is 15min which is `900`.
            Maximum time in seconds for the first street leg.            
          schema:
            type: integer
            default: 900
            minimum: 0

        - name: maxPostTransitTime
          in: query
          required: false
          description: |
            Optional. Default is 15min which is `900`.
            Maximum time in seconds for the last street leg.            
          schema:
            type: integer
            default: 900
            minimum: 0
      responses:
        '200':
          description: routing result
          content:
            application/json:
              schema:
                type: object
                required:
                  - requestParameters
                  - debugOutput
                  - date
                  - from
                  - to
                  - itineraries
                  - previousPageCursor
                  - nextPageCursor
                properties:
                  requestParameters:
                    description: "the routing query"
                    type: object
                    additionalProperties:
                      type: string
                  debugOutput:
                    description: "debug statistics"
                    type: object
                    additionalProperties:
                      type: string
                  from:
                    $ref: '#/components/schemas/Place'
                  to:
                    $ref: '#/components/schemas/Place'
                  itineraries:
                    description: list of itineraries
                    type: array
                    items:
                      $ref: '#/components/schemas/Itinerary'
                  previousPageCursor:
                    description: |
                      Use the cursor to get the previous page of results. Insert the cursor into the request and post it to get the previous page.
                      The previous page is a set of itineraries departing BEFORE the first itinerary in the result for a depart after search. When using the default sort order the previous set of itineraries is inserted before the current result.                      
                    type: string
                  nextPageCursor:
                    description: |
                      Use the cursor to get the next page of results. Insert the cursor into the request and post it to get the next page.
                      The next page is a set of itineraries departing AFTER the last itinerary in this result.                      
                    type: string

  /api/v1/map/trips:
    get:
      tags:
        - map
      operationId: trips
      summary: |
        Given a area frame (box defined by top right and bottom left corner) and a time frame,
        it returns all trips and their respective shapes that operate in this area + time frame.
        Trips are filtered by zoom level. On low zoom levels, only long distance trains will be shown
        while on high zoom levels, also metros, buses and trams will be returned.        
      parameters:
        - name: zoom
          in: query
          required: true
          description: current zoom level
          schema:
            type: number
        - name: min
          in: query
          required: true
          description: latitude,longitude pair of the lower right coordinate
          schema:
            type: string
        - name: max
          in: query
          required: true
          description: latitude,longitude pair of the upper left coordinate
          schema:
            type: string
        - name: startTime
          in: query
          required: true
          description: start of the time window
          schema:
            type: string
            format: date-time
        - name: endTime
          in: query
          required: true
          description: end if the time window
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: a list of trips
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TripSegment'

  /api/v1/map/initial:
    get:
      tags:
        - map
      operationId: initial
      summary: initial location to view the map at after loading based on where public transport should be visible
      responses:
        '200':
          description: latitude, longitude and zoom level to set the map to
          content:
            application/json:
              schema:
                type: object
                required:
                  - lat
                  - lon
                  - zoom
                properties:
                  lat:
                    description: latitude
                    type: number
                  lon:
                    description: longitude
                    type: number
                  zoom:
                    description: zoom level
                    type: number

  /api/v1/map/stops:
    get:
      tags:
        - map
      summary: Get all stops for a map section
      operationId: stops
      parameters:
        - name: min
          in: query
          required: true
          description: latitude,longitude pair of the lower right coordinate
          schema:
            type: string
        - name: max
          in: query
          required: true
          description: latitude,longitude pair of the upper left coordinate
          schema:
            type: string
      responses:
        '200':
          description: array of stop places in the selected map section
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Place'

  /api/v1/map/levels:
    get:
      tags:
        - map
      summary: Get all available levels for a map section
      operationId: levels
      parameters:
        - name: min
          in: query
          required: true
          description: latitude,longitude pair of the lower right coordinate
          schema:
            type: string
        - name: max
          in: query
          required: true
          description: latitude,longitude pair of the upper left coordinate
          schema:
            type: string
      responses:
        '200':
          description: array of available levels
          content:
            application/json:
              schema:
                type: array
                items:
                  type: number

  /api/debug/footpaths:
    get:
      tags:
        - debug
      summary: Prints all footpaths of a timetable location (track, bus stop, etc.)
      operationId: footpaths
      parameters:
        - name: id
          in: query
          required: true
          description: location id
          schema:
            type: string
      responses:
        '200':
          description: list of outgoing footpaths of this location
          content:
            application/json:
              schema:
                type: object
                required:
                  - place
                  - footpaths
                properties:
                  place:
                    $ref: '#/components/schemas/Place'
                  footpaths:
                    description: all outgoing footpaths of this location
                    type: array
                    items:
                      $ref: '#/components/schemas/Footpath'

components:
  schemas:
    Duration:
      description: Object containing duration if a path was found or none if no path was found
      type: object
      required: [ ]
      properties:
        duration:
          type: number
          description: duration in seconds if a path was found, otherwise missing

    Area:
      description: Administrative area
      type: object
      required:
        - name
        - adminLevel
        - matched
      properties:
        name:
          type: string
          description: Name of the area
        adminLevel:
          type: number
          description: |
            [OpenStreetMap `admin_level`](https://wiki.openstreetmap.org/wiki/Key:admin_level)
            of the area            
        matched:
          type: boolean
          description: Whether this area was matched by the input text
        default:
          type: boolean
          description: Whether this area should be displayed as default area (area with admin level closest 7)

    Token:
      description: Matched token range (from index, length)
      type: array
      minItems: 2
      maxItems: 2
      items:
        type: number

    Match:
      description: GeoCoding match
      type: object
      required:
        - type
        - name
        - id
        - lat
        - lon
        - tokens
        - areas
        - score
      properties:
        type:
          description: location type
          type: string
          enum:
            - ADDRESS
            - PLACE
            - STOP
        tokens:
          description: list of non-overlapping tokens that were matched
          type: array
          items:
            $ref: '#/components/schemas/Token'
        name:
          description: name of the location (transit stop / PoI / address)
          type: string
        id:
          description: unique ID of the location
          type: string
        lat:
          description: latitude
          type: number
        lon:
          description: longitude
          type: number
        level:
          description: |
            level according to OpenStreetMap
            (at the moment only for public transport)            
          type: number
        street:
          description: street name
          type: string
        houseNumber:
          description: house number
          type: string
        zip:
          description: zip code
          type: string
        areas:
          description: list of areas
          type: array
          items:
            $ref: '#/components/schemas/Area'
        score:
          description: score according to the internal scoring system (the scoring algorithm might change in the future)
          type: number

    Mode:
      description: |
        # Street modes
        
          - `WALK`: Walking some or all of the way of the route.
          - `BIKE`: Cycling for the entirety of the route or taking a bicycle onto the public transport (if enabled) and cycling from the arrival station to the destination.
          - `BIKE_RENTAL`: Taking a rented, shared-mobility bike for part or the entirety of the route.
          - `BIKE_TO_PARK`: Leaving the bicycle at the departure station and walking from the arrival station to the destination. This mode needs to be combined with at least one transit mode otherwise it behaves like an ordinary bicycle journey.
          - `CAR`: Driving your own car the entirety of the route. This can be combined with transit, where will return routes with a Kiss & Ride component. This means that the car is not parked in a permanent parking area but rather the passenger is dropped off (for example, at an airport) and the driver continues driving the car away from the drop off location.
          - `CAR_PARK` | `CAR_TO_PARK`: Driving a car to the park-and-ride facilities near a station and taking publictransport. This mode needs to be combined with at least one transit mode otherwise, it behaves like an ordinary car journey.
          - `CAR_HAILING`: Using a car hailing app like Uber or Lyft to get to a train station or all the way to the destination.
          - `CAR_PICKUP`: Walking to a pickup point along the road, driving to a drop-off point along the road, and walking the rest of the way. This can include various taxi-services or kiss & ride.
          - `CAR_RENTAL`: Walk to a car rental point, drive to a car rental drop-off point and walk the rest of the way. This can include car rental at fixed locations or free-floating services.
          - `FLEXIBLE`: Encompasses all types of on-demand and flexible transportation for example GTFS Flex or NeTEx Flexible Stop Places.
          - `SCOOTER_RENTAL`: Walking to a scooter rental point, riding a scooter to a scooter rental drop-off point, and walking the rest of the way. This can include scooter rental at fixed locations or free-floating services.

        # Transit modes

          - `TRANSIT`: translates to `RAIL,SUBWAY,TRAM,BUS,FERRY,AIRPLANE,COACH`
          - `TRAM`: trams
          - `SUBWAY`: subway trains
          - `FERRY`: ferries
          - `AIRPLANE`: airline flights
          - `BUS`: short distance buses (does not include `COACH`)
          - `COACH`: long distance buses (does not include `BUS`)
          - `RAIL`: translates to `HIGHSPEED_RAIL,LONG_DISTANCE_RAIL,NIGHT_RAIL,REGIONAL_RAIL,REGIONAL_FAST_RAIL`
          - `METRO`: metro trains
          - `HIGHSPEED_RAIL`: long distance high speed trains (e.g. TGV)
          - `LONG_DISTANCE`: long distance inter city trains
          - `NIGHT_RAIL`: long distance night trains
          - `REGIONAL_FAST_RAIL`: regional express routes that skip low traffic stops to be faster
          - `REGIONAL_RAIL`: regional train        
      type: string
      enum:
        # === Street ===
        - WALK
        - BIKE
        - CAR
        - BIKE_RENTAL
        - BIKE_TO_PARK
        - CAR_TO_PARK
        - CAR_HAILING
        - CAR_SHARING
        - CAR_PICKUP
        - CAR_RENTAL
        - FLEXIBLE
        - SCOOTER_RENTAL
        # === Transit ===
        - TRANSIT
        - TRAM
        - SUBWAY
        - FERRY
        - AIRPLANE
        - METRO
        - BUS
        - COACH
        - RAIL
        - HIGHSPEED_RAIL
        - LONG_DISTANCE
        - NIGHT_RAIL
        - REGIONAL_FAST_RAIL
        - REGIONAL_RAIL
        - OTHER

    VertexType:
      type: string
      description: |
        - `NORMAL` - latitude / longitude coordinate or address
        - `BIKESHARE` - bike sharing station
        - `BIKEPARK` - bike parking
        - `TRANSIT` - transit stop        
      enum:
        - NORMAL
        - BIKESHARE
        - BIKEPARK
        - TRANSIT

    Place:
      type: object
      required:
        - name
        - lat
        - lon
        - level
      properties:
        name:
          description: name of the transit stop / PoI / address
          type: string
        stopId:
          description: The ID of the stop. This is often something that users don't care about.
          type: string
        lat:
          description: latitude
          type: number
        lon:
          description: longitude
          type: number
        level:
          description: level according to OpenStreetMap
          type: number
        arrivalDelay:
          type: integer
          description: |
            The offset from the scheduled arrival time of the boarding stop in this leg (in milliseconds).
            Scheduled time of arrival at boarding stop = endTime - arrivalDelay            
        departureDelay:
          type: integer
          description: |
            The offset from the scheduled departure time of the boarding stop in this leg (in milliseconds).
            Scheduled time of departure at boarding stop = startTime - departureDelay            
        arrival:
          description: arrival time
          type: string
          format: date-time
        departure:
          description: departure time
          type: string
          format: date-time
        scheduledTrack:
          description: scheduled track from the static schedule timetable dataset
          type: string
        track:
          description: |
            The current track/platform information, updated with real-time updates if available. 
            Can be missing if neither real-time updates nor the schedule timetable contains track information.            
          type: string
        vertexType:
          $ref: '#/components/schemas/VertexType'

    StopTime:
      description: departure or arrival event at a stop
      type: object
      required:
        - place
        - mode
        - realTime
        - route
        - headsign
        - agencyId
        - agencyName
        - agencyUrl
        - tripId
        - routeShortName
        - source
      properties:
        place:
          $ref: '#/components/schemas/Place'
          description: information about the stop place and time
        mode:
          $ref: '#/components/schemas/Mode'
          description: Transport mode for this leg
        realTime:
          description: Whether there is real-time data about this leg
          type: boolean
        route:
          description: |
            For transit legs, the route of the bus or train being used.
            For non-transit legs, the name of the street being traversed.            
          type: string
        headsign:
          description: |
            For transit legs, the headsign of the bus or train being used.
            For non-transit legs, null            
          type: string
        agencyId:
          type: string
        agencyName:
          type: string
        agencyUrl:
          type: string
        routeColor:
          type: string
        routeTextColor:
          type: string
        tripId:
          type: string
        routeShortName:
          type: string
        source:
          description: Filename and line number where this trip is from
          type: string

    TripInfo:
      description: trip id and name
      type: object
      required:
        - tripId
        - routeShortName
      properties:
        tripId:
          description: trip ID (dataset trip id prefixed with the dataset tag)
          type: string
        routeShortName:
          description: trip display name
          type: string

    TripSegment:
      description: trip segment between two stops to show a trip on a map
      type: object
      required:
        - trips
        - mode
        - distance
        - from
        - to
        - departure
        - arrival
        - departureDelay
        - arrivalDelay
        - realTime
        - polyline
      properties:
        trips:
          type: array
          items:
            $ref: '#/components/schemas/TripInfo'
        routeColor:
          type: string
        mode:
          $ref: '#/components/schemas/Mode'
          description: Transport mode for this leg
        distance:
          type: number
          description: distance in meters
        from:
          $ref: '#/components/schemas/Place'
        to:
          $ref: '#/components/schemas/Place'
        departure:
          description: departure time
          type: string
          format: date-time
        arrival:
          description: arrival time
          type: string
          format: date-time
        departureDelay:
          type: integer
          description: |
            The offset from the scheduled departure time of the boarding stop in this leg (in milliseconds).
            Scheduled time of departure at boarding stop = startTime - departureDelay            
        arrivalDelay:
          type: integer
          description: |
            The offset from the scheduled arrival time of the boarding stop in this leg (in milliseconds).
            Scheduled time of arrival at boarding stop = endTime - arrivalDelay            
        realTime:
          description: Whether there is real-time data about this leg
          type: boolean
        polyline:
          description: Google polyline encoded coordinate sequence (with precision 7) where the trip travels on this segment.
          type: string

    RelativeDirection:
      type: string
      enum:
        - DEPART
        - HARD_LEFT
        - LEFT
        - SLIGHTLY_LEFT
        - CONTINUE
        - SLIGHTLY_RIGHT
        - RIGHT
        - HARD_RIGHT
        - CIRCLE_CLOCKWISE
        - CIRCLE_COUNTERCLOCKWISE
        - ELEVATOR
        - UTURN_LEFT
        - UTURN_RIGHT

    AbsoluteDirection:
      type: string
      enum:
        - NORTH
        - NORTHEAST
        - EAST
        - SOUTHEAST
        - SOUTH
        - SOUTHWEST
        - WEST
        - NORTHWEST

    EncodedPolyline:
      type: object
      required:
        - points
        - length
      properties:
        points:
          description: The encoded points of the polyline using the Google polyline encoding with precision 7.
          type: string
        length:
          description: The number of points in the string
          type: integer

    StepInstruction:
      type: object
      required:
        - fromLevel
        - toLevel
        - polyline
        - relativeDirection
        - absoluteDirection
        - distance
        - streetName
        - exit
        - stayOn
        - area
        - lon
        - lat
      properties:
        relativeDirection:
          $ref: '#/components/schemas/RelativeDirection'
        absoluteDirection:
          $ref: '#/components/schemas/AbsoluteDirection'
        distance:
          description: The distance in meters that this step takes.
          type: number
        fromLevel:
          description: level where this segment starts, based on OpenStreetMap data
          type: number
        toLevel:
          description: level where this segment starts, based on OpenStreetMap data
          type: number
        osmWay:
          description: OpenStreetMap way index
          type: integer
        polyline:
          $ref: '#/components/schemas/EncodedPolyline'
        streetName:
          description: The name of the street.
          type: string
        exit:
          description: |
            Not implemented!
            When exiting a highway or traffic circle, the exit name/number.            
          type: string
        stayOn:
          description: |
            Not implemented!
            Indicates whether or not a street changes direction at an intersection.            
          type: boolean
        area:
          description: |
            Not implemented!
            This step is on an open area, such as a plaza or train platform,
            and thus the directions should say something like "cross"            
          type: boolean

    Leg:
      type: object
      required:
        - mode
        - startTime
        - endTime
        - departureDelay
        - arrivalDelay
        - realTime
        - distance
        - duration
        - from
        - to
        - legGeometry
      properties:
        mode:
          $ref: '#/components/schemas/Mode'
          description: Transport mode for this leg
        from:
          $ref: '#/components/schemas/Place'
        to:
          $ref: '#/components/schemas/Place'
        duration:
          description: Leg duration in seconds
          type: integer
        startTime:
          type: string
          format: date-time
          description: leg departure time
        endTime:
          type: string
          format: date-time
          description: leg arrival time
        departureDelay:
          type: integer
          description: |
            The offset from the scheduled departure time of the boarding stop in this leg (in milliseconds).
            Scheduled time of departure at boarding stop = startTime - departureDelay            
        arrivalDelay:
          type: integer
          description: |
            The offset from the scheduled arrival time of the boarding stop in this leg (in milliseconds).
            Scheduled time of arrival at boarding stop = endTime - arrivalDelay            
        realTime:
          description: Whether there is real-time data about this leg
          type: boolean
        distance:
          description: The distance traveled while traversing this leg in meters.
          type: number
        interlineWithPreviousLeg:
          description: For transit legs, if the rider should stay on the vehicle as it changes route names.
          type: boolean
        route:
          description: |
            For transit legs, the route of the bus or train being used.
            For non-transit legs, the name of the street being traversed.            
          type: string
        headsign:
          description: |
            For transit legs, the headsign of the bus or train being used.
            For non-transit legs, null            
          type: string
        agencyName:
          type: string
        agencyUrl:
          type: string
        routeColor:
          type: string
        routeTextColor:
          type: string
        routeType:
          type: string
        routeId:
          type: string
        agencyId:
          type: string
        tripId:
          type: string
        routeShortName:
          type: string
        source:
          description: Filename and line number where this trip is from
          type: string
        intermediateStops:
          description: |
            For transit legs, intermediate stops between the Place where the leg originates
            and the Place where the leg ends. For non-transit legs, null.            
          type: array
          items:
            $ref: "#/components/schemas/Place"
        legGeometry:
          $ref: '#/components/schemas/EncodedPolyline'
        steps:
          description: |
            A series of turn by turn instructions
            used for walking, biking and driving.            
          type: array
          items:
            $ref: '#/components/schemas/StepInstruction'

    Itinerary:
      type: object
      required:
        - duration
        - startTime
        - endTime
        - walkTime
        - transitTime
        - waitingTime
        - walkDistance
        - transfers
        - legs
      properties:
        duration:
          description: journey duration in seconds
          type: integer
        startTime:
          type: string
          format: date-time
          description: journey departure time
        endTime:
          type: string
          format: date-time
          description: journey arrival time
        walkTime:
          type: integer
          description: How much time is spent walking, in seconds.
        transitTime:
          type: integer
          description: How much time is spent on transit, in seconds.
        waitingTime:
          type: integer
          description: How much time is spent waiting for transit to arrive, in seconds.
        walkDistance:
          type: integer
          description: How far the user has to walk, in meters.
        transfers:
          type: integer
          description: The number of transfers this trip has.
        legs:
          description: Journey legs
          type: array
          items:
            $ref: '#/components/schemas/Leg'

    Footpath:
      description: footpath from one location to another
      type: object
      required:
        - to
      properties:
        to:
          $ref: '#/components/schemas/Place'
        default:
          type: number
          description: |
            optional; missing if the GTFS did not contain a footpath
            footpath duration in minutes according to GTFS (+heuristics)            
        foot:
          type: number
          description: |
            optional; missing if no path was found with the foot profile
            footpath duration in minutes for the foot profile            
        wheelchair:
          type: number
          description: |
            optional; missing if no path was found with the wheelchair profile 
            footpath duration in minutes for the wheelchair profile            
        wheelchairUsesElevator:
          type: boolean
          description: |
            optional; missing if no path was found with the wheelchair profile
            true if the wheelchair path uses an elevator