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/schedule/schedule-best-practices/"> <link rel="prev" href="../reference/"> <link rel="next" href="../examples/attributions/"> <link rel="alternate" href="./" hreflang="en"> <link rel="alternate" href="../../../fr/documentation/schedule/schedule-best-practices/" hreflang="fr"> <link rel="alternate" href="../../../es/documentation/schedule/schedule-best-practices/" hreflang="es"> <link rel="alternate" href="../../../ja/documentation/schedule/schedule-best-practices/" hreflang="ja"> <link rel="alternate" href="../../../de/documentation/schedule/schedule-best-practices/" hreflang="de"> <link rel="alternate" href="../../../pt/documentation/schedule/schedule-best-practices/" hreflang="pt"> <link rel="alternate" href="../../../ru/documentation/schedule/schedule-best-practices/" hreflang="ru"> <link rel="alternate" href="../../../id/documentation/schedule/schedule-best-practices/" hreflang="id"> <link rel="alternate" href="../../../ko/documentation/schedule/schedule-best-practices/" hreflang="ko"> <link rel="alternate" href="../../../zh/documentation/schedule/schedule-best-practices/" hreflang="zh"> <link rel="alternate" href="../../../zh-TW/documentation/schedule/schedule-best-practices/" hreflang="zh-TW"> <link rel="icon" href="../../../assets/favicon.ico"> <meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.44+insiders-4.53.14"> <title>Best Practices - General Transit Feed Specification</title> <link rel="stylesheet" href="../../../assets/stylesheets/main.12320a83.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&amp;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-schedule-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/schedule/schedule-best-practices/" hreflang="fr" class="md-select__link"> Français </a> </li> <li class="md-select__item"> <a href="../../../es/documentation/schedule/schedule-best-practices/" hreflang="es" class="md-select__link"> Español </a> </li> <li class="md-select__item"> <a href="../../../ja/documentation/schedule/schedule-best-practices/" hreflang="ja" class="md-select__link"> 日本語 </a> </li> <li class="md-select__item"> <a href="../../../de/documentation/schedule/schedule-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/schedule/schedule-best-practices/" hreflang="pt" class="md-select__link"> Português (em breve) </a> </li> <li class="md-select__item"> <a href="../../../ru/documentation/schedule/schedule-best-practices/" hreflang="ru" class="md-select__link"> Русский (будет добавлен позже) </a> </li> <li class="md-select__item"> <a href="../../../id/documentation/schedule/schedule-best-practices/" hreflang="id" class="md-select__link"> Bahasa Indonesia (akan segera hadir) </a> </li> <li class="md-select__item"> <a href="../../../ko/documentation/schedule/schedule-best-practices/" hreflang="ko" class="md-select__link"> 한국어 (곧 제공 예정) </a> </li> <li class="md-select__item"> <a href="../../../zh/documentation/schedule/schedule-best-practices/" hreflang="zh" class="md-select__link"> 中文 - 简体(即将推出) </a> </li> <li class="md-select__item"> <a href="../../../zh-TW/documentation/schedule/schedule-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.6.0 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.6.0 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--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" checked> <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="true"> <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="../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="#document-structure" class="md-nav__link"> <span class="md-ellipsis"> Document Structure </span> </a> </li> <li class="md-nav__item"> <a href="#dataset-publishing-general-practices" class="md-nav__link"> <span class="md-ellipsis"> Dataset Publishing &amp; General Practices </span> </a> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-file" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by File </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by File"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#all-files" class="md-nav__link"> <span class="md-ellipsis"> All Files </span> </a> </li> <li class="md-nav__item"> <a href="#agencytxt" class="md-nav__link"> <span class="md-ellipsis"> agency.txt </span> </a> </li> <li class="md-nav__item"> <a href="#stopstxt" class="md-nav__link"> <span class="md-ellipsis"> stops.txt </span> </a> </li> <li class="md-nav__item"> <a href="#routestxt" class="md-nav__link"> <span class="md-ellipsis"> routes.txt </span> </a> </li> <li class="md-nav__item"> <a href="#tripstxt" class="md-nav__link"> <span class="md-ellipsis"> trips.txt </span> </a> </li> <li class="md-nav__item"> <a href="#stop_timestxt" class="md-nav__link"> <span class="md-ellipsis"> stop_times.txt </span> </a> </li> <li class="md-nav__item"> <a href="#calendartxt" class="md-nav__link"> <span class="md-ellipsis"> calendar.txt </span> </a> </li> <li class="md-nav__item"> <a href="#calendar_datestxt" class="md-nav__link"> <span class="md-ellipsis"> calendar_dates.txt </span> </a> </li> <li class="md-nav__item"> <a href="#fare_attributestxt" class="md-nav__link"> <span class="md-ellipsis"> fare_attributes.txt </span> </a> </li> <li class="md-nav__item"> <a href="#fare_rulestxt" class="md-nav__link"> <span class="md-ellipsis"> fare_rules.txt </span> </a> </li> <li class="md-nav__item"> <a href="#shapestxt" class="md-nav__link"> <span class="md-ellipsis"> shapes.txt </span> </a> </li> <li class="md-nav__item"> <a href="#frequenciestxt" class="md-nav__link"> <span class="md-ellipsis"> frequencies.txt </span> </a> </li> <li class="md-nav__item"> <a href="#transferstxt" class="md-nav__link"> <span class="md-ellipsis"> transfers.txt </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-case" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by Case </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by Case"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#loop-routes" class="md-nav__link"> <span class="md-ellipsis"> Loop Routes </span> </a> </li> <li class="md-nav__item"> <a href="#lasso-routes" class="md-nav__link"> <span class="md-ellipsis"> Lasso Routes </span> </a> </li> <li class="md-nav__item"> <a href="#branches" class="md-nav__link"> <span class="md-ellipsis"> Branches </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#frequently-asked-questions-faq" class="md-nav__link"> <span class="md-ellipsis"> Frequently Asked Questions (FAQ) </span> </a> <nav class="md-nav" aria-label="Frequently Asked Questions (FAQ)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#why-are-these-gtfs-best-practices-important" class="md-nav__link"> <span class="md-ellipsis"> Why are these GTFS Best Practices important? </span> </a> </li> <li class="md-nav__item"> <a href="#how-were-they-developed-who-developed-them" class="md-nav__link"> <span class="md-ellipsis"> How were they developed? Who developed them? </span> </a> </li> <li class="md-nav__item"> <a href="#why-not-just-change-the-gtfs-reference" class="md-nav__link"> <span class="md-ellipsis"> Why not just change the GTFS reference? </span> </a> </li> <li class="md-nav__item"> <a href="#how-to-check-for-conformance-with-these-best-practices" class="md-nav__link"> <span class="md-ellipsis"> How to check for conformance with these Best Practices? </span> </a> </li> <li class="md-nav__item"> <a href="#i-represent-a-transit-agency-what-steps-can-i-take-so-that-our-software-service-providers-and-vendors-follow-these-best-practices" class="md-nav__link"> <span class="md-ellipsis"> I represent a transit agency. What steps can I take so that our software service providers and vendors follow these Best Practices? </span> </a> </li> <li class="md-nav__item"> <a href="#what-should-i-do-if-i-notice-a-gtfs-data-feed-does-not-conform-to-these-best-practices" class="md-nav__link"> <span class="md-ellipsis"> What should I do if I notice a GTFS data feed does not conform to these Best Practices? </span> </a> </li> <li class="md-nav__item"> <a href="#how-do-i-get-involved" class="md-nav__link"> <span class="md-ellipsis"> How do I get involved? </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-best-practices" class="md-nav__link"> <span class="md-ellipsis"> How to propose or amend published GTFS 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> <li class="md-nav__item"> <a href="#gtfs-best-practices-working-group" class="md-nav__link"> <span class="md-ellipsis"> GTFS Best Practices Working Group </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_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="../examples/attributions/" class="md-nav__link"> <span class="md-ellipsis"> Attributions </span> </a> </li> <li class="md-nav__item"> <a href="../examples/continuous-stops/" class="md-nav__link"> <span class="md-ellipsis"> Continuous stops </span> </a> </li> <li class="md-nav__item"> <a href="../examples/flex/" class="md-nav__link"> <span class="md-ellipsis"> Demand responsive services </span> </a> </li> <li class="md-nav__item"> <a href="../examples/fares-v1/" class="md-nav__link"> <span class="md-ellipsis"> Fares v1 </span> </a> </li> <li class="md-nav__item"> <a href="../examples/fares-v2/" class="md-nav__link"> <span class="md-ellipsis"> Fares v2 </span> </a> </li> <li class="md-nav__item"> <a href="../examples/feed-info/" class="md-nav__link"> <span class="md-ellipsis"> Feed information </span> </a> </li> <li class="md-nav__item"> <a href="../examples/frequencies/" class="md-nav__link"> <span class="md-ellipsis"> Frequencies </span> </a> </li> <li class="md-nav__item"> <a href="../examples/pathways/" class="md-nav__link"> <span class="md-ellipsis"> Pathways </span> </a> </li> <li class="md-nav__item"> <a href="../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="../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="../examples/transfers/" class="md-nav__link"> <span class="md-ellipsis"> Transfers </span> </a> </li> <li class="md-nav__item"> <a href="../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="../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> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" > <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="false"> <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="../../realtime/reference/" class="md-nav__link"> <span class="md-ellipsis"> Reference </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/realtime-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_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="../../realtime/feed-entities/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/feed-entities/trip-updates/" class="md-nav__link"> <span class="md-ellipsis"> Trip Updates </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/feed-entities/service-alerts/" class="md-nav__link"> <span class="md-ellipsis"> Service Alerts </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/feed-entities/vehicle-positions/" class="md-nav__link"> <span class="md-ellipsis"> Vehicle Positions </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/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="../../realtime/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="../../realtime/language-bindings/overview/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/language-bindings/dotnet/" class="md-nav__link"> <span class="md-ellipsis"> .NET </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/language-bindings/java/" class="md-nav__link"> <span class="md-ellipsis"> Java </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/language-bindings/nodejs/" class="md-nav__link"> <span class="md-ellipsis"> JavaScript/Node.js </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/language-bindings/python/" class="md-nav__link"> <span class="md-ellipsis"> Python </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/language-bindings/golang/" class="md-nav__link"> <span class="md-ellipsis"> Golang </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/language-bindings/ruby/" class="md-nav__link"> <span class="md-ellipsis"> Ruby </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/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="../../realtime/examples/service-alerts/" class="md-nav__link"> <span class="md-ellipsis"> Service alerts </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/examples/trip-updates/" class="md-nav__link"> <span class="md-ellipsis"> Trip updates </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/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="../../realtime/change-history/recent-additions/" class="md-nav__link"> <span class="md-ellipsis"> Recent Additions </span> </a> </li> <li class="md-nav__item"> <a href="../../realtime/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="#document-structure" class="md-nav__link"> <span class="md-ellipsis"> Document Structure </span> </a> </li> <li class="md-nav__item"> <a href="#dataset-publishing-general-practices" class="md-nav__link"> <span class="md-ellipsis"> Dataset Publishing &amp; General Practices </span> </a> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-file" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by File </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by File"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#all-files" class="md-nav__link"> <span class="md-ellipsis"> All Files </span> </a> </li> <li class="md-nav__item"> <a href="#agencytxt" class="md-nav__link"> <span class="md-ellipsis"> agency.txt </span> </a> </li> <li class="md-nav__item"> <a href="#stopstxt" class="md-nav__link"> <span class="md-ellipsis"> stops.txt </span> </a> </li> <li class="md-nav__item"> <a href="#routestxt" class="md-nav__link"> <span class="md-ellipsis"> routes.txt </span> </a> </li> <li class="md-nav__item"> <a href="#tripstxt" class="md-nav__link"> <span class="md-ellipsis"> trips.txt </span> </a> </li> <li class="md-nav__item"> <a href="#stop_timestxt" class="md-nav__link"> <span class="md-ellipsis"> stop_times.txt </span> </a> </li> <li class="md-nav__item"> <a href="#calendartxt" class="md-nav__link"> <span class="md-ellipsis"> calendar.txt </span> </a> </li> <li class="md-nav__item"> <a href="#calendar_datestxt" class="md-nav__link"> <span class="md-ellipsis"> calendar_dates.txt </span> </a> </li> <li class="md-nav__item"> <a href="#fare_attributestxt" class="md-nav__link"> <span class="md-ellipsis"> fare_attributes.txt </span> </a> </li> <li class="md-nav__item"> <a href="#fare_rulestxt" class="md-nav__link"> <span class="md-ellipsis"> fare_rules.txt </span> </a> </li> <li class="md-nav__item"> <a href="#shapestxt" class="md-nav__link"> <span class="md-ellipsis"> shapes.txt </span> </a> </li> <li class="md-nav__item"> <a href="#frequenciestxt" class="md-nav__link"> <span class="md-ellipsis"> frequencies.txt </span> </a> </li> <li class="md-nav__item"> <a href="#transferstxt" class="md-nav__link"> <span class="md-ellipsis"> transfers.txt </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#practice-recommendations-organized-by-case" class="md-nav__link"> <span class="md-ellipsis"> Practice Recommendations Organized by Case </span> </a> <nav class="md-nav" aria-label="Practice Recommendations Organized by Case"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#loop-routes" class="md-nav__link"> <span class="md-ellipsis"> Loop Routes </span> </a> </li> <li class="md-nav__item"> <a href="#lasso-routes" class="md-nav__link"> <span class="md-ellipsis"> Lasso Routes </span> </a> </li> <li class="md-nav__item"> <a href="#branches" class="md-nav__link"> <span class="md-ellipsis"> Branches </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#frequently-asked-questions-faq" class="md-nav__link"> <span class="md-ellipsis"> Frequently Asked Questions (FAQ) </span> </a> <nav class="md-nav" aria-label="Frequently Asked Questions (FAQ)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#why-are-these-gtfs-best-practices-important" class="md-nav__link"> <span class="md-ellipsis"> Why are these GTFS Best Practices important? </span> </a> </li> <li class="md-nav__item"> <a href="#how-were-they-developed-who-developed-them" class="md-nav__link"> <span class="md-ellipsis"> How were they developed? Who developed them? </span> </a> </li> <li class="md-nav__item"> <a href="#why-not-just-change-the-gtfs-reference" class="md-nav__link"> <span class="md-ellipsis"> Why not just change the GTFS reference? </span> </a> </li> <li class="md-nav__item"> <a href="#how-to-check-for-conformance-with-these-best-practices" class="md-nav__link"> <span class="md-ellipsis"> How to check for conformance with these Best Practices? </span> </a> </li> <li class="md-nav__item"> <a href="#i-represent-a-transit-agency-what-steps-can-i-take-so-that-our-software-service-providers-and-vendors-follow-these-best-practices" class="md-nav__link"> <span class="md-ellipsis"> I represent a transit agency. What steps can I take so that our software service providers and vendors follow these Best Practices? </span> </a> </li> <li class="md-nav__item"> <a href="#what-should-i-do-if-i-notice-a-gtfs-data-feed-does-not-conform-to-these-best-practices" class="md-nav__link"> <span class="md-ellipsis"> What should I do if I notice a GTFS data feed does not conform to these Best Practices? </span> </a> </li> <li class="md-nav__item"> <a href="#how-do-i-get-involved" class="md-nav__link"> <span class="md-ellipsis"> How do I get involved? </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-best-practices" class="md-nav__link"> <span class="md-ellipsis"> How to propose or amend published GTFS 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> <li class="md-nav__item"> <a href="#gtfs-best-practices-working-group" class="md-nav__link"> <span class="md-ellipsis"> GTFS Best Practices Working Group </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-schedule-best-practices">GTFS Schedule Best Practices<a class="headerlink" href="#gtfs-schedule-best-practices" title="Permanent link">&para;</a></h1> <p>These are recommended practices for describing public transportation services in the <a href="../reference">General Transit Feed Specification (GTFS)</a>. These practices have been synthesized from the experience of the <a href="#gtfs-best-practices-working-group">GTFS Best Practices working group</a> members and <a href="http://www.transitwiki.org/TransitWiki/index.php/Best_practices_for_creating_GTFS" target="_blank" rel="noopener">application-specific GTFS practice recommendations</a>. </p> <p>For further background, see the <a href="#frequently-asked-questions-faq">Frequently Asked Questions</a>.</p> <h2 id="document-structure">Document Structure<a class="headerlink" href="#document-structure" title="Permanent link">&para;</a></h2> <p>Practices are organized into four primary sections:</p> <ul> <li><strong><a href="#dataset-publishing-general-practices">Dataset Publishing &amp; General Practices</a>:</strong> These practices relate to the overall structure of the GTFS dataset and to the manner in which GTFS datasets are published.</li> <li><strong><a href="#practice-recommendations-organized-by-file">Practice Recommendations Organized by File</a>:</strong> Recommendations are organized by file and field in the GTFS to facilitate mapping practices back to the official GTFS reference.</li> <li><strong><a href="#practice-recommendations-organized-by-case">Practice Recommendations Organized by Case</a>:</strong> With particular cases, such as loop routes, practices may need to be applied across several files and fields. Such recommendations are consolidated in this section.</li> </ul> <h2 id="dataset-publishing-general-practices">Dataset Publishing &amp; General Practices<a class="headerlink" href="#dataset-publishing-general-practices" title="Permanent link">&para;</a></h2> <ul> <li>Datasets should be published at a public, permanent URL, including the zip file name. (e.g., www.agency.org/gtfs/gtfs.zip). Ideally, the URL should be directly downloadable without requiring login to access the file, to facilitate download by consuming software applications. While it is recommended (and the most common practice) to make a GTFS dataset openly downloadable, if a data provider does need to control access to GTFS for licensing or other reasons, it is recommended to control access to the GTFS dataset using API keys, which will facilitate automatic downloads.</li> <li>GTFS data is published in iterations so that a single file at a stable location always contains the latest official description of service for a transit agency (or agencies).</li> <li>Maintain persistent identifiers (id fields) for <code>stop_id</code>, <code>route_id</code>, and <code>agency_id</code> across data iterations whenever possible.</li> <li>One GTFS dataset should contain current and upcoming service (sometimes called a “merged” dataset). Google transitfeed tool's <a href="https://github.com/google/transitfeed/wiki/Merge" target="_blank" rel="noopener">merge function</a> can be used to create a merged dataset from two different GTFS feeds.<ul> <li>At any time, the published GTFS dataset should be valid for at least the next 7 days, and ideally for as long as the operator is confident that the schedule will continue to be operated.</li> <li>If possible, the GTFS dataset should cover at least the next 30 days of service.</li> </ul> </li> <li>Remove old services (expired calendars) from the feed.</li> <li>If a service modification will go into effect in 7 days or fewer, express this service change through a <a href="../../realtime/reference">GTFS-realtime</a> feed (service advisories or trip updates) rather than static GTFS dataset.</li> <li>The web-server hosting GTFS data should be configured to correctly report the file modification date (see <a href="https://tools.ietf.org/html/rfc2616#section-14.29" target="_blank" rel="noopener">HTTP/1.1 - Request for Comments 2616</a>, under Section 14.29).</li> </ul> <h2 id="practice-recommendations-organized-by-file">Practice Recommendations Organized by File<a class="headerlink" href="#practice-recommendations-organized-by-file" title="Permanent link">&para;</a></h2> <p>This section shows practices organized by file and field, aligning with the <a href="../reference">GTFS reference</a>.</p> <h3 id="all-files">All Files<a class="headerlink" href="#all-files" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>Mixed Case</td> <td>All customer-facing text strings (including stop names, route names, and headsigns) should use Mixed Case (not ALL CAPS), following local conventions for capitalization of place names on displays capable of displaying lower case characters.</td> </tr> <tr> <td></td> <td>Examples:</td> </tr> <tr> <td></td> <td>Brighton Churchill Square</td> </tr> <tr> <td></td> <td>Villiers-sur-Marne</td> </tr> <tr> <td></td> <td>Market Street</td> </tr> <tr> <td>Abbreviations</td> <td>Avoid use of abbreviations throughout the feed for names and other text (e.g. St. for Street) unless a location is called by its abbreviated name (e.g. “JFK Airport”). Abbreviations may be problematic for accessibility by screen reader software and voice user interfaces. Consuming software can be engineered to reliably convert full words to abbreviations for display, but converting from abbreviations to full words is prone to more risk of error.</td> </tr> </tbody> </table> <h3 id="agencytxt">agency.txt<a class="headerlink" href="#agencytxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>agency_phone</code></td> <td>Should be included unless no such customer service phone exists.</td> </tr> <tr> <td><code>agency_email</code></td> <td>Should be included unless no such customer service email exists.</td> </tr> <tr> <td><code>agency_fare_url</code></td> <td>Should be included unless the agency is fully fare-free.</td> </tr> </tbody> </table> <p><strong>Examples:</strong></p> <ul> <li> <p>Bus services are run by several small bus agencies. But there is one big agency that is responsible for scheduling and ticketing and from a user’s perspective responsible for the bus services.The one big agency should be defined as agency within the feed. Even if the data is split internally by different small bus operators there should only be one agency defined in the feed.</p> </li> <li> <p>The feed provider runs the ticketing portal, but there are different agencies that actually operate the services and are known by users to be responsible. The agencies actually operating the services should be defined as agencies within the feed.</p> </li> </ul> <h3 id="stopstxt">stops.txt<a class="headerlink" href="#stopstxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>stop_name</code></td> <td>When there is not a published stop name, follow consistent stop naming conventions throughout the feed.</td> </tr> <tr> <td></td> <td>By default, <code>stop_name</code> should not contain generic or redundant words like “Station” or “Stop”, but some edge cases are allowed.<ul><li>When it is actually part of the name (Union Station, Central Station<li>When the <code>stop_name</code> is too generic (such as if it is the name of the city). “Station”, “Terminal”, or other words make the meaning clear.</ul></td> </tr> <tr> <td><code>stop_lat</code> &amp; <code>stop_lon</code></td> <td>Stop locations should be as accurate possible. Stop locations should have an error of <strong>no more</strong> than four meters when compared to the actual stop position.</td> </tr> <tr> <td></td> <td>Stop locations should be placed very near to the pedestrian right of way where a passenger will board (i.e. correct side of the street).</td> </tr> <tr> <td></td> <td>If a stop location is shared across separate data feeds (i.e. two agencies use exactly the same stop / boarding facility), indicate the stop is shared by using the exact same <code>stop_lat</code> and <code>stop_lon</code> for both stops.</td> </tr> <tr> <td><code>parent_station</code> &amp; <code>location_type</code></td> <td>Many stations or terminals have multiple boarding facilities (depending on mode, they might be called a bus bay, platform, wharf, gate, or another term). In such cases, feed producers should describe stations, boarding facilities (also called child stops), and their relation. <ul><li>The station or terminal should be defined as a record in <code>stops.txt</code> with <code>location_type = 1</code>.</li><li>Each boarding facility should be defined as a stop with <code>location_type = 0</code>. The <code>parent_station</code> field should reference the <code>stop_id</code> of the station the boarding facility is in.</li></ul></td> </tr> <tr> <td></td> <td>When naming the station and child stops, set names that are well-recognized by riders, and can help riders to identify the station and boarding facility (bus bay, platform, wharf, gate, etc.).<table class='example'><thead><tr><th>Parent Station Name</th><th>Child Stop Name</th></tr></thead><tbody><tr><td>Chicago Union Station</td><td>Chicago Union Station Platform 19</td></tr><tr><td>San Francisco Ferry Building Terminal</td><td>San Francisco Ferry Building Terminal Gate E</td></tr><tr><td>Downtown Transit Center</td><td>Downtown Transit Center Bay B</td></tr></tbody></table></td> </tr> </tbody> </table> <h3 id="routestxt">routes.txt<a class="headerlink" href="#routestxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>route_long_name</code></td> <td>The definition from Specification reference: <q>This name is generally more descriptive than the <code>route_short_name</code> and will often include the route's destination or stop. At least one of <code>route_short_name</code> or <code>route_long_name</code> must be specified, or potentially both if appropriate. If the route does not have a long name, please specify a <code>route_short_name</code> and use an empty string as the value for this field.</q><br>Examples of types of long names are below:<table class='example'><thead><tr><th colspan='3'>Primary Travel Path or Corridor</th></tr><tr><th>Route Name</th><th>Form</th><th>Agency</th></tr></thead><tbody><tr><td><a href="https://www.sfmta.com/getting-around/transit/routes-stops/n-judah" target="_blank" rel="noopener">“N”/“Judah”</a></td><td><code>route_short_name</code>/<br><code>route_long_name</code></td><td><a href="https://www.sfmta.com/" target="_blank" rel="noopener">Muni</a>, in San Francisco</td></tr><tr><td><a href="https://trimet.org/schedules/r006.htm" target="_blank" rel="noopener">“6“/“ML King Jr Blvd“</a></td><td><code>route_short_name</code>/<br><code>route_long_name</code></td><td><a href="https://trimet.org/" target="_blank" rel="noopener">TriMet</a>, in Portland, Or.</td></tr><tr><td><a href="http://www.ratp.fr/informer/pdf/orienter/f_plan.php?nompdf=m6" target="_blank" rel="noopener">“6”/“Nation - Étoile”</a></td><td><code>route_short_name</code>/<br><code>route_long_name</code></td><td><a href="http://www.ratp.fr/" target="_blank" rel="noopener">RATP</a>, in Paris France.</td></tr><tr><td><a href="http://www.bvg.de/images/content/linienverlaeufe/LinienverlaufU2.pdf" target="_blank" rel="noopener">“U2”-“Pankow – Ruhleben”</a></td><td><code>route_short_name</code>-<br><code>route_long_name</code></td><td><a href="http://www.bvg.de/" target="_blank" rel="noopener">BVG</a>, in Berlin, Germany</td></tr></tbody></table><table class='example'><thead><tr><th>Description of the Service</th></tr></thead><tbody><tr><td><a href="https://128bc.org/schedules/rev-bus-hartwell-area/" target="_blank" rel="noopener">“Hartwell Area Shuttle“</a></td></tr></tbody></table></td> </tr> <tr> <td></td> <td><code>route_long_name</code> should not contain the <code>route_short_name</code>.</td> </tr> <tr> <td></td> <td>Include the full designation including a service identity when populating <code>route_long_name</code>. Examples:<table class='example'><thead><tr><th>Service Identity</th><th>Recommendation</th><th>Examples</th></tr></thead><tbody><tr><td>"MAX Light Rail"<br>TriMet, in Portland, Oregon</td><td>The <code>route_long_name</code> should include the brand (MAX) and the specific route designation</td><td>"MAX Red Line" "MAX Blue Line"</td></tr><tr><td>"Rapid Ride"<br>ABQ Ride, in Albuquerque, New Mexico</td><td>The <code>route_long_name</code> should include the brand (Rapid Ride) and the specific route designation</td><td>"Rapid Ride Red Line"<br>"Rapid Ride Blue Line"</td></tr></tbody></table></td> </tr> <tr> <td><code>route_id</code></td> <td>All trips on a given named route should reference the same <code>route_id</code>. <li>Different directions of a route should not be separated into different <code>route_id</code> values.</li><li>Different spans of operation of a route should not be separated into different <code>route_id</code> values. i.e. do not create different records in <code>routes.txt</code> for “Downtown AM” and “Downtown PM” services).</li></td> </tr> <tr> <td></td> <td>If a route group includes distinctly named branches (e.g. 1A and 1B), follow recommendations in the route <a href="#branches">branches</a> case to determine <code>route_short_name</code> and <code>route_long_name</code>.</td> </tr> <tr> <td><code>route_color</code> &amp; <code>route_text_color</code></td> <td>Should be consistent with signage and printed and online customer information (and thus not included if they do not exist in other places).</td> </tr> </tbody> </table> <h3 id="tripstxt">trips.txt<a class="headerlink" href="#tripstxt" title="Permanent link">&para;</a></h3> <ul> <li><strong>See special case for loop routes:</strong> Loop routes are cases where trips start and end at the same stop, as opposed to linear routes, which have two distinct termini. Loop routes must be described following specific practices. <a href="#loop-routes">See Loop route case.</a></li> <li><strong>See special case for lasso routes:</strong> Lasso routes are a hybrid of linear and loop geometries, in which vehicles travel on a loop for only a portion of the route. Lasso routes must be described following specific practices. <a href="#lasso-routes">See Lasso route case.</a></li> </ul> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>trip_headsign</code></td> <td>Do not provide route names (matching <code>route_short_name</code> and <code>route_long_name</code>) in the <code>trip_headsign</code> or <code>stop_headsign</code> fields.</td> </tr> <tr> <td></td> <td>Should contain destination, direction, and/or other trip designation text shown on the headsign of the vehicle which may be used to distinguish amongst trips in a route. Consistency with direction information shown on the vehicle is the primary and overriding goal for determining headsigns supplied in GTFS datasets. Other information should be included only if it does not compromise this primary goal. If headsigns change during a trip, override <code>trip_headsign</code> with <code>stop_times.stop_headsign</code>. Below are recommendations for some possible cases:</td> </tr> <tr> <td></td> <td><table class="example"><thead><tr><th>Route Description</th><th>Recommendation</th></tr></thead><tbody><tr><td>2A. Destination-only</td><td>Provide the terminus destination. e.g. "Transit Center", “Portland City Center”, or “Jantzen Beach”&gt; </td></tr><tr><td>2B. Destinations with waypoints</td><td>&lt;destination&gt; via &lt;waypoint&gt; “Highgate via Charing Cross”. If waypoint(s) are removed from the headsign show to passengers after the vehicle passes those waypoints, use <code>stop_times.stop_headsign</code> to set an updated headsign.&gt; </td></tr><tr><td>2C. Regional placename with local stops</td><td>If there will be multiple stops inside the city or borough of destination, use <code>stop_times.stop_headsign</code> once reaching the destination city.&gt; </td></tr><tr><td>2D. Direction-only</td><td>Indicate using terms such as “Northbound”, “Inbound”, “Clockwise,” or similar directions.&gt;</td></tr><tr><td>2E. Direction with destination</td><td>&lt;direction&gt; to &lt;terminus name&gt; e.g. “Southbound to San Jose”&gt;</td></tr><tr><td>2F. Direction with destination and waypoints</td><td>&lt;direction&gt; via &lt;waypoint&gt; to &lt;destination&gt; (“Northbound via Charing Cross to Highgate”).&gt;</td></tr></tbody></table></td> </tr> <tr> <td></td> <td>Do not begin a headsign with the words “To” or “Towards”.</td> </tr> <tr> <td><code>direction_id</code></td> <td>Use values 0 and 1 consistently throughout the dataset. i.e.<ul><li>If 1 = Outbound on the Red route, then 1 = Outbound on the Green route</li><li>If 1 = Northbound on Route X, then 1 = Northbound on Route Y</li><li>If 1 = clockwise on Route X then 1 = clockwise on Route Y</li></ul></td> </tr> <tr> <td><code>bikes_allowed</code></td> <td>For ferry trips, be explicit about bikes being allowed (or not), as avoiding ferry trips due to missing data usually leads to big detours.</td> </tr> </tbody> </table> <h3 id="stop_timestxt">stop_times.txt<a class="headerlink" href="#stop_timestxt" title="Permanent link">&para;</a></h3> <p>Loop routes: Loop routes require special <code>stop_times</code> considerations. (See: <a href="#loop-routes">Loop route case</a>)</p> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>pickup_type</code> &amp; <code>drop_off_type</code></td> <td>Non-revenue (deadhead) trips that do not provide passenger service should be marked with <code>pickup_type</code> and <code>drop_off_type</code> value of <code>1</code> for all <code>stop_times</code> rows.</td> </tr> <tr> <td></td> <td>On revenue trips, internal “timing points” for monitoring operational performance and other places such as garages that a passenger cannot board should be marked with <code>pickup_type = 1</code> (no pickup available) and <code>drop_off_type = 1</code> (no drop off available).</td> </tr> <tr> <td><code>arrival_time</code> &amp; <code>departure_time</code></td> <td><code>arrival_time</code> and <code>departure_time</code> fields should specify time values whenever possible, including non-binding estimated or interpolated times between timepoints.</td> </tr> <tr> <td><code>stop_headsign</code></td> <td>In general, headsign values should also correspond to signs in the stations.<br><br>In the cases below, “Southbound” would mislead customers because it is not used in the station signs.</td> </tr> <tr> <td></td> <td><table class="example"><thead><tr><th colspan="2">In NYC, for the 2 going Southbound:</th></tr><tr><th>For <code>stop_times.txt</code> rows:</th><th>Use <code>stop_headsign</code> value:</th></tr></thead><tbody><tr><td>Until Manhattan is Reached</td><td><code>Manhattan &amp; Brooklyn</code></td></tr><tr><td>Until Downtown is Reached</td><td><code>Downtown &amp; Brooklyn</code></td></tr><tr><td>Until Brooklyn is Reached</td><td><code>Brooklyn</code></td></tr><tr><td>Once Brooklyn is Reached</td><td><code>Brooklyn (New Lots Av)</code></td></tr></tbody></table></td> </tr> <tr> <td></td> <td><table class="example"><thead><tr><th colspan="2">In Boston, for the Red Line going Southbound, for the Braintree branch:</th></tr><tr><th>For <code>stop_times.txt</code> rows:</th><th>Use <code>stop_headsign</code> value:</th></tr></thead><tbody><tr><td>Until Downtown is Reached</td><td><code>Inbound to Braintree</code></td></tr><tr><td>Once Downtown is Reached</td><td><code>Braintree</code></td></tr><tr><td>After Downtown</td><td><code>Outbound to Braintree</code></td> </tr></tbody></table></td> </tr> </tbody> </table> <h3 id="calendartxt">calendar.txt<a class="headerlink" href="#calendartxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>All Fields</td> <td>Including a <code>calendar.service_name</code> field can also increase the human readability of GTFS, although this is not adopted in the spec.</td> </tr> </tbody> </table> <h3 id="calendar_datestxt">calendar_dates.txt<a class="headerlink" href="#calendar_datestxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>All Fields</td> <td>Including a <code>calendar.service_name</code> field can also increase the human readability of GTFS, although this is not adopted in the spec.</td> </tr> </tbody> </table> <h3 id="fare_attributestxt">fare_attributes.txt<a class="headerlink" href="#fare_attributestxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td></td> <td>If a fare system cannot be accurately modeled, avoid further confusion and leave it blank.</td> </tr> <tr> <td></td> <td>Include fares (<code>fare_attributes.txt</code> and <code>fare_rules.txt</code>) and model them as accurately as possible. In edge cases where fares cannot be accurately modeled, the fare should be represented as more expensive rather than less expensive so customers will not attempt to board with insufficient fare. If the vast majority of fares cannot be modeled correctly, do not include fare information in the feed.</td> </tr> </tbody> </table> <h3 id="fare_rulestxt">fare_rules.txt<a class="headerlink" href="#fare_rulestxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>All Fields</td> <td>If a fare system cannot be accurately modeled, avoid further confusion and leave it blank.</td> </tr> <tr> <td></td> <td>Include fares (<code>fare_attributes.txt</code> and <code>fare_rules.txt</code>) and model them as accurately as possible. In edge cases where fares cannot be accurately modeled, the fare should be represented as more expensive rather than less expensive so customers will not attempt to board with insufficient fare. If the vast majority of fares cannot be modeled correctly, do not include fare information in the feed.</td> </tr> </tbody> </table> <h3 id="shapestxt">shapes.txt<a class="headerlink" href="#shapestxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>All Fields</td> <td>Ideally, for alignments that are shared (i.e. in a case where Routes 1 and 2 operate on the same segment of roadway or track) then the shared portion of alignment should match exactly. This helps to facilitate high-quality transit cartography. <!-- (77) --></td> </tr> <tr> <td></td> <td>Alignments should follow the centerline of the right of way on which the vehicle travels. This could be either the centerline of the street if there are no designated lanes, or the centerline of the side of the roadway that travels in the direction the vehicle moves. <br><br>Alignments should not “jag” to a curb stop, platform, or boarding location.</td> </tr> <tr> <td><code>shape_dist_traveled</code></td> <td>The <code>shape_dist_traveled</code> field allows the agency to specify exactly how the stops in the <code>stop_times.txt</code> file fit into their respective shape. A common value to use for the <code>shape_dist_traveled</code> field is the distance from the beginning of the shape as traveled by the vehicle (think something like an odometer reading). <li>Route alignments (in <code>shapes.txt</code>) should be within 100 meters of stop locations which a trip serves.</li><li>Simplify alignments so that <code>shapes.txt</code> does not contain extraneous points (i.e. remove extra points on straight-line segments; see discussion of line simplification problem).</li></td> </tr> </tbody> </table> <h3 id="frequenciestxt">frequencies.txt<a class="headerlink" href="#frequenciestxt" title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>All Fields</td> <td>Actual stop times are ignored for trips referenced by <code>frequencies.txt</code>; only travel time intervals between stops are significant for frequency-based trips. For clarity/human readability, it is recommended that the first stop time of a trip referenced in <code>frequencies.txt</code> should begin at 00:00:00 (first <code>arrival_time</code> value of 00:00:00).</td> </tr> <tr> <td><code>block_id</code></td> <td>Can be provided for frequency-based trips.</td> </tr> </tbody> </table> <h3 id="transferstxt">transfers.txt<a class="headerlink" href="#transferstxt" title="Permanent link">&para;</a></h3> <p><code>transfers.transfer_type</code> can be one of four values <a href="../reference/#transferstxt">defined in the GTFS</a>. These <code>transfer_type</code> definitions are quoted from the GTFS Specification below, <em>in italics</em>, with additional practice recommendations.</p> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>transfer_type</code></td> <td><q>0 or (empty): This is a recommended transfer point between routes.</q><br>If there are multiple transfer opportunities that include a superior option (i.e. a transit center with additional amenities or a station with adjacent or connected boarding facilities/platforms), specify a recommended transfer point.</td> </tr> <tr> <td></td> <td><q>1: This is a timed transfer point between two routes. The departing vehicle is expected to wait for the arriving one, with sufficient time for a passenger to transfer between routes.</q><br>This transfer type overrides a required interval to reliably make transfers. As an example, Google Maps assumes that passengers need 3 minutes to safely make a transfer. Other applications may assume other defaults.</td> </tr> <tr> <td></td> <td><q>2: This transfer requires a minimum amount of time between arrival and departure to ensure a connection. The time required to transfer is specified by <code>min_transfer_time</code>.</q><br>Specify minimum transfer time if there are obstructions or other factors which increase the time to travel between stops.</td> </tr> <tr> <td></td> <td><q>3: Transfers are not possible between routes at this location.</q><br>Specify this value if transfers are not possible because of physical barriers, or if they are made unsafe or complicated by difficult road crossings or gaps in the pedestrian network.</td> </tr> <tr> <td></td> <td>If in-seat (block) transfers are allowed between trips, then the last stop of the arriving trip must be the same as the first stop of the departing trip.</td> </tr> </tbody> </table> <h2 id="practice-recommendations-organized-by-case">Practice Recommendations Organized by Case<a class="headerlink" href="#practice-recommendations-organized-by-case" title="Permanent link">&para;</a></h2> <p>This section covers particular cases with implications across files and fields.</p> <h3 id="loop-routes">Loop Routes<a class="headerlink" href="#loop-routes" title="Permanent link">&para;</a></h3> <p>On loop routes, vehicles’ trips begin and end at the same location (sometimes a transit or transfer center). Vehicles usually operate continuously and allow passengers to stay onboard as the vehicle continues its loop.</p> <p><img src="https://raw.githubusercontent.com/MobilityData/GTFS_Schedule_Best-Practices/master/en/loop-route.svg" width="200px" style="display: block; margin-left: auto; margin-right: auto;"></p> <p>Headsigns recommendations should therefore be applied in order to show riders the direction in which the vehicle is going.</p> <p>To indicate the changing direction of travel, provide <code>stop_headsigns</code> in the <code>stop_times.txt</code> file. The <code>stop_headsign</code> describes the direction for trips departing from the stop for which it's defined. Adding <code>stop_headsigns</code> to each stop of a trip allows you to change the headsign information along a trip.</p> <p>Don’t define one single circular trip in the stop_times.txt file for a route that operates between two endpoints (such as when the same bus goes back and forth). Instead, split the trip into two separate trip directions.</p> <p><strong>Examples of circular trip modeling:</strong></p> <ul> <li>Circular trip with changing headsign for each stop</li> </ul> <table> <thead> <tr> <th>trip_id</th> <th>arrival_time</th> <th>departure_time</th> <th>stop_id</th> <th>stop_sequence</th> <th>stop_headsign</th> </tr> </thead> <tbody> <tr> <td>trip_1</td> <td>06:10:00</td> <td>06:10:00</td> <td>stop_A</td> <td>1</td> <td>"B"</td> </tr> <tr> <td>trip_1</td> <td>06:15:00</td> <td>06:15:00</td> <td>stop_B</td> <td>2</td> <td>"C"</td> </tr> <tr> <td>trip_1</td> <td>06:20:00</td> <td>06:20:00</td> <td>stop_C</td> <td>3</td> <td>"D"</td> </tr> <tr> <td>trip_1</td> <td>06:25:00</td> <td>06:25:00</td> <td>stop_D</td> <td>4</td> <td>"E"</td> </tr> <tr> <td>trip_1</td> <td>06:30:00</td> <td>06:30:00</td> <td>stop_E</td> <td>5</td> <td>"A"</td> </tr> <tr> <td>trip_1</td> <td>06:35:00</td> <td>06:35:00</td> <td>stop_A</td> <td>6</td> <td>""</td> </tr> </tbody> </table> <ul> <li>Circular trip with two headsigns</li> </ul> <table> <thead> <tr> <th>trip_id</th> <th>arrival_time</th> <th>departure_time</th> <th>stop_id</th> <th>stop_sequence</th> <th>stop_headsign</th> </tr> </thead> <tbody> <tr> <td>trip_1</td> <td>06:10:00</td> <td>06:10:00</td> <td>stop_A</td> <td>1</td> <td>"outbound"</td> </tr> <tr> <td>trip_1</td> <td>06:15:00</td> <td>06:15:00</td> <td>stop_B</td> <td>2</td> <td>"outbound"</td> </tr> <tr> <td>trip_1</td> <td>06:20:00</td> <td>06:20:00</td> <td>stop_C</td> <td>3</td> <td>"outbound"</td> </tr> <tr> <td>trip_1</td> <td>06:25:00</td> <td>06:25:00</td> <td>stop_D</td> <td>4</td> <td>"inbound"</td> </tr> <tr> <td>trip_1</td> <td>06:30:00</td> <td>06:30:00</td> <td>stop_E</td> <td>5</td> <td>"inbound"</td> </tr> <tr> <td>trip_1</td> <td>06:35:00</td> <td>06:35:00</td> <td>stop_F</td> <td>6</td> <td>"inbound"</td> </tr> <tr> <td>trip_1</td> <td>06:40:00</td> <td>06:40:00</td> <td>stop_A</td> <td>7</td> <td>""</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>trips.trip_id</code></td> <td>Model the complete round-trip for the loop with a single trip.</td> </tr> <tr> <td><code>stop_times.stop_id</code></td> <td>Include the first/last stop twice in <code>stop_times.txt</code> for the trip that is a loop. Example below. Often, a loop route may include first and last trips that do not travel the entire loop. Include these trips as well. <table class="example"><thead><tr><th><code>trip_id</code></th><th><code>stop_id</code></th><th><code>stop_sequence</code></th></tr></thead><tbody><tr><td>9000</td><td>101</td><td>1</td></tr><tr><td>9000</td><td>102</td><td>2</td></tr><tr><td>9000</td><td>103</td><td>3</td></tr><tr><td>9000</td><td>101</td><td>4</td></tr></tbody></table></td> </tr> <tr> <td><code>trips.direction_id</code></td> <td>If loop operates in opposite directions (i.e. clockwise and counterclockwise), then designate <code>direction_id</code> as <code>0</code> or <code>1</code>.</td> </tr> <tr> <td><code>trips.block_id</code></td> <td>Indicate continuous loop trips with the same <code>block_id</code>.</td> </tr> </tbody> </table> <h3 id="lasso-routes">Lasso Routes<a class="headerlink" href="#lasso-routes" title="Permanent link">&para;</a></h3> <p>Lasso routes combine aspects of a loop route and directional route.</p> <p><img src="https://raw.githubusercontent.com/MobilityData/GTFS_Schedule_Best-Practices/master/en/lasso-route.svg" width="140px" style="display: block; margin-left: auto; margin-right: auto;"></p> <table> <thead> <tr> <th>Examples:</th> </tr> </thead> <tbody> <tr> <td>Subway Routes (<a href="https://www.transitchicago.com/assets/1/6/ctamap_Lsystem.pdf" target="_blank" rel="noopener">Chicago</a>)</td> </tr> <tr> <td>Bus Suburb to Downtown Routes (<a href="https://stalbert.ca/uploads/PDF-infosheets/RideGuide-201-207_Revised_Oct_2017.pdf" target="_blank" rel="noopener">St. Albert</a> or <a href="http://webdocs.edmonton.ca/transit/route_schedules_and_maps/future/RT039.pdf" target="_blank" rel="noopener">Edmonton</a>)</td> </tr> <tr> <td>CTA Brown Line (<a href="http://www.transitchicago.com/brownline/" target="_blank" rel="noopener">CTA Website</a> and <a href="https://transitfeeds.com/p/chicago-transit-authority/165/latest/route/Brn" target="_blank" rel="noopener">TransitFeeds</a>)</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td><code>trips.trip_id</code></td> <td>The full extent of a “vehicle round-trip” (see illustration <a href="#lasso-routes">above</a>) consists of travel from A to B to B and back to A. An entire vehicle round-trip may be expressed by: <li>A <strong>single</strong> <code>trip_id</code> value/record in <code>trips.txt</code></li><li><strong>Multiple</strong> <code>trip_id</code> values/records in <code>trips.txt</code>, with continuous travel indicated by <code>block_id</code>.</li></td> </tr> <tr> <td><code>stop_times.stop_headsign</code></td> <td>The stops along the A-B section will be passed through in both directions. <code>stop_headsign</code> facilitates distinguishing travel direction. Therefore, providing <code>stop_headsign</code> is recommended for these trips.example_table: <table class="example"><thead> <tr><th>Examples:</th></tr></thead><tbody><tr><td>"A via B"</td></tr><tr><td>"A"</td></tr></tbody></table><table class="example"><thead><tr><th>Chicago Transit Authority's <a href="http://www.transitchicago.com/purpleline/" target="_blank" rel="noopener">Purple Line</a></th></tr></thead><tbody><tr><td>"Southbound to Loop"</td></tr><tr><td>"Northbound via Loop"</td></tr><tr><td>"Northbound to Linden"</td></tr></tbody></table><table class="example"><thead><tr><th>Edmonton Transit Service Bus Lines, here <a href="http://webdocs.edmonton.ca/transit/route_schedules_and_maps/future/RT039.pdf" target="_blank" rel="noopener">the 39</a></th></tr></thead><tbody><tr><td>"Rutherford"</td></tr><tr><td>"Century Park"</td></tr></tbody></table></td> </tr> <tr> <td><code>trip.trip_headsign</code></td> <td>The trip headsign should be a global description of the trip, like displayed in the schedules. Could be “Linden to Linden via Loop” (Chicago example), or “A to A via B” (generic example).</td> </tr> </tbody> </table> <h3 id="branches">Branches<a class="headerlink" href="#branches" title="Permanent link">&para;</a></h3> <p>Some routes may include branches. Alignment and stops are shared amongst these branches, but each also serves distinct stops and alignment sections. The relationship among branches may be indicated by route name(s), headsigns, and trip short name using the further guidelines below.</p> <p><img src="https://raw.githubusercontent.com/MobilityData/GTFS_Schedule_Best-Practices/master/en/branching.svg" width="250px" style="display: block; margin-left: auto; margin-right: auto;"></p> <table> <thead> <tr> <th>Field Name</th> <th>Recommendation</th> </tr> </thead> <tbody> <tr> <td>All Fields</td> <td>In naming branch routes, it is recommended to follow other passenger information materials. Below are descriptions and examples of two cases:</td> </tr> <tr> <td></td> <td>If timetables and on-street signage represent two distinctly named routes (e.g. 1A and 1B), then present this as such in the GTFS, using the <code>route_short_name</code> and/or <code>route_long_name</code> fields. Example: GoDurham Transit <a href="https://gotriangle.org/sites/default/files/brochure/godurham-route2-2a-2b_1.pdf" target="_blank" rel="noopener">routes 2, 2A, and 2B</a> share a common alignment throughout the majority of the route, but they vary in several different aspects. <ul><li>Route 2 is core service, running most hours.</li><li>Route 2 includes a deviation on Main Street nights, Sundays, and holidays.</li><li>Routes 2A and 2B operate daytime hours Monday through Saturday.</li><li>Route 2B serves additional stops in a deviation of the shared alignment path.</li></ul></td> </tr> <tr> <td></td> <td>If agency-provided information describes branches as the same named route, then utilize the <code>trips.trip_headsign</code>, <code>stop_times.stop_headsign</code>, and/or <code>trips.trip_short_name</code> fields. Example: GoTriangle <a href="https://gotriangle.org/sites/default/files/route_300_v.1.19.pdf" target="_blank" rel="noopener">route 300</a> travels to different locations depending on the time of day. During peak commuter hours extra legs are added onto the standard route to accommodate workers entering and leaving the city.</td> </tr> </tbody> </table> <h2 id="frequently-asked-questions-faq">Frequently Asked Questions (FAQ)<a class="headerlink" href="#frequently-asked-questions-faq" title="Permanent link">&para;</a></h2> <h3 id="why-are-these-gtfs-best-practices-important">Why are these GTFS Best Practices important?<a class="headerlink" href="#why-are-these-gtfs-best-practices-important" title="Permanent link">&para;</a></h3> <p>The objectives of GTFS Best Practices are:</p> <ul> <li>To improve end-user customer experience in public transportation apps</li> <li>Support broad data interoperability to make it easier for software developers to deploy and scale applications, products, and services</li> <li>Facilitate the use of GTFS in various application categories (beyond its original focus on trip planning)</li> </ul> <p>Without coordinated GTFS Best Practices, various GTFS-consuming applications may establish requirements and expectations in an uncoordinated way, which leads to diverging requirements and application-specific datasets and less interoperability. Prior to the release of the Best Practices, there was greater ambiguity and disagreement in what constitutes correctly-formed GTFS data.</p> <h3 id="how-were-they-developed-who-developed-them">How were they developed? Who developed them?<a class="headerlink" href="#how-were-they-developed-who-developed-them" title="Permanent link">&para;</a></h3> <p>These Best Practices were developed by a working group of 17 organizations involved in GTFS, including app providers &amp; data consumers, transit providers, and consultants with extensive involvement in GTFS. The working group was convened and facilitated by <a href="http://www.rmi.org/mobility" target="_blank" rel="noopener">Rocky Mountain Institute</a>.</p> <p>Working Group members voted on each Best Practice. Most Best Practices were approved by a unanimous vote. In a minority of cases, Best Practices were approved a large majority of organizations.</p> <h3 id="why-not-just-change-the-gtfs-reference">Why not just change the GTFS reference?<a class="headerlink" href="#why-not-just-change-the-gtfs-reference" title="Permanent link">&para;</a></h3> <p>Good question! The process of examining the Specification, data usage and needs did indeed trigger some changes to the Specification (see <a href="https://github.com/google/transit/pulls?q=is%3Apr+is%3Aclosed" target="_blank" rel="noopener">closed pull requests in GitHub</a>). Specification reference amendments are subject to a higher bar of scrutiny and comment than the Best Practices. Certain Best Practices are being merged into the spec based on their level of adoption and community consensus. Eventually, all GTFS Best Practices could become part of the core GTFS Reference.</p> <h3 id="how-to-check-for-conformance-with-these-best-practices">How to check for conformance with these Best Practices?<a class="headerlink" href="#how-to-check-for-conformance-with-these-best-practices" title="Permanent link">&para;</a></h3> <p>The Canonical GTFS Schedule Validator checks for compliance against these Best Practices. You can find more about this validation tool on the <a href="../../../getting-started/validate">validate page</a>.</p> <h3 id="i-represent-a-transit-agency-what-steps-can-i-take-so-that-our-software-service-providers-and-vendors-follow-these-best-practices">I represent a transit agency. What steps can I take so that our software service providers and vendors follow these Best Practices?<a class="headerlink" href="#i-represent-a-transit-agency-what-steps-can-i-take-so-that-our-software-service-providers-and-vendors-follow-these-best-practices" title="Permanent link">&para;</a></h3> <p>Refer your vendor or software service provider to these Best Practices. We recommend referencing the GTFS Best Practices URL, as well as core Spec Reference in procurement for GTFS-producing software.</p> <h3 id="what-should-i-do-if-i-notice-a-gtfs-data-feed-does-not-conform-to-these-best-practices">What should I do if I notice a GTFS data feed does not conform to these Best Practices?<a class="headerlink" href="#what-should-i-do-if-i-notice-a-gtfs-data-feed-does-not-conform-to-these-best-practices" title="Permanent link">&para;</a></h3> <p>Identify the contact for the feed, using the <a href="https://github.com/google/transit/pull/31/files" target="_blank" rel="noopener">proposed feed_contact_email or feed_contact_url</a> fields in <em>feed_info.txt</em> if they exist, or looking up contact information on the transit agency or feed producer website. When communicating the issue to the feed producer, link to the specific GTFS Best Practice under discussion. (See <a href="#linking-to-this-document">"Linking to this Document"</a>).</p> <h3 id="how-do-i-get-involved">How do I get involved?<a class="headerlink" href="#how-do-i-get-involved" title="Permanent link">&para;</a></h3> <p>Email <a href="mailto:specifications@mobilitydata.org">specifications@mobilitydata.org</a>.</p> <h2 id="about-this-document">About This Document<a class="headerlink" href="#about-this-document" title="Permanent link">&para;</a></h2> <h3 id="objectives">Objectives<a class="headerlink" href="#objectives" title="Permanent link">&para;</a></h3> <p>The objectives of maintaining GTFS Best Practices is to:</p> <ul> <li>Support greater interoperability of transit data</li> <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> <li>Facilitate the use of GTFS in various application categories (beyond its original focus on trip planning)</li> </ul> <h3 id="how-to-propose-or-amend-published-gtfs-best-practices">How to propose or amend published GTFS Best Practices<a class="headerlink" href="#how-to-propose-or-amend-published-gtfs-best-practices" title="Permanent link">&para;</a></h3> <p>The Best Practices are in the process of being merged into the spec. If you'd like to suggest a new best practice, please go to the <a href="https://github.com/google/transit/" target="_blank" rel="noopener">GTFS Reference GitHub repository</a> to open an issue or create a PR, or contact <a href="mailto:specifications@mobilitydata.org">specifications@mobilitydata.org</a>.</p> <h3 id="linking-to-this-document">Linking to This Document<a class="headerlink" href="#linking-to-this-document" title="Permanent link">&para;</a></h3> <p>Please link here in order to provide feed producers with guidance for correct formation of GTFS 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-consuming application makes requirements or recommendations for GTFS 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> <h3 id="gtfs-best-practices-working-group">GTFS Best Practices Working Group<a class="headerlink" href="#gtfs-best-practices-working-group" title="Permanent link">&para;</a></h3> <p>The GTFS Best Practices Working Group was convened by <a href="http://rmi.org/" target="_blank" rel="noopener">Rocky Mountain Institute</a> in 2016-17, consisting of public transportation providers, developers of GTFS-consuming applications, consultants, and academic organizations to define common practices and expectations for GTFS data. Members of this working group included:</p> <ul> <li><a href="https://www.camsys.com/" target="_blank" rel="noopener">Cambridge Systematics</a></li> <li><a href="https://www.capmetro.org/" target="_blank" rel="noopener">Capital Metro</a></li> <li><a href="https://www.cutr.usf.edu/" target="_blank" rel="noopener">Center for Urban Transportation Research at University of South Florida</a></li> <li><a href="http://conveyal.com/" target="_blank" rel="noopener">Conveyal</a></li> <li><a href="https://www.google.com/" target="_blank" rel="noopener">Google</a></li> <li><a href="http://www.ibigroup.com/" target="_blank" rel="noopener">IBI Group</a></li> <li><a href="https://mapzen.com/" target="_blank" rel="noopener">Mapzen</a></li> <li><a href="https://www.microsoft.com/" target="_blank" rel="noopener">Microsoft</a></li> <li><a href="https://www.moovel.com/" target="_blank" rel="noopener">Moovel</a></li> <li><a href="http://www.oregon.gov/odot/" target="_blank" rel="noopener">Oregon Department of Transportation</a></li> <li><a href="https://goswift.ly/" target="_blank" rel="noopener">Swiftly</a></li> <li><a href="https://transitapp.com/" target="_blank" rel="noopener">Transit</a></li> <li><a href="http://trilliumtransit.com/" target="_blank" rel="noopener">Trillium</a></li> <li><a href="https://trimet.org/" target="_blank" rel="noopener">TriMet</a></li> <li><a href="http://www.worldbank.org/" target="_blank" rel="noopener">World Bank</a></li> </ul> <p>Today, this document is maintained by <a href="http://mobilitydata.org/" target="_blank" rel="noopener">MobilityData</a>.</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.6.0 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.6.0 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.6.0 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.6.0 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>

Pages: 1 2 3 4 5 6 7 8 9 10