CINXE.COM
Best Practices - General Transit Feed Specification
<!doctype html> <html lang="en" class="no-js"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="canonical" href="https://gtfs.org/documentation/realtime/realtime-best-practices/"> <link rel="prev" href="../reference/"> <link rel="next" href="../feed-entities/overview/"> <link rel="alternate" href="./" hreflang="en"> <link rel="alternate" href="../../../fr/documentation/realtime/realtime-best-practices/" hreflang="fr"> <link rel="alternate" href="../../../es/documentation/realtime/realtime-best-practices/" hreflang="es"> <link rel="alternate" href="../../../ja/documentation/realtime/realtime-best-practices/" hreflang="ja"> <link rel="alternate" href="../../../de/documentation/realtime/realtime-best-practices/" hreflang="de"> <link rel="alternate" href="../../../pt/documentation/realtime/realtime-best-practices/" hreflang="pt"> <link rel="alternate" href="../../../ru/documentation/realtime/realtime-best-practices/" hreflang="ru"> <link rel="alternate" href="../../../id/documentation/realtime/realtime-best-practices/" hreflang="id"> <link rel="alternate" href="../../../ko/documentation/realtime/realtime-best-practices/" hreflang="ko"> <link rel="alternate" href="../../../zh/documentation/realtime/realtime-best-practices/" hreflang="zh"> <link rel="alternate" href="../../../zh-TW/documentation/realtime/realtime-best-practices/" hreflang="zh-TW"> <link rel="icon" href="../../../assets/favicon.ico"> <meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.46+insiders-4.53.14"> <title>Best Practices - General Transit Feed Specification</title> <link rel="stylesheet" href="../../../assets/stylesheets/main.d0dfab1c.min.css"> <link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Mulish:300,300i,400,400i,700,700i%7CSF+Mono:400,400i,700,700i&display=fallback"> <style>:root{--md-text-font:"Mulish";--md-code-font:"SF Mono"}</style> <link rel="stylesheet" href="../../../assets/stylesheets/extra.css"> <link rel="stylesheet" href="../../../assets/stylesheets/footer.css"> <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> <script id="__analytics">function __md_analytics(){function e(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],e("js",new Date),e("config","G-DRBTC7SSDT"),document.addEventListener("DOMContentLoaded",(function(){document.forms.search&&document.forms.search.query.addEventListener("blur",(function(){this.value&&e("event","search",{search_term:this.value})}));document$.subscribe((function(){var t=document.forms.feedback;if(void 0!==t)for(var a of t.querySelectorAll("[type=submit]"))a.addEventListener("click",(function(a){a.preventDefault();var n=document.location.pathname,d=this.getAttribute("data-md-value");e("event","feedback",{page:n,data:d}),t.firstElementChild.disabled=!0;var r=t.querySelector(".md-feedback__note [data-md-value='"+d+"']");r&&(r.hidden=!1)})),t.hidden=!1})),location$.subscribe((function(t){e("config","G-DRBTC7SSDT",{page_path:t.pathname})}))}));var t=document.createElement("script");t.async=!0,t.src="https://www.googletagmanager.com/gtag/js?id=G-DRBTC7SSDT",document.getElementById("__analytics").insertAdjacentElement("afterEnd",t)}</script> <script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script> </head> <body dir="ltr" data-md-color-scheme="gtfs" data-md-color-primary="custom" data-md-color-accent="custom"> <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> <a href="#gtfs-realtime-best-practices" class="md-skip"> Skip to content </a> </div> <div data-md-component="announce"> </div> <header class="md-header" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="Header"> <a href="../../.." title="General Transit Feed Specification" class="md-header__button md-logo" aria-label="General Transit Feed Specification" data-md-component="logo"> <img id="logo_light_mode" src="../../../assets/logo.png" alt="logo"> <img id="logo_dark_mode" src="../../.." alt="logo"> </a> <label class="md-header__button md-icon" for="__drawer"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class="md-header__title" data-md-component="header-title"> <div class="md-header__ellipsis"> <div class="md-header__topic"> <span class="md-ellipsis"> General Transit Feed Specification </span> </div> <div class="md-header__topic" data-md-component="header-topic"> <span class="md-ellipsis"> Best Practices </span> </div> </div> </div> <form class="md-header__option" data-md-component="palette"> <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="gtfs" data-md-color-primary="custom" data-md-color-accent="custom" aria-hidden="true" type="radio" name="__palette" id="__palette_0"> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <div class="md-header__option"> <div class="md-select"> <button class="md-header__button md-icon" aria-label="Select language"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.5 17.5 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"/></svg> </button> <div class="md-select__inner"> <ul class="md-select__list"> <li class="md-select__item"> <a href="./" hreflang="en" class="md-select__link"> English </a> </li> <li class="md-select__item"> <a href="../../../fr/documentation/realtime/realtime-best-practices/" hreflang="fr" class="md-select__link"> Français </a> </li> <li class="md-select__item"> <a href="../../../es/documentation/realtime/realtime-best-practices/" hreflang="es" class="md-select__link"> Español </a> </li> <li class="md-select__item"> <a href="../../../ja/documentation/realtime/realtime-best-practices/" hreflang="ja" class="md-select__link"> 日本語 </a> </li> <li class="md-select__item"> <a href="../../../de/documentation/realtime/realtime-best-practices/" hreflang="de" class="md-select__link"> Deutsch (wird bald verfügbar sein) </a> </li> <li class="md-select__item"> <a href="../../../pt/documentation/realtime/realtime-best-practices/" hreflang="pt" class="md-select__link"> Português (em breve) </a> </li> <li class="md-select__item"> <a href="../../../ru/documentation/realtime/realtime-best-practices/" hreflang="ru" class="md-select__link"> Русский (будет добавлен позже) </a> </li> <li class="md-select__item"> <a href="../../../id/documentation/realtime/realtime-best-practices/" hreflang="id" class="md-select__link"> Bahasa Indonesia (akan segera hadir) </a> </li> <li class="md-select__item"> <a href="../../../ko/documentation/realtime/realtime-best-practices/" hreflang="ko" class="md-select__link"> 한국어 (곧 제공 예정) </a> </li> <li class="md-select__item"> <a href="../../../zh/documentation/realtime/realtime-best-practices/" hreflang="zh" class="md-select__link"> 中文 - 简体(即将推出) </a> </li> <li class="md-select__item"> <a href="../../../zh-TW/documentation/realtime/realtime-best-practices/" hreflang="zh-TW" class="md-select__link"> 中文 - 繁體(即將推出) </a> </li> </ul> </div> </div> </div> <label class="md-header__button md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class="md-search" data-md-component="search" role="dialog"> <label class="md-search__overlay" for="__search"></label> <div class="md-search__inner" role="search"> <form class="md-search__form" name="search"> <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> <label class="md-search__icon md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class="md-search__options" aria-label="Search"> <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> <div class="md-search__suggest" data-md-component="search-suggest"></div> </form> <div class="md-search__output"> <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> <div class="md-search-result" data-md-component="search-result"> <div class="md-search-result__meta"> Initializing search </div> <ol class="md-search-result__list" role="presentation"></ol> </div> </div> </div> </div> </div> <div class="md-header__source"> <a href="https://github.com/google/transit" title="Go to repository" class="md-source" data-md-component="source" target="_blank" rel="noopener"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class="md-source__repository"> GTFS Repository </div> </a> </div> </nav> </header> <div class="md-container" data-md-component="container"> <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> <div class="md-grid"> <ul class="md-tabs__list"> <li class="md-tabs__item"> <a href="../../.." class="md-tabs__link"> Home </a> </li> <li class="md-tabs__item"> <a href="../../../getting-started/what-is-GTFS/" class="md-tabs__link"> Getting started </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href="../../overview/" class="md-tabs__link"> Technical Documentation </a> </li> <li class="md-tabs__item"> <a href="../../../community/get-involved/" class="md-tabs__link"> Community </a> </li> <li class="md-tabs__item"> <a href="../../../resources/overview/" class="md-tabs__link"> Resources </a> </li> <li class="md-tabs__item"> <a href="../../../about/" class="md-tabs__link"> About </a> </li> <li class="md-tabs__item"> <a href="../../../blog/" class="md-tabs__link"> Blog </a> </li> </ul> </div> </nav> <main class="md-main" data-md-component="main"> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> <label class="md-nav__title" for="__drawer"> <a href="../../.." title="General Transit Feed Specification" class="md-nav__button md-logo" aria-label="General Transit Feed Specification" data-md-component="logo"> <img id="logo_light_mode" src="../../../assets/logo.png" alt="logo"> <img id="logo_dark_mode" src="../../.." alt="logo"> </a> General Transit Feed Specification </label> <div class="md-nav__source"> <a href="https://github.com/google/transit" title="Go to repository" class="md-source" data-md-component="source" target="_blank" rel="noopener"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class="md-source__repository"> GTFS Repository </div> </a> </div> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../.." class="md-nav__link"> <span class="md-ellipsis"> Home </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" > <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> <span class="md-ellipsis"> Getting started </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_2"> <span class="md-nav__icon md-icon"></span> Getting started </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../getting-started/what-is-GTFS/" class="md-nav__link"> <span class="md-ellipsis"> What is GTFS? </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/why-use-GTFS/" class="md-nav__link"> <span class="md-ellipsis"> Why use GTFS? </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3" > <label class="md-nav__link" for="__nav_2_3" id="__nav_2_3_label" tabindex="0"> <span class="md-ellipsis"> How to produce GTFS? </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_2_3"> <span class="md-nav__icon md-icon"></span> How to produce GTFS? </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../getting-started/create/" class="md-nav__link"> <span class="md-ellipsis"> Create </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/validate/" class="md-nav__link"> <span class="md-ellipsis"> Validate </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/publish/" class="md-nav__link"> <span class="md-ellipsis"> Publish </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4" > <label class="md-nav__link" for="__nav_2_4" id="__nav_2_4_label" tabindex="0"> <span class="md-ellipsis"> What can GTFS do? </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_2_4"> <span class="md-nav__icon md-icon"></span> What can GTFS do? </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../getting-started/features/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/features/base/" class="md-nav__link"> <span class="md-ellipsis"> Base </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/features/base-add-ons/" class="md-nav__link"> <span class="md-ellipsis"> Base add-ons </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/features/accessibility/" class="md-nav__link"> <span class="md-ellipsis"> Accessibility </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/features/fares/" class="md-nav__link"> <span class="md-ellipsis"> Fares </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/features/pathways/" class="md-nav__link"> <span class="md-ellipsis"> Pathways </span> </a> </li> <li class="md-nav__item"> <a href="../../../getting-started/features/flexible-services/" class="md-nav__link"> <span class="md-ellipsis"> Flexible services </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="../../../getting-started/example-feed/" class="md-nav__link"> <span class="md-ellipsis"> Example GTFS feed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex=""> <span class="md-ellipsis"> Technical Documentation </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_3"> <span class="md-nav__icon md-icon"></span> Technical Documentation </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" > <label class="md-nav__link" for="__nav_3_2" id="__nav_3_2_label" tabindex="0"> <span class="md-ellipsis"> Schedule </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_2"> <span class="md-nav__icon md-icon"></span> Schedule </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../schedule/reference/" class="md-nav__link"> <span class="md-ellipsis"> Reference </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/schedule-best-practices/" class="md-nav__link"> <span class="md-ellipsis"> Best Practices </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2_3" > <label class="md-nav__link" for="__nav_3_2_3" id="__nav_3_2_3_label" tabindex="0"> <span class="md-ellipsis"> Data examples </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_2_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_2_3"> <span class="md-nav__icon md-icon"></span> Data examples </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../schedule/examples/attributions/" class="md-nav__link"> <span class="md-ellipsis"> Attributions </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/continuous-stops/" class="md-nav__link"> <span class="md-ellipsis"> Continuous stops </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/flex/" class="md-nav__link"> <span class="md-ellipsis"> Demand responsive services </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/fares-v1/" class="md-nav__link"> <span class="md-ellipsis"> Fares v1 </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/fares-v2/" class="md-nav__link"> <span class="md-ellipsis"> Fares v2 </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/feed-info/" class="md-nav__link"> <span class="md-ellipsis"> Feed information </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/frequencies/" class="md-nav__link"> <span class="md-ellipsis"> Frequencies </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/pathways/" class="md-nav__link"> <span class="md-ellipsis"> Pathways </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/routes-stops-trips/" class="md-nav__link"> <span class="md-ellipsis"> Routes, Stops & Trips </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/text-to-speech/" class="md-nav__link"> <span class="md-ellipsis"> Text-to-speech </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/transfers/" class="md-nav__link"> <span class="md-ellipsis"> Transfers </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/examples/translations/" class="md-nav__link"> <span class="md-ellipsis"> Translations </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2_4" > <label class="md-nav__link" for="__nav_3_2_4" id="__nav_3_2_4_label" tabindex="0"> <span class="md-ellipsis"> Change history </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_2_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_2_4"> <span class="md-nav__icon md-icon"></span> Change history </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../schedule/change-history/recent-additions/" class="md-nav__link"> <span class="md-ellipsis"> Recent additions </span> </a> </li> <li class="md-nav__item"> <a href="../../schedule/change-history/revision-history/" class="md-nav__link"> <span class="md-ellipsis"> Full revision history </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" checked> <label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0"> <span class="md-ellipsis"> Realtime </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_3_3"> <span class="md-nav__icon md-icon"></span> Realtime </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../reference/" class="md-nav__link"> <span class="md-ellipsis"> Reference </span> </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> <span class="md-ellipsis"> Best Practices </span> <span class="md-nav__icon md-icon"></span> </label> <a href="./" class="md-nav__link md-nav__link--active"> <span class="md-ellipsis"> Best Practices </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#introduction" class="md-nav__link"> <span class="md-ellipsis"> Introduction </span> </a> <nav class="md-nav" aria-label="Introduction"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#document-structure" class="md-nav__link"> <span class="md-ellipsis"> Document Structure </span> </a> </li> <li class="md-nav__item"> <a href="#feed-publishing-general-practices" class="md-nav__link"> <span class="md-ellipsis"> Feed Publishing & General Practices </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-message" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by Message </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by Message"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#feedheader" class="md-nav__link"> <span class="md-ellipsis"> FeedHeader </span> </a> </li> <li class="md-nav__item"> <a href="#feedentity" class="md-nav__link"> <span class="md-ellipsis"> FeedEntity </span> </a> </li> <li class="md-nav__item"> <a href="#tripupdate" class="md-nav__link"> <span class="md-ellipsis"> TripUpdate </span> </a> </li> <li class="md-nav__item"> <a href="#tripdescriptor" class="md-nav__link"> <span class="md-ellipsis"> TripDescriptor </span> </a> </li> <li class="md-nav__item"> <a href="#vehicledescriptor" class="md-nav__link"> <span class="md-ellipsis"> VehicleDescriptor </span> </a> </li> <li class="md-nav__item"> <a href="#stoptimeupdate" class="md-nav__link"> <span class="md-ellipsis"> StopTimeUpdate </span> </a> </li> <li class="md-nav__item"> <a href="#stoptimeevent" class="md-nav__link"> <span class="md-ellipsis"> StopTimeEvent </span> </a> </li> <li class="md-nav__item"> <a href="#vehicleposition" class="md-nav__link"> <span class="md-ellipsis"> VehiclePosition </span> </a> </li> <li class="md-nav__item"> <a href="#position" class="md-nav__link"> <span class="md-ellipsis"> Position </span> </a> </li> <li class="md-nav__item"> <a href="#alert" class="md-nav__link"> <span class="md-ellipsis"> Alert </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-use-case" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by Use Case </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by Use Case"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#frequency-based-trips" class="md-nav__link"> <span class="md-ellipsis"> Frequency-based trips </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#about-this-document" class="md-nav__link"> <span class="md-ellipsis"> About This Document </span> </a> <nav class="md-nav" aria-label="About This Document"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#objectives" class="md-nav__link"> <span class="md-ellipsis"> Objectives </span> </a> </li> <li class="md-nav__item"> <a href="#how-to-propose-or-amend-published-gtfs-realtime-best-practices" class="md-nav__link"> <span class="md-ellipsis"> How to propose or amend published GTFS Realtime Best Practices </span> </a> </li> <li class="md-nav__item"> <a href="#linking-to-this-document" class="md-nav__link"> <span class="md-ellipsis"> Linking to This Document </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3_3" > <label class="md-nav__link" for="__nav_3_3_3" id="__nav_3_3_3_label" tabindex="0"> <span class="md-ellipsis"> Feed Entities </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_3_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_3_3"> <span class="md-nav__icon md-icon"></span> Feed Entities </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../feed-entities/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../feed-entities/trip-updates/" class="md-nav__link"> <span class="md-ellipsis"> Trip Updates </span> </a> </li> <li class="md-nav__item"> <a href="../feed-entities/service-alerts/" class="md-nav__link"> <span class="md-ellipsis"> Service Alerts </span> </a> </li> <li class="md-nav__item"> <a href="../feed-entities/vehicle-positions/" class="md-nav__link"> <span class="md-ellipsis"> Vehicle Positions </span> </a> </li> <li class="md-nav__item"> <a href="../feed-entities/trip-modifications/" class="md-nav__link"> <span class="md-ellipsis"> Trip Modifications </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="../proto/" class="md-nav__link"> <span class="md-ellipsis"> Protobuf </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3_5" > <label class="md-nav__link" for="__nav_3_3_5" id="__nav_3_3_5_label" tabindex="0"> <span class="md-ellipsis"> Language Bindings </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_3_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_3_5"> <span class="md-nav__icon md-icon"></span> Language Bindings </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../language-bindings/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/dotnet/" class="md-nav__link"> <span class="md-ellipsis"> .NET </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/java/" class="md-nav__link"> <span class="md-ellipsis"> Java </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/nodejs/" class="md-nav__link"> <span class="md-ellipsis"> JavaScript/Node.js </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/python/" class="md-nav__link"> <span class="md-ellipsis"> Python </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/golang/" class="md-nav__link"> <span class="md-ellipsis"> Golang </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/ruby/" class="md-nav__link"> <span class="md-ellipsis"> Ruby </span> </a> </li> <li class="md-nav__item"> <a href="../language-bindings/php/" class="md-nav__link"> <span class="md-ellipsis"> PHP </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3_6" > <label class="md-nav__link" for="__nav_3_3_6" id="__nav_3_3_6_label" tabindex="0"> <span class="md-ellipsis"> Data examples </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_3_6_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_3_6"> <span class="md-nav__icon md-icon"></span> Data examples </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../examples/service-alerts/" class="md-nav__link"> <span class="md-ellipsis"> Service alerts </span> </a> </li> <li class="md-nav__item"> <a href="../examples/trip-updates/" class="md-nav__link"> <span class="md-ellipsis"> Trip updates </span> </a> </li> <li class="md-nav__item"> <a href="../examples/migration-duplicated/" class="md-nav__link"> <span class="md-ellipsis"> Migration duplicated </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3_7" > <label class="md-nav__link" for="__nav_3_3_7" id="__nav_3_3_7_label" tabindex="0"> <span class="md-ellipsis"> Change history </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_3_7_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3_3_7"> <span class="md-nav__icon md-icon"></span> Change history </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../change-history/recent-additions/" class="md-nav__link"> <span class="md-ellipsis"> Recent Additions </span> </a> </li> <li class="md-nav__item"> <a href="../change-history/revision-history/" class="md-nav__link"> <span class="md-ellipsis"> Full revision history </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" > <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0"> <span class="md-ellipsis"> Community </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4"> <span class="md-nav__icon md-icon"></span> Community </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../community/get-involved/" class="md-nav__link"> <span class="md-ellipsis"> Get involved </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" > <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0"> <span class="md-ellipsis"> Governance </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_2"> <span class="md-nav__icon md-icon"></span> Governance </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../community/governance/gtfs-schedule-amendment-process/" class="md-nav__link"> <span class="md-ellipsis"> GTFS Schedule Amendment Process </span> </a> </li> <li class="md-nav__item"> <a href="../../../community/governance/gtfs-realtime-amendment-process/" class="md-nav__link"> <span class="md-ellipsis"> GTFS Realtime Amendment Process </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" > <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0"> <span class="md-ellipsis"> Extensions </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_3"> <span class="md-nav__icon md-icon"></span> Extensions </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../community/extensions/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../../community/extensions/fares-v2/" class="md-nav__link"> <span class="md-ellipsis"> Fares v2 </span> </a> </li> <li class="md-nav__item"> <a href="../../../community/extensions/flex/" class="md-nav__link"> <span class="md-ellipsis"> Flex </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0"> <span class="md-ellipsis"> Resources </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5"> <span class="md-nav__icon md-icon"></span> Resources </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../resources/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/getting-started/" class="md-nav__link"> <span class="md-ellipsis"> Getting Started </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/community/" class="md-nav__link"> <span class="md-ellipsis"> Community </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/data/" class="md-nav__link"> <span class="md-ellipsis"> Data </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/software-for-creating-apis/" class="md-nav__link"> <span class="md-ellipsis"> Software for Creating APIs </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/agency-tools/" class="md-nav__link"> <span class="md-ellipsis"> Agency Tools </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/hardware/" class="md-nav__link"> <span class="md-ellipsis"> Hardware </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/apps/" class="md-nav__link"> <span class="md-ellipsis"> Apps </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/sdk/" class="md-nav__link"> <span class="md-ellipsis"> SDKs </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/visualizations/" class="md-nav__link"> <span class="md-ellipsis"> Visualizations </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/gtfs/" class="md-nav__link"> <span class="md-ellipsis"> GTFS </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/gtfs-realtime/" class="md-nav__link"> <span class="md-ellipsis"> GTFS Realtime </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/siri/" class="md-nav__link"> <span class="md-ellipsis"> SIRI </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/multimodal/" class="md-nav__link"> <span class="md-ellipsis"> Multimodal </span> </a> </li> <li class="md-nav__item"> <a href="../../../resources/other/" class="md-nav__link"> <span class="md-ellipsis"> Other </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > <div class="md-nav__link md-nav__container"> <a href="../../../about/" class="md-nav__link "> <span class="md-ellipsis"> About </span> </a> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_6"> <span class="md-nav__icon md-icon"></span> About </label> <ul class="md-nav__list" data-md-scrollfix> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" > <div class="md-nav__link md-nav__container"> <a href="../../../blog/" class="md-nav__link "> <span class="md-ellipsis"> Blog </span> </a> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_7"> <span class="md-nav__icon md-icon"></span> Blog </label> <ul class="md-nav__list" data-md-scrollfix> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#introduction" class="md-nav__link"> <span class="md-ellipsis"> Introduction </span> </a> <nav class="md-nav" aria-label="Introduction"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#document-structure" class="md-nav__link"> <span class="md-ellipsis"> Document Structure </span> </a> </li> <li class="md-nav__item"> <a href="#feed-publishing-general-practices" class="md-nav__link"> <span class="md-ellipsis"> Feed Publishing & General Practices </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-message" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by Message </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by Message"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#feedheader" class="md-nav__link"> <span class="md-ellipsis"> FeedHeader </span> </a> </li> <li class="md-nav__item"> <a href="#feedentity" class="md-nav__link"> <span class="md-ellipsis"> FeedEntity </span> </a> </li> <li class="md-nav__item"> <a href="#tripupdate" class="md-nav__link"> <span class="md-ellipsis"> TripUpdate </span> </a> </li> <li class="md-nav__item"> <a href="#tripdescriptor" class="md-nav__link"> <span class="md-ellipsis"> TripDescriptor </span> </a> </li> <li class="md-nav__item"> <a href="#vehicledescriptor" class="md-nav__link"> <span class="md-ellipsis"> VehicleDescriptor </span> </a> </li> <li class="md-nav__item"> <a href="#stoptimeupdate" class="md-nav__link"> <span class="md-ellipsis"> StopTimeUpdate </span> </a> </li> <li class="md-nav__item"> <a href="#stoptimeevent" class="md-nav__link"> <span class="md-ellipsis"> StopTimeEvent </span> </a> </li> <li class="md-nav__item"> <a href="#vehicleposition" class="md-nav__link"> <span class="md-ellipsis"> VehiclePosition </span> </a> </li> <li class="md-nav__item"> <a href="#position" class="md-nav__link"> <span class="md-ellipsis"> Position </span> </a> </li> <li class="md-nav__item"> <a href="#alert" class="md-nav__link"> <span class="md-ellipsis"> Alert </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-use-case" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by Use Case </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by Use Case"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#frequency-based-trips" class="md-nav__link"> <span class="md-ellipsis"> Frequency-based trips </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#about-this-document" class="md-nav__link"> <span class="md-ellipsis"> About This Document </span> </a> <nav class="md-nav" aria-label="About This Document"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#objectives" class="md-nav__link"> <span class="md-ellipsis"> Objectives </span> </a> </li> <li class="md-nav__item"> <a href="#how-to-propose-or-amend-published-gtfs-realtime-best-practices" class="md-nav__link"> <span class="md-ellipsis"> How to propose or amend published GTFS Realtime Best Practices </span> </a> </li> <li class="md-nav__item"> <a href="#linking-to-this-document" class="md-nav__link"> <span class="md-ellipsis"> Linking to This Document </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-content" data-md-component="content"> <article class="md-content__inner md-typeset"> <h1 id="gtfs-realtime-best-practices">GTFS Realtime Best Practices<a class="headerlink" href="#gtfs-realtime-best-practices" title="Permanent link">¶</a></h1> <h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">¶</a></h2> <p>These are recommended practices for describing realtime public transportation information in the <a href="../reference">GTFS Realtime</a> data format.</p> <h3 id="document-structure">Document Structure<a class="headerlink" href="#document-structure" title="Permanent link">¶</a></h3> <p>Recommended practices are organized into two primary sections</p> <ul> <li><strong><a href="#practice-recommendations-organized-by-message">Practice Recommendations Organized by Message</a>:</strong> Recommendations are organized by message and field in the same order described in the official GTFS Realtime reference.</li> <li><strong><a href="#practice-recommendations-organized-by-use-case">Practice Recommendations Organized by Case</a>:</strong> With particular cases, such as frequency-based service (vs. schedule-based service), practices may need to be applied across several messages and fields as well as the corresponding GTFS schedule data. Such recommendations are consolidated in this section.</li> </ul> <h3 id="feed-publishing-general-practices">Feed Publishing & General Practices<a class="headerlink" href="#feed-publishing-general-practices" title="Permanent link">¶</a></h3> <ul> <li>Feeds should be published at a public, permanent URL</li> <li>The URL should be directly accessible without requiring a login to access the feed. If desired, API keys may be used but registration for API keys should be automated and available to all.</li> <li>Maintain persistent identifiers (id fields) within a GTFS Realtime feed (e.g., FeedEntity.id, VehicleDescriptor.id, CarriageDetails.id) across feed iterations.</li> <li>GTFS Realtime feeds should be refreshed at least once every 30 seconds, or whenever the information represented within the feed (position of a vehicle) changes, whichever is more frequent. VehiclePositions tend to change more frequently than other feed entities and should be updated as frequently as possible. If the content has not changed, the feed should be updated with a new <code>FeedHeader.timestamp</code> reflecting that the information is still relevant as of that timestamp.</li> <li>Data within a GTFS Realtime feed should not be older than 90 seconds for Trip Updates and Vehicle Positions and not older than 10 minutes for Service Alerts. For example, even if a producer is continuously refreshing the <code>FeedHeader.timestamp</code> timestamp every 30 seconds, the age of VehiclePositions within that feed should not be older than 90 seconds.</li> <li>The server hosting GTFS Realtime data should be reliable and consistently return validly-formatted protobuf-encoded responses. Fewer than 1% of responses should be invalid (protobuf errors or fetching errors).</li> <li>The web-server hosting GTFS Realtime data should be configured to correctly report the file modification date (see HTTP/1.1 - Request for Comments 2616, under Section 14.29) so consumers can leverage the <code>If-Modified-Since</code> HTTP header. This saves producers and consumers bandwidth by avoiding transferring feed contents that haven't changed.</li> <li>Feeds should provide protocol buffer-encoded feed content by default when queried via an HTTP request at the given URL - consumers should not need to define special HTTP accept headers to receive protocol-buffer encoded content.</li> <li>Due to how protocol buffers encode <a href="https://developers.google.com/protocol-buffers/docs/proto#optional" target="_blank" rel="noopener">optional values</a>, before reading data from a GTFS Realtime feed consumers should check for the presence of values using the protocol buffer-generated <code>hasX()</code> methods before using that value and should only use the value if <code>hasX()</code> is true (where <code>X</code> is the name of the field). If <code>hasX()</code> returns <code>false</code>, the default value for that field defined in the <code>gtfs-realtime.proto</code> value should be assumed. If the consumer uses the value without checking the <code>hasX()</code> method first, it may be reading default data that wasn't intentionally published by the producer.</li> <li>Feeds should use HTTPS instead of HTTP (without encryption) to ensure feed integrity.</li> <li>Feeds should cover the vast majority of trips included in the companion static GTFS dataset. In particular, it should include data for high-density and high-traffic city areas and busy routes.</li> </ul> <h2 id="practice-recommendations-organized-by-message">Practice Recommendations Organized by Message<a class="headerlink" href="#practice-recommendations-organized-by-message" title="Permanent link">¶</a></h2> <h3 id="feedheader">FeedHeader<a class="headerlink" href="#feedheader" title="Permanent link">¶</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>gtfs_realtime_version</code></td> <td>Current version is "2.0". All GTFS Realtime feeds should be "2.0" or higher, as early version of GTFS Realtime did not require all fields needed to represent various transit situations adequately.</td> </tr> <tr> <td><code>timestamp</code></td> <td>This timestamp should not decrease between two sequential feed iterations.</td> </tr> <tr> <td></td> <td>This timestamp value should always change if the feed contents change - the feed contents should not change without updating the header <code>timestamp</code>.<br><br><em>Common mistakes</em> - If there are multiple instances of GTFS Realtime feed behind a load balancer, each instance may be pulling information from the realtime data source and publishing it to consumers slightly out of sync. If a GTFS Realtime consumer makes two back-to-back requests, and each request is served by a different GTFS Realtime feed instance, the same feed contents could potentially be returned to the consumer with different timestamps.<br><br><em>Possible solution</em> - Producers should provide a <code>Last-Modified</code> HTTP header, and consumers should pass their most recent <code>If-Modified-Since</code> HTTP header to avoid receiving stale data.<br><br><em>Possible solution</em> - If HTTP headers cannot be used, options such as sticky sessions can be used to ensure that each consumer is routed to the same producer server.</td> </tr> </tbody> </table> <h3 id="feedentity">FeedEntity<a class="headerlink" href="#feedentity" title="Permanent link">¶</a></h3> <p>All entities should only be removed from a GTFS Realtime feed when they are no longer relevant to users. Feeds are considered to be stateless, meaning that each feed reflects the entire real-time state of the transit system. If an entity is provided in one feed instance but dropped in a subsequent feed update, it should be assumed that there is no real-time information for that entity.</p> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>id</code></td> <td>Should be kept stable over the entire trip duration</td> </tr> </tbody> </table> <h3 id="tripupdate">TripUpdate<a class="headerlink" href="#tripupdate" title="Permanent link">¶</a></h3> <p>General guidelines for trip cancellations:</p> <ul> <li>When canceling trips over a number of days, producers should provide TripUpdates referencing the given <code>trip_ids</code> and <code>start_dates</code> as <code>CANCELED</code> as well as an Alert with <code>NO_SERVICE</code> referencing the same <code>trip_ids</code> and <code>TimeRange</code> that can be shown to riders explaining the cancellation (e.g., detour).</li> <li>If no stops in a trip will be visited, the trip should be <code>CANCELED</code> instead of having all <code>stop_time_updates</code> being marked as <code>SKIPPED</code>. </li> </ul> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>trip</code></td> <td>Refer to <a href="#tripdescriptor">message TripDescriptor</a>.</td> </tr> <tr> <td></td> <td>If separate <code>VehiclePosition</code> and <code>TripUpdate</code> feeds are provided, <a href="#tripdescriptor">TripDescriptor</a> and <a href="#vehicledescriptor">VehicleDescriptor</a> ID values pairing should match between the two feeds.<br><br>For example, a <code>VehiclePosition</code> entity has <code>vehicle_id:A</code> and <code>trip_id:4</code>, then the corresponding <code>TripUpdate</code> entity should also have <code>vehicle_id:A</code> and <code>trip_id:4</code>. If any <code>TripUpdate</code> entity has <code>trip_id:4</code> and any <code>vehicle_id</code> other than 4, this is an error.</td> </tr> <tr> <td><code>vehicle</code></td> <td>Refer to <a href="#vehicledescriptor">message VehicleDescriptor</a>.</td> </tr> <tr> <td></td> <td>If separate <code>VehiclePosition</code> and <code>TripUpdate</code> feeds are provided, <a href="#tripdescriptor">TripDescriptor</a> and <a href="#vehicledescriptor">VehicleDescriptor</a> ID values pairing should match between the two feeds.<br><br>For example, a <code>VehiclePosition</code> entity has <code>vehicle_id:A</code> and <code>trip_id:4</code>, then the corresponding <code>TripUpdate</code> entity should also have <code>vehicle_id:A</code> and <code>trip_id:4</code>. If any <code>TripUpdate</code> entity has <code>trip_id:4</code> and any <code>vehicle_id</code> other than 4, this is an error.</td> </tr> <tr> <td><code>stop_time_update</code></td> <td><code>stop_time_updates</code> for a given <code>trip_id</code> should be strictly ordered by increasing <code>stop_sequence</code> and no <code>stop_sequence</code> should be repeated.</td> </tr> <tr> <td></td> <td>While the trip is in progress, all <code>TripUpdates</code> should include at least one <code>stop_time_update</code> with a predicted arrival or departure time in the future. Note that the <a href="../feed-entities/trip-updates/#stoptimeupdate">GTFS Realtime spec</a> says that producers should not drop a past <code>StopTimeUpdate</code> if it refers to a stop with a scheduled arrival time in the future for the given trip (i.e. the vehicle has passed the stop ahead of schedule), as otherwise it will be concluded that there is no update for this stop.</td> </tr> <tr> <td><code>timestamp</code></td> <td>Should reflect the time this prediction for this trip was updated.</td> </tr> <tr> <td><code>delay</code></td> <td><code>TripUpdate.delay</code> should represent schedule deviation, i.e., the observed past value for how ahead/behind schedule the vehicle is. Predictions for future stops should be provided through <code>StopTimeEvent.delay</code> or <code>StopTimeEvent.time</code>.</td> </tr> </tbody> </table> <h3 id="tripdescriptor">TripDescriptor<a class="headerlink" href="#tripdescriptor" title="Permanent link">¶</a></h3> <p>If separate <code>VehiclePosition</code> and <code>TripUpdate</code> feeds are provided, <a href="#tripdescriptor">TripDescriptor</a> and <a href="#vehicledescriptor">VehicleDescriptor</a> ID values pairing should match between the two feeds.</p> <p>For example, a <code>VehiclePosition</code> entity has <code>vehicle_id:A</code> and <code>trip_id:4</code>, then the corresponding <code>TripUpdate</code> entity should also have <code>vehicle_id:A</code> and <code>trip_id:4</code>.</p> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>schedule_relationship</code></td> <td>The behavior of <code>ADDED</code> trips are unspecified and the use of this enumeration is not recommended.</td> </tr> </tbody> </table> <h3 id="vehicledescriptor">VehicleDescriptor<a class="headerlink" href="#vehicledescriptor" title="Permanent link">¶</a></h3> <p>If separate <code>VehiclePosition</code> and <code>TripUpdate</code> feeds are provided, <a href="#tripdescriptor">TripDescriptor</a> and <a href="#vehicledescriptor">VehicleDescriptor</a> ID values pairing should match between the two feeds.</p> <p>For example, a <code>VehiclePosition</code> entity has <code>vehicle_id:A</code> and <code>trip_id:4</code>, then the corresponding <code>TripUpdate</code> entity should also have <code>vehicle_id:A</code> and <code>trip_id:4</code>.</p> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>id</code></td> <td>Should uniquely and stably identify a vehicle over the entire trip duration</td> </tr> </tbody> </table> <h3 id="stoptimeupdate">StopTimeUpdate<a class="headerlink" href="#stoptimeupdate" title="Permanent link">¶</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>stop_sequence</code></td> <td>Provide <code>stop_sequence</code> whenever possible, as it unambiguously resolves to a GTFS stop time in <code>stop_times.txt</code> unlike <code>stop_id</code>, which can occur more than once in a trip (e.g., loop route).</td> </tr> <tr> <td><code>arrival</code></td> <td>Arrival times between sequential stops should increase - they should not be the same or decrease.</td> </tr> <tr> <td></td> <td>Arrival <code>time</code> (specified in <a href="#stoptimeevent">StopTimeEvent</a>) should be before the departure <code>time</code> for the same stop if a layover or dwell time is expected - otherwise, arrival <code>time</code> should be be the same as departure <code>time</code>.</td> </tr> <tr> <td><code>departure</code></td> <td>Departure times between sequential stops should increase - they should not be the same or decrease.</td> </tr> <tr> <td></td> <td>Departure <code>time</code> (specified in <a href="#stoptimeevent">StopTimeEvent</a>) should be the same as the arrival <code>time</code> for the same stop if no layover or dwell time is expected - otherwise, departure <code>time</code> should be after arrival <code>time</code> .</td> </tr> </tbody> </table> <h3 id="stoptimeevent">StopTimeEvent<a class="headerlink" href="#stoptimeevent" title="Permanent link">¶</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>delay</code></td> <td>If only <code>delay</code> is provided in a <code>stop_time_update</code> <code>arrival</code> or <code>departure</code> (and not <code>time</code>), then the GTFS <a href="../../schedule/reference/#stop_timestxt"><code>stop_times.txt</code></a> should contain <code>arrival_times</code> and/or <code>departure_times</code> for these corresponding stops. A <code>delay</code> value in the realtime feed is meaningless unless you have a clock time to add it to in the GTFS <code>stop_times.txt</code> file.</td> </tr> </tbody> </table> <h3 id="vehicleposition">VehiclePosition<a class="headerlink" href="#vehicleposition" title="Permanent link">¶</a></h3> <p>Following are the recommended fields that should be included for a VehiclePostions feed to provide consumers with high-quality data (e.g., for generating predictions)</p> <table> <thead> <tr> <th>Field name</th> <th>Notes</th> </tr> </thead> <tbody> <tr> <td><code>entity.id</code></td> <td>Should be kept stable over the entire trip duration</td> </tr> <tr> <td><code>vehicle.timestamp</code></td> <td>Providing the timestamp at which vehicle position was measured is strongly recommended. Otherwise, consumers must use the message timestamp, which can have misleading results for riders when the last message was updated more frequently than the individual position.</td> </tr> <tr> <td><code>vehicle.vehicle.id</code></td> <td>Should uniquely and stably identify a vehicle over the entire trip duration</td> </tr> </tbody> </table> <h3 id="position">Position<a class="headerlink" href="#position" title="Permanent link">¶</a></h3> <p>The vehicle position should be within 200 meters of the GTFS <code>shapes.txt</code> data for the current trip unless there is an alert with the effect of <code>DETOUR</code> for this <code>trip_id</code>.</p> <h3 id="alert">Alert<a class="headerlink" href="#alert" title="Permanent link">¶</a></h3> <p>General guidelines for alerts:</p> <ul> <li>When <code>trip_id</code> and <code>start_time</code> are within <code>exact_time=1</code> interval, <code>start_time</code> should be later than the beginning of the interval by an exact multiple of <code>headway_secs</code>. </li> <li>When canceling trips over a number of days, producers should provide TripUpdates referencing the given <code>trip_ids</code> and <code>start_dates</code> as <code>CANCELED</code> as well as an Alert with <code>NO_SERVICE</code> referencing the same <code>trip_ids</code> and <code>TimeRange</code> that can be shown to riders explaining the cancellation (e.g., detour).</li> <li>If an alert affects all stops on a line, use a line-based alert instead of a stop-based alert. Do not apply the alert to every stop of the line.</li> <li>While there is no character limit for service alerts, transit riders will often be viewing alerts on mobile devices. Please be concise.</li> </ul> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>description_text</code></td> <td>Use line breaks to make your service alert easier to read.</td> </tr> </tbody> </table> <h2 id="practice-recommendations-organized-by-use-case">Practice Recommendations Organized by Use Case<a class="headerlink" href="#practice-recommendations-organized-by-use-case" title="Permanent link">¶</a></h2> <h3 id="frequency-based-trips">Frequency-based trips<a class="headerlink" href="#frequency-based-trips" title="Permanent link">¶</a></h3> <p>A frequency-based trip does not follow a fixed schedule but attempts to maintain predetermined headways. These trips are denoted in <a href="../../schedule/reference/#frequenciestxt">GTFS frequency.txt</a> by setting <code>exact_times=0</code> or omitting the <code>exact_times</code> field (note that <code>exact_times=1</code> trips are <em>NOT</em> frequency-based trips - <code>frequencies.txt</code> with <code>exact_times=1</code> is simply used as a convenience method for storing schedule-based trips in a more compact manner). There are several best practices to keep in mind when constructing GTFS Realtime feeds for frequency-based trips.</p> <ul> <li> <p>In <a href="#stoptimeupdate">TripUpdate.StopTimeUpdate</a>, the <a href="#stoptimeevent">StopTimeEvent</a> for <code>arrival</code> and <code>departure</code> should not contain <code>delay</code> because frequency-based trips do not follow a fixed schedule. Instead, <code>time</code> should be provided to indicate arrival/departure predictions.</p> </li> <li> <p>As required by the spec, when describing <code>trip</code> in <a href="#tripupdate">TripUpdate</a> or <a href="#vehicleposition">VehiclePosition</a> by using <a href="#tripdescriptor">TripDescriptor</a>, all of <code>trip_id</code>, <code>start_time</code>, and <code>start_date</code> must be provided. Additionally, <code>schedule_relationship</code> should be <code>UNSCHEDULED</code>. (e.g., re-enforcement trips).</p> </li> </ul> <h2 id="about-this-document">About This Document<a class="headerlink" href="#about-this-document" title="Permanent link">¶</a></h2> <h3 id="objectives">Objectives<a class="headerlink" href="#objectives" title="Permanent link">¶</a></h3> <p>The objectives of maintaining GTFS Realtime Best Practices are to:</p> <ul> <li>Improve end-user customer experience in public transportation apps</li> <li>Make it easier for software developers to deploy and scale applications, products, and services</li> </ul> <h3 id="how-to-propose-or-amend-published-gtfs-realtime-best-practices">How to propose or amend published GTFS Realtime Best Practices<a class="headerlink" href="#how-to-propose-or-amend-published-gtfs-realtime-best-practices" title="Permanent link">¶</a></h3> <p>GTFS applications and practices evolve, and so this document may need to be amended from time to time. To propose an amendment to this document, open a pull request <a href="https://github.com/MobilityData/GTFS_Realtime_Best-Practices" target="_blank" rel="noopener">in the GTFS Realtime Best Practices GitHub repository</a> and advocate for the change.</p> <h3 id="linking-to-this-document">Linking to This Document<a class="headerlink" href="#linking-to-this-document" title="Permanent link">¶</a></h3> <p>Please link here in order to provide feed producers with guidance for correct formation of GTFS Realtime data. Each individual recommendation has an anchor link. Click the recommendation to get the URL for the in-page anchor link.</p> <p>If a GTFS Realtime-consuming application makes requirements or recommendations for GTFS Realtime data practices that are not described here, it is recommended to publish a document with those requirements or recommendations to supplement these common best practices.</p> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-footer-copyright"> <c>Maintained by </c> <a class="footer-link" href="https://mobilitydata.org/" target="_blank" rel="noopener"> <svg class="only-light" width="26%" height="26%" style="vertical-align:middle" style="float:left" version="1.1" id="Calque_1" x="0px" y="0px" viewBox="0 0 850.40002 205.24001" xml:space="preserve" sodipodi:docname="md-white.svg" inkscape:version="1.1.1 (c3084ef, 2021-09-22)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"><defs id="defs39" /><sodipodi:namedview id="namedview37" pagecolor="#505050" bordercolor="#ffffff" borderopacity="1" inkscape:pageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="1" showgrid="false" inkscape:zoom="0.44880624" inkscape:cx="355.38721" inkscape:cy="387.69514" inkscape:window-width="1277" inkscape:window-height="847" inkscape:window-x="0" inkscape:window-y="25" inkscape:window-maximized="0" inkscape:current-layer="Calque_1" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" /> <style type="text/css" id="style2"> .st0{fill:#19132D;} </style> <g id="g32" style="fill:#ffffff" transform="translate(-31.33,-15.87)"> <path class="st0" d="m 322.73,81.87 h -12.08 c -0.37,0 -0.7,0.19 -0.89,0.51 L 287.48,115.86 265.1,82.37 c -0.19,-0.31 -0.52,-0.51 -0.89,-0.51 h -12.08 c -0.55,0 -1,0.45 -1,1 v 72.39 c 0,0.55 0.45,1 1,1 h 13.42 c 0.55,0 1,-0.45 1,-1 v -43.7 c 0,-0.14 0.18,-0.19 0.25,-0.07 l 19.81,28.8 c 0.19,0.3 0.52,0.46 0.87,0.47 0.35,0 0.67,-0.18 0.87,-0.48 l 19.59,-29.19 c 0.07,-0.12 0.25,-0.07 0.25,0.07 l 0.22,44.05 c 0,0.58 0.47,1.05 1.04,1.05 h 13.28 c 0.55,0 1,-0.45 1,-1 V 82.86 c 0,-0.55 -0.45,-0.99 -1,-0.99 z" id="path4" style="fill:#ffffff" /> <path class="st0" d="m 360.01,101.15 c -16.28,0 -29.03,12.42 -29.03,28.28 0,15.86 12.75,28.28 29.03,28.28 16.34,0 29.14,-12.42 29.14,-28.28 0,-15.86 -12.8,-28.28 -29.14,-28.28 z m 13.58,28.28 c 0,7.76 -5.71,13.4 -13.58,13.4 -7.81,0 -13.47,-5.64 -13.47,-13.4 0,-7.76 5.67,-13.4 13.47,-13.4 7.87,0 13.58,5.63 13.58,13.4 z" id="path6" style="fill:#ffffff" /> <path class="st0" d="m 427.6,101.15 c -6.77,0 -12.25,2.05 -16.35,6.11 v -24.4 c 0,-0.55 -0.45,-1 -1,-1 h -13.56 c -0.55,0 -1,0.45 -1,1 v 72.39 c 0,0.55 0.45,1 1,1 h 13.56 c 0.55,0 1,-0.45 1,-1 v -3.66 c 4.1,4.06 9.59,6.11 16.35,6.11 7.2,0 13.95,-2.9 19,-8.17 5.09,-5.31 7.9,-12.45 7.9,-20.11 0,-7.66 -2.8,-14.8 -7.9,-20.11 -5.06,-5.26 -11.81,-8.16 -19,-8.16 z m 11.34,28.28 c 0,8.07 -5.72,13.71 -13.9,13.71 -8.12,0 -13.79,-5.64 -13.79,-13.71 0,-8.07 5.67,-13.71 13.79,-13.71 8.18,0 13.9,5.63 13.9,13.71 z" id="path8" style="fill:#ffffff" /> <path class="st0" d="m 469.41,80.31 c -4.83,0 -8.9,4.02 -8.9,8.79 0,4.71 4.08,8.69 8.9,8.69 4.96,0 9,-3.9 9,-8.69 0,-4.77 -4.12,-8.79 -9,-8.79 z" id="path10" style="fill:#ffffff" /> <path class="st0" d="m 476.24,102.6 h -13.56 c -0.55,0 -1,0.45 -1,1 v 51.66 c 0,0.55 0.45,1 1,1 h 13.56 c 0.55,0 1,-0.45 1,-1 V 103.6 c 0,-0.55 -0.45,-1 -1,-1 z" id="path12" style="fill:#ffffff" /> <path class="st0" d="m 504.74,78.76 h -13.56 c -0.55,0 -1,0.45 -1,1 v 75.5 c 0,0.55 0.45,1 1,1 h 13.56 c 0.55,0 1,-0.45 1,-1 v -75.5 c 0,-0.56 -0.45,-1 -1,-1 z" id="path14" style="fill:#ffffff" /> <path class="st0" d="m 532.65,102.6 h -13.56 c -0.55,0 -1,0.45 -1,1 v 51.66 c 0,0.55 0.45,1 1,1 h 13.56 c 0.55,0 1,-0.45 1,-1 V 103.6 c 0,-0.55 -0.45,-1 -1,-1 z" id="path16" style="fill:#ffffff" /> <path class="st0" d="m 525.82,80.31 c -4.83,0 -8.9,4.02 -8.9,8.79 0,4.71 4.08,8.69 8.9,8.69 4.96,0 9,-3.9 9,-8.69 0.01,-4.77 -4.12,-8.79 -9,-8.79 z" id="path18" style="fill:#ffffff" /> <path class="st0" d="M 576.69,102.6 H 565.65 V 89.08 c 0,-0.55 -0.45,-1 -1,-1 h -13.56 c -0.55,0 -1,0.45 -1,1 v 13.52 h -8.27 c -0.55,0 -1,0.45 -1,1 v 12.67 c 0,0.55 0.45,1 1,1 h 8.27 v 20.66 c 0,6.93 1.56,11.56 4.91,14.57 3.13,2.81 7.86,4.18 14.64,4.18 2.17,0 4.55,-0.14 7.15,-0.42 0.51,-0.05 0.89,-0.48 0.89,-0.99 v -11.95 c 0,-0.27 -0.11,-0.54 -0.31,-0.72 -0.2,-0.19 -0.47,-0.29 -0.74,-0.27 -4.86,0.25 -8.41,0.32 -9.95,-1.14 -0.71,-0.67 -1.04,-1.7 -1.04,-3.25 v -20.66 h 11.04 c 0.55,0 1,-0.45 1,-1 V 103.6 c 0.01,-0.55 -0.44,-1 -0.99,-1 z" id="path20" style="fill:#ffffff" /> <path class="st0" d="M 676.43,81.87 H 646.9 c -0.55,0 -1,0.45 -1,1 v 72.39 c 0,0.55 0.45,1 1,1 h 29.53 c 10.15,0 19.49,-3.82 26.31,-10.76 6.77,-6.89 10.5,-16.28 10.5,-26.44 0,-10.16 -3.73,-19.55 -10.5,-26.44 -6.82,-6.93 -16.16,-10.75 -26.31,-10.75 z m 20.93,37.19 c 0,12.77 -8.61,21.69 -20.93,21.69 H 662.42 V 97.37 h 14.01 c 12.32,0 20.93,8.92 20.93,21.69 z" id="path22" style="fill:#ffffff" /> <path class="st0" d="M 775.16,102.6 H 761.6 c -0.55,0 -1,0.45 -1,1 v 3.7 c -4.15,-4.03 -9.8,-6.15 -16.46,-6.15 -7.15,0 -13.87,2.9 -18.91,8.17 -5.08,5.31 -7.88,12.45 -7.88,20.1 0,7.65 2.8,14.79 7.88,20.11 5.04,5.27 11.76,8.17 18.91,8.17 6.66,0 12.3,-2.12 16.46,-6.15 v 3.7 c 0,0.55 0.45,1 1,1 h 13.56 c 0.55,0 1,-0.45 1,-1 V 103.6 c 0,-0.55 -0.45,-1 -1,-1 z m -14.56,26.83 c 0,8.07 -5.72,13.71 -13.9,13.71 -8.12,0 -13.79,-5.64 -13.79,-13.71 0,-8.07 5.67,-13.71 13.79,-13.71 8.19,0 13.9,5.63 13.9,13.71 z" id="path24" style="fill:#ffffff" /> <path class="st0" d="M 818.36,102.6 H 807.32 V 89.08 c 0,-0.55 -0.45,-1 -1,-1 h -13.56 c -0.55,0 -1,0.45 -1,1 v 13.52 h -8.27 c -0.55,0 -1,0.45 -1,1 v 12.67 c 0,0.55 0.45,1 1,1 h 8.27 v 20.66 c 0,6.93 1.56,11.56 4.91,14.57 3.13,2.81 7.86,4.18 14.64,4.18 2.17,0 4.55,-0.14 7.15,-0.42 0.51,-0.05 0.89,-0.48 0.89,-0.99 v -11.95 c 0,-0.27 -0.11,-0.54 -0.31,-0.72 -0.2,-0.19 -0.47,-0.29 -0.74,-0.27 -4.85,0.25 -8.41,0.32 -9.95,-1.14 -0.71,-0.67 -1.04,-1.7 -1.04,-3.25 v -20.66 h 11.04 c 0.55,0 1,-0.45 1,-1 V 103.6 c 0.01,-0.55 -0.44,-1 -0.99,-1 z" id="path26" style="fill:#ffffff" /> <path class="st0" d="m 880.73,102.6 h -13.56 c -0.55,0 -1,0.45 -1,1 v 3.7 c -4.15,-4.03 -9.8,-6.15 -16.46,-6.15 -7.15,0 -13.87,2.9 -18.91,8.17 -5.08,5.31 -7.88,12.45 -7.88,20.1 0,7.65 2.8,14.79 7.88,20.11 5.04,5.27 11.76,8.17 18.91,8.17 6.66,0 12.31,-2.12 16.46,-6.15 v 3.7 c 0,0.55 0.45,1 1,1 h 13.56 c 0.55,0 1,-0.45 1,-1 V 103.6 c -0.01,-0.55 -0.45,-1 -1,-1 z m -14.56,26.83 c 0,8.07 -5.72,13.71 -13.9,13.71 -8.12,0 -13.79,-5.64 -13.79,-13.71 0,-8.07 5.67,-13.71 13.79,-13.71 8.18,0 13.9,5.63 13.9,13.71 z" id="path28" style="fill:#ffffff" /> <path class="st0" d="m 637.94,102.65 h -14.4 c -0.49,0 -0.92,0.31 -1.08,0.77 l -11.13,33.32 -13.05,-33.37 c -0.17,-0.44 -0.59,-0.72 -1.06,-0.72 h -14.71 c -0.38,0 -0.74,0.19 -0.95,0.51 -0.21,0.32 -0.25,0.72 -0.1,1.07 l 21.83,50.99 c -2.51,6.69 -6.12,9.31 -12.78,9.31 -0.05,0 -0.1,0 -0.14,0 -0.3,0 -0.59,0.12 -0.8,0.33 -0.22,0.21 -0.33,0.5 -0.33,0.8 v 12.36 c 0,0.61 0.48,1.11 1.08,1.14 0.63,0.03 1.25,0.05 1.87,0.05 6.25,0 11.45,-1.62 15.85,-4.92 4.83,-3.63 8.57,-9.21 11.43,-17.07 L 639,104.17 c 0.13,-0.35 0.08,-0.74 -0.13,-1.04 -0.21,-0.3 -0.56,-0.48 -0.93,-0.48 z" id="path30" style="fill:#ffffff" /> </g> <path class="st0" d="m 215.93,168.67 -9.88,-9.88 -3.3,3.3 5.03,5.03 h -22.43 c -0.93,-2.53 -2.93,-4.55 -5.45,-5.51 V 35.56 c 0,-2.16 -1.75,-3.91 -3.91,-3.91 h -27.18 c -1.8,0 -3.49,0.95 -4.42,2.49 L 108.64,90.65 72.71,34.12 C 71.77,32.59 70.09,31.65 68.3,31.65 H 49.2 C 48.24,29.13 46.23,27.13 43.7,26.2 V 0 h -6.4 v 26.2 c -2.56,0.94 -4.6,2.98 -5.54,5.54 H 8.83 l 5.03,-5.03 -3.3,-3.3 -9.88,9.88 C 0.24,33.73 0,34.32 0,34.94 c 0,0.62 0.25,1.21 0.68,1.65 l 9.88,9.88 3.3,-3.3 -5.03,-5.03 h 22.91 c 0.93,2.54 2.93,4.56 5.46,5.52 V 169.7 c 0,2.16 1.75,3.91 3.91,3.91 h 28.82 c 2.16,0 3.91,-1.75 3.91,-3.91 v -68.08 l 30.47,46.42 c 0.92,1.41 2.5,2.29 4.23,2.35 0.04,0 0.08,0 0.12,0 1.75,0 3.37,-0.89 4.34,-2.39 l 30.1,-46.99 0.35,67.38 c 0,2.87 2.32,5.21 5.18,5.21 h 19.26 c 0.96,2.52 2.97,4.52 5.51,5.45 v 26.19 h 6.4 v -26.19 c 2.56,-0.94 4.6,-2.98 5.54,-5.54 h 22.43 l -5.03,5.03 3.3,3.3 9.88,-9.88 c 0.92,-0.91 0.92,-2.38 0.01,-3.29 z M 40.49,39.6 c -0.16,0 -0.32,-0.01 -0.48,-0.02 -0.03,0 -0.06,-0.01 -0.09,-0.01 -0.13,-0.02 -0.25,-0.03 -0.37,-0.06 -0.02,0 -0.04,-0.01 -0.07,-0.02 -0.13,-0.03 -0.26,-0.06 -0.38,-0.1 -0.01,0 -0.03,-0.01 -0.04,-0.02 -0.13,-0.04 -0.26,-0.09 -0.39,-0.14 0,0 0,0 0,0 -0.14,-0.06 -0.27,-0.12 -0.4,-0.19 -0.4,-0.22 -0.76,-0.49 -1.07,-0.8 -0.03,-0.03 -0.05,-0.06 -0.08,-0.09 -0.2,-0.21 -0.38,-0.43 -0.53,-0.68 0,0 0,0 0,0 -0.08,-0.12 -0.15,-0.24 -0.22,-0.37 0,-0.01 -0.01,-0.02 -0.01,-0.03 -0.06,-0.12 -0.12,-0.24 -0.17,-0.36 -0.01,-0.02 -0.02,-0.05 -0.03,-0.07 -0.04,-0.11 -0.09,-0.22 -0.12,-0.34 -0.01,-0.04 -0.02,-0.09 -0.03,-0.14 -0.03,-0.1 -0.05,-0.2 -0.07,-0.3 -0.02,-0.08 -0.02,-0.15 -0.04,-0.23 -0.01,-0.07 -0.03,-0.15 -0.03,-0.22 -0.02,-0.15 -0.02,-0.31 -0.02,-0.46 0,0 0,0 0,0 0,-0.16 0.01,-0.31 0.02,-0.47 0.01,-0.08 0.02,-0.15 0.03,-0.22 0.01,-0.08 0.02,-0.15 0.03,-0.23 0.02,-0.1 0.05,-0.2 0.08,-0.3 0.01,-0.04 0.02,-0.09 0.03,-0.13 0.04,-0.12 0.08,-0.23 0.12,-0.35 0.01,-0.02 0.02,-0.04 0.02,-0.07 0.05,-0.13 0.11,-0.25 0.17,-0.37 0,-0.01 0.01,-0.02 0.01,-0.02 0.2,-0.39 0.46,-0.74 0.76,-1.05 0.05,-0.05 0.1,-0.1 0.15,-0.15 0.21,-0.2 0.44,-0.38 0.68,-0.54 0,0 0,0 0,0 0.12,-0.08 0.24,-0.15 0.37,-0.22 0.01,0 0.02,-0.01 0.02,-0.01 0.12,-0.06 0.24,-0.12 0.37,-0.17 0.02,-0.01 0.05,-0.02 0.07,-0.02 0.11,-0.04 0.23,-0.09 0.34,-0.12 0.04,-0.01 0.09,-0.02 0.13,-0.03 0.1,-0.03 0.2,-0.05 0.3,-0.07 0.08,-0.02 0.15,-0.02 0.23,-0.04 0.07,-0.01 0.14,-0.03 0.22,-0.03 0.15,-0.02 0.31,-0.02 0.47,-0.02 0.16,0 0.31,0.01 0.47,0.02 0.07,0.01 0.15,0.02 0.22,0.03 0.08,0.01 0.16,0.02 0.23,0.04 0.1,0.02 0.2,0.05 0.3,0.07 0.04,0.01 0.09,0.02 0.13,0.03 0.12,0.04 0.23,0.08 0.34,0.12 0.02,0.01 0.05,0.02 0.07,0.02 0.13,0.05 0.25,0.11 0.37,0.17 0.01,0 0.02,0.01 0.02,0.01 0.13,0.07 0.25,0.14 0.37,0.22 0,0 0,0 0,0 0.24,0.16 0.47,0.34 0.68,0.54 0.02,0.02 0.05,0.04 0.07,0.06 0.32,0.32 0.59,0.68 0.81,1.07 0,0 0,0 0,0 0.07,0.13 0.13,0.26 0.19,0.39 0,0.01 0.01,0.01 0.01,0.02 0.05,0.13 0.1,0.25 0.14,0.38 0,0.02 0.01,0.03 0.02,0.05 0.04,0.12 0.07,0.24 0.1,0.37 0.01,0.03 0.02,0.05 0.02,0.08 0.02,0.12 0.04,0.24 0.06,0.36 0,0.04 0.01,0.07 0.02,0.11 0.02,0.16 0.02,0.31 0.02,0.47 0,0 0,0 0,0 0.01,2.57 -2.07,4.65 -4.64,4.65 z m 109.13,50.25 c -0.01,-1.46 -0.97,-2.74 -2.37,-3.14 -1.4,-0.41 -2.9,0.16 -3.69,1.39 L 108.63,142.63 73.3,88.8 c -0.8,-1.22 -2.3,-1.76 -3.69,-1.35 -1.39,0.42 -2.35,1.7 -2.35,3.15 v 76.42 H 43.79 V 43.66 c 2.49,-0.95 4.48,-2.93 5.42,-5.43 h 18.3 l 38.35,60.33 c 0.6,0.95 1.65,1.53 2.78,1.53 0,0 0,0 0,0 1.13,0 2.18,-0.58 2.78,-1.53 l 38.16,-60.32 h 23.72 v 123.37 c -2.49,0.94 -4.47,2.93 -5.42,5.42 h -17.87 z m 30.18,83.83 v 0 c -0.21,0.2 -0.44,0.38 -0.68,0.54 0,0 0,0 0,0 -0.12,0.08 -0.24,0.15 -0.37,0.22 -0.01,0 -0.02,0.01 -0.03,0.01 -0.12,0.06 -0.24,0.12 -0.37,0.17 -0.02,0.01 -0.05,0.02 -0.07,0.02 -0.11,0.04 -0.23,0.09 -0.34,0.12 -0.04,0.01 -0.09,0.02 -0.13,0.03 -0.1,0.03 -0.2,0.05 -0.3,0.07 -0.07,0.01 -0.15,0.02 -0.23,0.03 -0.07,0.01 -0.15,0.03 -0.22,0.03 -0.15,0.02 -0.31,0.02 -0.47,0.02 -0.16,0 -0.31,-0.01 -0.47,-0.02 -0.07,-0.01 -0.15,-0.02 -0.22,-0.03 -0.08,-0.01 -0.15,-0.02 -0.23,-0.03 -0.1,-0.02 -0.2,-0.05 -0.3,-0.07 -0.04,-0.01 -0.09,-0.02 -0.13,-0.03 -0.12,-0.04 -0.23,-0.08 -0.34,-0.12 -0.02,-0.01 -0.05,-0.02 -0.07,-0.03 -0.12,-0.05 -0.25,-0.11 -0.36,-0.17 -0.01,0 -0.02,-0.01 -0.03,-0.01 -0.13,-0.07 -0.25,-0.14 -0.37,-0.22 0,0 0,0 0,0 -0.24,-0.16 -0.47,-0.34 -0.68,-0.54 -0.03,-0.02 -0.05,-0.05 -0.08,-0.07 -0.32,-0.32 -0.59,-0.68 -0.8,-1.07 0,0 0,0 0,0 -0.07,-0.13 -0.13,-0.26 -0.19,-0.4 0,0 0,-0.01 -0.01,-0.01 -0.05,-0.12 -0.1,-0.25 -0.14,-0.38 -0.01,-0.02 -0.01,-0.03 -0.02,-0.05 -0.04,-0.12 -0.07,-0.24 -0.09,-0.36 -0.01,-0.03 -0.02,-0.06 -0.02,-0.08 -0.02,-0.11 -0.04,-0.22 -0.05,-0.34 -0.01,-0.04 -0.01,-0.08 -0.02,-0.13 -0.02,-0.16 -0.02,-0.31 -0.02,-0.48 0,-2.56 2.09,-4.65 4.65,-4.65 0.16,0 0.32,0.01 0.48,0.02 0.04,0 0.08,0.01 0.13,0.02 0.11,0.01 0.22,0.03 0.33,0.05 0.03,0.01 0.06,0.02 0.09,0.02 0.12,0.03 0.24,0.06 0.36,0.09 0.02,0.01 0.04,0.02 0.06,0.02 0.12,0.04 0.25,0.08 0.37,0.14 0.01,0 0.02,0.01 0.03,0.01 0.13,0.06 0.25,0.12 0.38,0.18 0,0 0.01,0 0.01,0.01 0.39,0.21 0.75,0.48 1.06,0.8 0.02,0.03 0.05,0.05 0.07,0.08 v 0 c 0.2,0.21 0.38,0.44 0.54,0.68 0,0 0,0 0,0 0.08,0.12 0.15,0.24 0.22,0.37 0,0.01 0.01,0.02 0.01,0.03 0.06,0.12 0.12,0.24 0.17,0.37 0.01,0.02 0.02,0.05 0.03,0.07 0.04,0.11 0.09,0.23 0.12,0.34 0.01,0.04 0.02,0.09 0.03,0.13 0.03,0.1 0.05,0.2 0.07,0.3 0.01,0.07 0.02,0.15 0.03,0.23 0.01,0.07 0.03,0.15 0.03,0.22 0.02,0.15 0.02,0.31 0.02,0.47 0,0.16 -0.01,0.31 -0.02,0.47 -0.01,0.08 -0.02,0.15 -0.03,0.22 -0.01,0.08 -0.02,0.15 -0.03,0.23 -0.02,0.1 -0.05,0.2 -0.07,0.3 -0.01,0.04 -0.02,0.09 -0.03,0.13 -0.04,0.12 -0.08,0.23 -0.12,0.34 -0.01,0.02 -0.02,0.05 -0.03,0.07 -0.05,0.12 -0.11,0.25 -0.17,0.37 0,0.01 -0.01,0.02 -0.01,0.03 -0.07,0.13 -0.14,0.25 -0.22,0.37 0,0 0,0 0,0 -0.16,0.24 -0.34,0.47 -0.54,0.68 v 0 c -0.06,0.06 -0.11,0.12 -0.17,0.17 z" id="path34" style="fill:#ffffff" /> </svg> </a> </div> <div class="md-social"> <a href="https://gtfs.org/blog/feed_rss_created.xml" target="_blank" rel="noopener" title="GTFS Digest RSS feed" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M64 32C28.7 32 0 60.7 0 96v320c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64zm32 104c0-13.3 10.7-24 24-24 137 0 248 111 248 248 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-200-200-200-13.3 0-24-10.7-24-24m0 96c0-13.3 10.7-24 24-24 83.9 0 152 68.1 152 152 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104-13.3 0-24-10.7-24-24m0 120a32 32 0 1 1 64 0 32 32 0 1 1-64 0"/></svg> </a> <a href="https://github.com/MobilityData" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> <a href="https://www.linkedin.com/company/mobilitydata" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> </a> <a href="https://share.mobilitydata.org/slack" target="_blank" rel="noopener" title="share.mobilitydata.org" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1s21.16-47.06 47.06-47.06h47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06S448 171 448 196.9s-21.16 47.06-47.06 47.06h-47.06zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06S309 480 283.1 480s-47.06-21.16-47.06-47.06v-47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06s21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06z"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <div class="md-consent" data-md-component="consent" id="__consent" hidden> <div class="md-consent__overlay"></div> <aside class="md-consent__inner"> <form class="md-consent__form md-grid md-typeset" name="consent"> <h4>Cookie Consent</h4> <p>We use cookies to track visits, stored anonymously. With your consent, you're helping us to make our documentation better. See our <a href="https://mobilitydata.org/privacy-policy/" target="_blank" rel="noopener">Privacy Policy</a>.</p> <input class="md-toggle" type="checkbox" id="__settings" > <div class="md-consent__settings"> <ul class="task-list"> <li class="task-list-item"> <label class="task-list-control"> <input type="checkbox" name="analytics" checked> <span class="task-list-indicator"></span> Google Analytics </label> </li> <li class="task-list-item"> <label class="task-list-control"> <input type="checkbox" name="github" checked> <span class="task-list-indicator"></span> GitHub </label> </li> </ul> </div> <div class="md-consent__controls"> <button class="md-button md-button--primary">Accept</button> <button type="reset" class="md-button md-button--primary">Reject</button> <label class="md-button" for="__settings">Manage settings</label> </div> </form> </aside> </div> <script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script> <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.tabs", "navigation.indexes", "navigation.top", "navigation.footer", "content.tabs.link", "search.suggest"], "search": "../../../assets/javascripts/workers/search.c7c1ca2c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src="../../../assets/javascripts/bundle.203fd0bc.min.js"></script> </body> </html>