Skip to content

GraphQL tutorial

This document will give you a quick start tutorial on how to get started with OTP's GraphQL APIs. For this tutorial we will be using the GTFS GraphQL API as this is the most commonly used one.

First of all, make sure that you've loaded street and transit data into your instance by following the basic tutorial

Visual GraphQL API client

OTP has a built-in API client to help you build queries and view documentation. After having started OTP, visit http://localhost:8080/graphiql to open it.

It should look like this:

GraphiQL

Sending your first query

For our first query we want to get the list of routes loaded into OTP. Therefore paste the following GraphQL query in the left hand panel of the page:

{
    routes {
        longName
        shortName
        gtfsId
        agency {
            gtfsId
            name
        }
        mode
    }
}

After pressing the "Execute query" button you should see the result of the query on the right hand side panel.

Now would be a good time to explore the auto-complete capabilities of the tool by moving the cursor into the query panel and hitting Ctrl-Space to see what other query parameters are possible.

GraphiQL

The explorer also has documentation built into it. If you hover your pointer over a property on the left hand side you can see its documentation.

GraphiQL

A more advanced query

Most people want to get routing results out of OTP, so lets see the query for this:

{
    plan(
        # these coordinate are in Portland, change this to YOUR origin
        from: { lat: 45.5552, lon: -122.6534 }
        # these coordinate are in Portland, change this to YOUR destination
        to: { lat: 45.4908, lon: -122.5519 }
        # use the correct date and time of your request
        date: "2023-02-15",
        time: "11:37",
        # choose the transport modes you need
        transportModes: [
            {
                mode: WALK
            },
            {
                mode: TRANSIT
            },
        ]) {
        itineraries {
            startTime
            endTime
            legs {
                mode
                startTime
                endTime
                from {
                    name
                    lat
                    lon
                    departureTime
                    arrivalTime
                }
                to {
                    name
                    lat
                    lon
                    departureTime
                    arrivalTime
                }
                route {
                    gtfsId
                    longName
                    shortName
                }
                legGeometry {
                    points
                }
            }
        }
    }
}

Again, please use the autocomplete and documentation viewers to figure out what each input parameter and property means.

More examples for a variety of queries can also be found in the test code.