CINXE.COM
Transitland APIs - query, analyze, visualize - Interline Technologies
<!DOCTYPE html> <html lang="en" data-color-scheme="system" class="scroll-smooth"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Transitland APIs - query, analyze, visualize - Interline Technologies</title> <meta name="HandheldFriendly" content="True" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="theme-color" content="#F3A556"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preload stylesheet" href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300..800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" crossorigin> <style>body { --font-headings: 'DM Sans', sans-serif; }</style> <style>body { --font-body: 'DM Sans', sans-serif; }</style> <script type="module" src="https://www.interline.io/assets/built/app.js?v=5934dd6b63"></script> <link rel="stylesheet" type="text/css" href="https://www.interline.io/assets/built/app.css?v=5934dd6b63" /> <script> let preferredTheme = localStorage.getItem('PREFERRED_COLOR_SCHEME') || `system`; document.documentElement.setAttribute('data-color-scheme', preferredTheme); // Global values needed const themeGlobal = { siteUrl: 'https://www.interline.io', currentPage: parseInt(''), nextPage: parseInt(''), nextPageLink: '', maxPages: parseInt(''), lastPage: `` === `` ? true : false, postsPerPage: parseInt('12'), total: parseInt(''), searchJobsFeaturedFirst: false } function hexToRgb(hexColor) { if (hexColor.slice(0, 1) === '#') { hexColor = hexColor.slice(1); } if (hexColor.length === 3) { hexColor = hexColor.split('').map(function (hex) { return hex + hex;}).join(''); } const r = parseInt(hexColor.substr(0,2),16); const g = parseInt(hexColor.substr(2,2),16); const b = parseInt(hexColor.substr(4,2),16); return [r,g,b] } // Get contrast color; function getColorContrast(hexColor) { const rgb = hexToRgb(hexColor); let yiq = ((rgb[0] * 299) + (rgb[1] * 587) + (rgb[2] * 114)) / 1000; const colorContrast = (yiq >= 128) ? 'hsl(0 0% 0%)' : 'hsl(0 0% 100%)'; // return return colorContrast }; function hexToHsl(hexColor) { const rgb = hexToRgb(hexColor); // Make r, g, and b fractions of 1 const r = rgb[0]/255; const g = rgb[1]/255; const b = rgb[2]/255; const max = Math.max(r, g, b), min = Math.min(r, g, b); let h, s, l = (max + min) / 2; if ( max == min ) { h = s = 0; } else { let d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch(max){ case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return [Math.round(h * 360),Math.round(s * 100),Math.round(l * 100)] } function setBrandHSL(hex) { const colorHsl = hexToHsl(hex) document.documentElement.style.setProperty('--color-brand-hsl', `${colorHsl[0]} ${colorHsl[1]}% ${colorHsl[2]}%`); document.documentElement.style.setProperty('--color-brand-contrast', getColorContrast(hex)); } setBrandHSL("#F3A556"); </script> <meta name="description" content="Use the Transitland platform to access thousands of GTFS and GTFS Realtime feeds. Build apps, websites, maps, visualizations, and analyses."> <link rel="icon" href="https://www.interline.io/content/images/2024/09/favicon.ico" type="image/x-icon"> <link rel="canonical" href="https://www.interline.io/transitland/apis-for-developers/"> <meta name="referrer" content="no-referrer-when-downgrade"> <meta property="og:site_name" content="Interline Technologies"> <meta property="og:type" content="website"> <meta property="og:title" content="Transitland APIs - query, analyze, visualize"> <meta property="og:description" content="Use the Transitland platform to access thousands of GTFS and GTFS Realtime feeds. Build apps, websites, maps, visualizations, and analyses."> <meta property="og:url" content="https://www.interline.io/transitland/apis-for-developers/"> <meta property="article:modified_time" content="2024-09-03T23:24:41.000Z"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="Transitland APIs - query, analyze, visualize"> <meta name="twitter:description" content="Use the Transitland platform to access thousands of GTFS and GTFS Realtime feeds. Build apps, websites, maps, visualizations, and analyses."> <meta name="twitter:url" content="https://www.interline.io/transitland/apis-for-developers/"> <meta name="twitter:label1" content="Written by"> <meta name="twitter:data1" content="Drew Dara-Abrams"> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "publisher": { "@type": "Organization", "name": "Interline Technologies", "url": "https://www.interline.io/", "logo": { "@type": "ImageObject", "url": "https://www.interline.io/content/images/2023/10/Interline-logo-full-1.png" } }, "author": { "@type": "Person", "name": "Drew Dara-Abrams", "image": { "@type": "ImageObject", "url": "https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s=250&r=x&d=mp", "width": 250, "height": 250 }, "sameAs": [] }, "headline": "Transitland APIs - query, analyze, visualize", "url": "https://www.interline.io/transitland/apis-for-developers/", "dateModified": "2024-09-03T23:24:41.000Z", "description": "Transitland is an open-data platform built on thousands of public-transit data feeds from around the world. We started Transitland in 2014 and continue to expand the platform. It’s now the largest and most feature-rich GTFS and GTFS Realtime aggregator. Transitland is the ideal solution for using data from many transit operators in web or mobile apps, maps, data visualizations, GIS analyses, and travel demand models.\n\n💡Transitland APIs are ideal for powering clients that query for data as neede", "mainEntityOfPage": "https://www.interline.io/transitland/apis-for-developers/" } </script> <meta name="generator" content="Ghost 5.101"> <link rel="alternate" type="application/rss+xml" title="Interline Technologies" href="https://www.interline.io/blog/rss/"> <script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.5/umd/sodo-search.min.js" data-key="7afadadffdaf89f0b9d751f7f4" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.5/umd/main.css" data-sodo-search="https://interline.ghost.io/" data-locale="en" crossorigin="anonymous"></script> <link href="https://www.interline.io/webmentions/receive/" rel="webmention"> <script defer src="/public/cards.min.js?v=5934dd6b63"></script><style>:root {--ghost-accent-color: #F3A556;}</style> <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=5934dd6b63"> <meta name="fediverse:creator" content="@interline@mastodon.social"> <script defer data-domain="interline.io" src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js"></script> <script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script> <style> footer .is-subitem { margin-left: 1.25em !important; font-weight: lighter !important; } </style> </head> <body class="page-template page-transitland-apis-for-developers subpixel-antialiased relative overflow-x-hidden bg-bgr text-typ" x-data="{ menuOpen: false }" :class="menuOpen ? 'overflow-hidden' : 'overflow-y-auto'" data-user="visitor" @keydown.escape="menuOpen = false" @keydown.cmk.k="document.querySelector('[data-ghost-search]').click()" x-init="navigator.platform.includes('Win') && document.body.classList.add('is-win')" > <header class="px-4 sm:px-6 text-typ whitespace-nowrap sticky top-0 z-[1000] bg-bgr lg:bg-transparent" data-header x-init="renderSubmenus();window.pageYOffset > 50 ? isScrolledOnload = true : null" x-data="{ isScrolled: false, isScrolledOnload: false }" @scroll.window="isScrolled = (window.pageYOffset < 50) ? false : true;window.pageYOffset <= 50 ? isScrolledOnload = false : null" :class="[isScrolled ? 'is-scrolled' : '',isScrolledOnload ? 'is-scrolled-onload' : '']"> <div class="max-w-container mx-auto py-4 md:py-6 flex items-center justify-center gap-4 relative before:content-[''] before:absolute before:bottom-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="flex-1 flex justify-start lg:transition-move duration-300" data-header-brand> <a class="" href="https://www.interline.io" data-brand> <picture data-logo='dark'> <source srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)]" loading="eager" srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2024/11/interline-logo-white-on-transparent-2.png" alt="Interline Technologies" /> </picture> <picture data-logo='default'> <source srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)]" loading="eager" srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2023/10/Interline-logo-full-1.png" alt="Interline Technologies" /> </picture> </a> </div> <nav class="relative hidden transition-[width,filter] duration-300 text-sm lg:flex justify-center p-1 border border-brd rounded-theme-lg bg-bgr-opac backdrop-blur" data-nav="desktop" :class="isScrolled ? 'drop-shadow-xl' : ''"> <ul class="flex gap-0.5"> <li class="nav-transitland-platform nav-current-parent flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="Transitland Platform" data-slug="transitland-platform" data-length="20"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/" > <span>Transitland Platform</span> </a> </li> <li class="nav-intro-to-transitland nav-current-parent flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Intro to Transitland" data-slug="intro-to-transitland" data-length="22"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/" > <span>- Intro to Transitland</span> </a> </li> <li class="nav-transitland-apis-for-developers nav-current flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Transitland APIs for Developers" data-slug="transitland-apis-for-developers" data-length="33"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/apis-for-developers/" > <span>- Transitland APIs for Developers</span> </a> </li> <li class="nav-custom-bulk-transit-data-exports flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Custom Bulk Transit Data Exports" data-slug="custom-bulk-transit-data-exports" data-length="34"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/custom-bulk-transit-data/" > <span>- Custom Bulk Transit Data Exports</span> </a> </li> <li class="nav-all-stops-in-the-united-states flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- All Stops in the United States" data-slug="all-stops-in-the-united-states" data-length="32"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/all-us-stops-bulk-data/" > <span>- All Stops in the United States</span> </a> </li> <li class="nav-compare-transitland flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Compare Transitland" data-slug="compare-transitland" data-length="21"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/compare/" > <span>- Compare Transitland</span> </a> </li> <li class="nav-transitland-plans-pricing flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Transitland Plans & Pricing" data-slug="transitland-plans-pricing" data-length="30"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.transit.land/plans-pricing/" > <span>- Transitland Plans & Pricing</span> </a> </li> <li class="nav-interline-routing-platform flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="Interline Routing Platform" data-slug="interline-routing-platform" data-length="26"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/routing-platform/" > <span>Interline Routing Platform</span> </a> </li> <li class="nav-intro-to-valhalla flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Intro to Valhalla" data-slug="intro-to-valhalla" data-length="19"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/valhalla/" > <span>- Intro to Valhalla</span> </a> </li> <li class="nav-valhalla-tilepacks flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Valhalla Tilepacks" data-slug="valhalla-tilepacks" data-length="20"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/valhalla/tilepacks/" > <span>- Valhalla Tilepacks</span> </a> </li> <li class="nav-global-hosted-valhalla-apis flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Global Hosted Valhalla APIs" data-slug="global-hosted-valhalla-apis" data-length="29"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://rapidapi.com/interline-technologies-interline-technologies-default/api/interline-global-valhalla-navigation-and-routing-engine/" > <span>- Global Hosted Valhalla APIs</span> </a> </li> <li class="nav-transitland-routing-api flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Transitland Routing API" data-slug="transitland-routing-api" data-length="25"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.transit.land/documentation/routing-api/" > <span>- Transitland Routing API</span> </a> </li> <li class="nav-resources flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="Resources" data-slug="resources" data-length="9"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/resources/" > <span>Resources</span> </a> </li> <li class="nav-blog flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Blog" data-slug="blog" data-length="6"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/blog/" > <span>- Blog</span> </a> </li> <li class="nav-consulting flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Consulting" data-slug="consulting" data-length="12"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/consulting/" > <span>- Consulting</span> </a> </li> <li class="nav-applied-research flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Applied Research" data-slug="applied-research" data-length="18"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/resources/applied-research/" > <span>- Applied Research</span> </a> </li> <li class="nav-osm-extracts flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- OSM Extracts" data-slug="osm-extracts" data-length="14"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://app.interline.io/osm_extracts/interactive_view" > <span>- OSM Extracts</span> </a> </li> <li class="nav-about-interline flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="About Interline" data-slug="about-interline" data-length="15"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/about/" > <span>About Interline</span> </a> </li> </ul> </nav> <div class="flex flex-0 sm:flex-1 gap-2 items-center justify-end transition-move duration-300" data-header-actions> <button class="flex flex-col gap-1.5 size-8 md:size-9 items-center justify-center rounded-theme group hover:text-brand lg:hidden" data-menu-toggle aria-label="Menu toggle" aria-expanded="false" aria-haspopup="true" aria-controls="menu" @click="menuOpen = !menuOpen; event.currentTarget.setAttribute('aria-expanded', menuOpen);" > <span class="relative pointer-events-none w-5 h-0.5 rounded-sm bg-typ-tone group-hover:bg-brand transition-all" :class="menuOpen ? 'rotate-45 top-1' : 'rotate-0 top-0'"></span> <span class="relative pointer-events-none w-5 h-0.5 rounded-sm bg-typ-tone group-hover:bg-brand transition-all" :class="menuOpen ? '-rotate-45 -top-1' : ''"></span> </button> </div> </div> </header> <div class="fixed shadow-xl z-[100] top-[64px] md:top-[84px] w-full bg-bgr text-typ-tone pt-4 border-t border-brd lg:hidden fixed" :class="menuOpen ? 'block' : 'hidden'" data-menu id="menu" > <div class="px-4 sm:px-6"> <nav class="" data-nav="mobile"> <ul class="flex flex-col gap-1"> <li class="nav-transitland-platform nav-current-parent flex relative" data-label="Transitland Platform" data-slug="transitland-platform" data-length="20"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/" > <span>Transitland Platform</span> </a> </li> <li class="nav-intro-to-transitland nav-current-parent flex relative is-subitem" data-label="- Intro to Transitland" data-slug="intro-to-transitland" data-length="22"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/" > <span>- Intro to Transitland</span> </a> </li> <li class="nav-transitland-apis-for-developers nav-current flex relative is-subitem" data-label="- Transitland APIs for Developers" data-slug="transitland-apis-for-developers" data-length="33"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/apis-for-developers/" > <span>- Transitland APIs for Developers</span> </a> </li> <li class="nav-custom-bulk-transit-data-exports flex relative is-subitem" data-label="- Custom Bulk Transit Data Exports" data-slug="custom-bulk-transit-data-exports" data-length="34"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/custom-bulk-transit-data/" > <span>- Custom Bulk Transit Data Exports</span> </a> </li> <li class="nav-all-stops-in-the-united-states flex relative is-subitem" data-label="- All Stops in the United States" data-slug="all-stops-in-the-united-states" data-length="32"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/all-us-stops-bulk-data/" > <span>- All Stops in the United States</span> </a> </li> <li class="nav-compare-transitland flex relative is-subitem" data-label="- Compare Transitland" data-slug="compare-transitland" data-length="21"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/compare/" > <span>- Compare Transitland</span> </a> </li> <li class="nav-transitland-plans-pricing flex relative is-subitem" data-label="- Transitland Plans & Pricing" data-slug="transitland-plans-pricing" data-length="30"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.transit.land/plans-pricing/" > <span>- Transitland Plans & Pricing</span> </a> </li> <li class="nav-interline-routing-platform flex relative" data-label="Interline Routing Platform" data-slug="interline-routing-platform" data-length="26"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/routing-platform/" > <span>Interline Routing Platform</span> </a> </li> <li class="nav-intro-to-valhalla flex relative is-subitem" data-label="- Intro to Valhalla" data-slug="intro-to-valhalla" data-length="19"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/valhalla/" > <span>- Intro to Valhalla</span> </a> </li> <li class="nav-valhalla-tilepacks flex relative is-subitem" data-label="- Valhalla Tilepacks" data-slug="valhalla-tilepacks" data-length="20"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/valhalla/tilepacks/" > <span>- Valhalla Tilepacks</span> </a> </li> <li class="nav-global-hosted-valhalla-apis flex relative is-subitem" data-label="- Global Hosted Valhalla APIs" data-slug="global-hosted-valhalla-apis" data-length="29"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://rapidapi.com/interline-technologies-interline-technologies-default/api/interline-global-valhalla-navigation-and-routing-engine/" > <span>- Global Hosted Valhalla APIs</span> </a> </li> <li class="nav-transitland-routing-api flex relative is-subitem" data-label="- Transitland Routing API" data-slug="transitland-routing-api" data-length="25"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.transit.land/documentation/routing-api/" > <span>- Transitland Routing API</span> </a> </li> <li class="nav-resources flex relative" data-label="Resources" data-slug="resources" data-length="9"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/resources/" > <span>Resources</span> </a> </li> <li class="nav-blog flex relative is-subitem" data-label="- Blog" data-slug="blog" data-length="6"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/blog/" > <span>- Blog</span> </a> </li> <li class="nav-consulting flex relative is-subitem" data-label="- Consulting" data-slug="consulting" data-length="12"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/consulting/" > <span>- Consulting</span> </a> </li> <li class="nav-applied-research flex relative is-subitem" data-label="- Applied Research" data-slug="applied-research" data-length="18"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/resources/applied-research/" > <span>- Applied Research</span> </a> </li> <li class="nav-osm-extracts flex relative is-subitem" data-label="- OSM Extracts" data-slug="osm-extracts" data-length="14"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://app.interline.io/osm_extracts/interactive_view" > <span>- OSM Extracts</span> </a> </li> <li class="nav-about-interline flex relative" data-label="About Interline" data-slug="about-interline" data-length="15"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/about/" > <span>About Interline</span> </a> </li> </ul> </nav> </div> <div class="p-4 mt-4 flex gap-2 border-y border-brd"> <button class="flex gap-0.5 p-[3px] border border-brd text-typ-tone rounded-theme hover:bg-bgr-tone" aria-label="Toggle color scheme" data-color-scheme-toggle @click="toggleColorScheme(event)"> <span data-theme="light" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-sun size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> <span data-theme="dark" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-moon size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> </button> </div> </div> <main class="main"> <section class="px-4 sm:px-6" data-post-hero=""> <div class="max-w-wide mx-auto py-12 flex items-center flex-col gap-8 md:flex-wrap md:flex-row md:items-end mb-12 relative before:content-[''] before:absolute before:bottom-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="text-typ-tone w-full flex-1 flex flex-col gap-4 mx-auto max-w-wide flex-[2]" data-post-hero-content> <h1 class="text-typ font-semibold tracking-tight text-2xl md:text-3xl lg:text-4xl xl:text-5xl"> Transitland APIs for Developers </h1> </div> </div> </section> <section class="max-w-wide mx-auto flex flex-col gap-6 lg:flex-row" data-post-content> <aside class="px-4 md:px-0 w-full max-w-content mx-auto lg:max-w-xs" data-toc x-init="$nextTick(() => { renderTOC('h2,h3,h4') })"> <div class="sticky border-b border-brd pb-2 mb-8 lg:border-none top-[92px]" x-data="{ tocOpen: false }" > <button class="w-full text-xs lg:text-[0.8rem] uppercase text-typ-tone font-semibold border border-brd px-6 py-2 mb-2 flex items-center justify-center gap-2 rounded-theme hover:bg-bgr-tone lg:border-none lg:px-2.5 lg:py-1 lg:cursor-text lg:hover:bg-bgr lg:justify-start" :data-toc-toggle="tocOpen ? 'active' : 'inactive'" aria-label="Table of Contents" @click="tocOpen = !tocOpen"> <span class="mt-[1px]">Table of Contents</span> <i class="icon icon-plus size-[14px] stroke-[2.5] hidden lg:invisible stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-plus" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 5l0 14" /><path d="M5 12l14 0" /></svg> </i> <i class="icon icon-minus size-[14px] stroke-[2.5] hidden lg:invisible stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-minus" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 12l14 0" /></svg> </i> </button> <div data-toc-content class="text-typ-tone text-sm lg:text-[0.95rem] lg:block" :class="tocOpen ? 'block' : 'hidden'"> </div> </div> </aside> <article class="ghost-content prose md:prose-lg prose-theme lg:flex-1" data-no-overflow> <p>Transitland is an open-data platform built on thousands of public-transit data feeds from around the world. We started Transitland in 2014 and continue to expand the platform. It’s now the largest and most feature-rich GTFS and GTFS Realtime aggregator. Transitland is the ideal solution for using data from many transit operators in web or mobile apps, maps, data visualizations, GIS analyses, and travel demand models.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">Transitland APIs are ideal for powering clients that query for data as needed. If you are analyzing transit data at large scales, see also Interline’s <a href="https://www.interline.io/transitland/custom-bulk-transit-data/" rel="noreferrer">custom bulk transit data services</a>.</div></div><h2 id="features">Features</h2><div class="kg-card kg-product-card"> <div class="kg-product-card-container"> <img src="https://www.interline.io/content/images/2024/09/transitland-operator-list.png" width="2824" height="2656" class="kg-product-card-image" loading="lazy"> <div class="kg-product-card-title-container"> <h4 class="kg-product-card-title"><span style="white-space: pre-wrap;">2,000+ source feeds</span></h4> </div> <div class="kg-product-card-description"><p><span style="white-space: pre-wrap;">Transitland aggregates from thousand of GTFS and GTFS Realtime feeds around the world, fetching new feed versions, validating, and importing on a daily basis. All are welcome to add to the Transitland Atlas feed registry.</span></p></div> <a href="https://www.transit.land/operators?ref=interline.io" class="kg-product-card-button kg-product-card-btn-accent" target="_blank" rel="noopener noreferrer"><span>See the current list</span></a> </div> </div><div class="kg-card kg-product-card"> <div class="kg-product-card-container"> <img src="https://www.interline.io/content/images/2024/09/transitland-global-map.png" width="2824" height="2656" class="kg-product-card-image" loading="lazy"> <div class="kg-product-card-title-container"> <h4 class="kg-product-card-title"><span style="white-space: pre-wrap;">Global transit map</span></h4> </div> <div class="kg-product-card-description"><p><span style="white-space: pre-wrap;">Transitland includes buses, trains, subways, and ferries across over 50 countries. Pan and zoom across Transitland’s global transit map to view routes and stops, or use the v2 Vector Tile API to build your own.</span></p></div> <a href="https://www.transit.land/map?ref=interline.io" class="kg-product-card-button kg-product-card-btn-accent" target="_blank" rel="noopener noreferrer"><span>Explore the Transitland global transit map</span></a> </div> </div><div class="kg-card kg-product-card"> <div class="kg-product-card-container"> <img src="https://www.interline.io/content/images/2024/09/transitland-what-is-a-onestop-id.png" width="2232" height="2026" class="kg-product-card-image" loading="lazy"> <div class="kg-product-card-title-container"> <h4 class="kg-product-card-title"><span style="white-space: pre-wrap;">Unique Onestop IDs</span></h4> </div> <div class="kg-product-card-description"><p><span style="white-space: pre-wrap;">When using feeds from multiple operators, IDs often clash. Unexpected conflicts can also occur when using multiple versions over time from the same operator. Transitland solves this problem with the Onestop ID. Onestop IDs are globally unique. Each Onestop ID provides just enough information to look up a feed, an operator, a stop/station, or a route. Onestop IDs are used across the Transitland Atlas, the Transitland v1 and v2 APIs, and the Transitland website. Many developers and analysts also use Onestop IDs within their own apps and datasets to associate their records with Transitland.</span></p></div> <a href="https://www.transit.land/documentation/onestop-id-scheme/?ref=interline.io" class="kg-product-card-button kg-product-card-btn-accent" target="_blank" rel="noopener noreferrer"><span>Read Onestop ID documentation</span></a> </div> </div><div class="kg-card kg-product-card"> <div class="kg-product-card-container"> <img src="https://www.interline.io/content/images/2024/09/transitland-rest-api-docs.png" width="3204" height="3954" class="kg-product-card-image" loading="lazy"> <div class="kg-product-card-title-container"> <h4 class="kg-product-card-title"><span style="white-space: pre-wrap;">Powerful REST API</span></h4> </div> <div class="kg-product-card-description"><p><span style="white-space: pre-wrap;">The Transitland v2 platform features a new REST API that is fast, flexible, and reliable. Search across Transitland’s contents using a wide range of query options. Quickly page through results.</span></p><p><span style="white-space: pre-wrap;">The v2 REST API outputs JSON, GeoJSON, and static PNG images (to generate maps of operator service areas, routes, and stops.</span></p></div> <a href="https://www.transit.land/documentation/rest-api/?ref=interline.io" class="kg-product-card-button kg-product-card-btn-accent" target="_blank" rel="noopener noreferrer"><span>Read Transitland REST API documentation</span></a> </div> </div><h2 id="questions-answers">Questions & Answers</h2><div class="kg-card kg-toggle-card" data-kg-toggle-state="close"> <div class="kg-toggle-heading"> <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">We have our own software for ingesting GTFS feeds. What advantages does Transitland provide?</span></h4> <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content"> <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path> </svg> </button> </div> <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Most transit operators create their own GTFS feeds with little awareness of how their feeds may — or may not — work with other operators’ feeds.</span></p><p><span style="white-space: pre-wrap;">Transitland is designed specifically to support thousands of transit operators providing overlapping and interconnected service. Onestop IDs are globally unique and prevent data from different operators from clashing, even if operators use similar internal IDs. Transitland’s import workflows, database schemas, and APIs are all tuned to handle many large feeds in parallel. Interline staff and partners maintain the Transitland Atlas feed registry.</span></p><p><span style="white-space: pre-wrap;">If you are only working with one or two GTFS feeds, your own software may be simplest — if you aim to work with more, the full package of the Transitland platform is both easier and more powerful.</span></p></div> </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close"> <div class="kg-toggle-heading"> <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Can we run our own copy of Transitland?</span></h4> <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content"> <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path> </svg> </button> </div> <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Yes. We re-designed </span><a href="https://www.transit.land/news/2019/10/17/tlv2?ref=interline.io"><span style="white-space: pre-wrap;">Transitland v2</span></a><span style="white-space: pre-wrap;"> from the ground up to be modular. This flexibility allows Transitland to be customized and re-deployed. Interline runs custom versions of the Transitland platform for clients as part of their GTFS production infrastructure, as well as for clients who use their Transitland deployment to aggregate and consume GTFS. </span><a href="https://www.interline.io/about/#contact" rel="noreferrer"><span style="white-space: pre-wrap;">Contact us</span></a><span style="white-space: pre-wrap;"> to learn about how we can customize and re-deploy Transitland for your organization’s needs.</span></p></div> </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close"> <div class="kg-toggle-heading"> <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Can you answer my technical question about the Transitland APIs, software components, algorithms, data, or a related topic?</span></h4> <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content"> <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path> </svg> </button> </div> <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">First, please see the </span><a href="https://www.transit.land/documentation?ref=interline.io"><span style="white-space: pre-wrap;">Transitland documentation</span></a><span style="white-space: pre-wrap;">.</span></p><p><span style="white-space: pre-wrap;">If you are on a paid plan, </span><a href="https://app.interline.io/users/sign_in?ref=interline.io"><span style="white-space: pre-wrap;">sign into your Interline account</span></a><span style="white-space: pre-wrap;"> to file a support ticket.</span></p><p><span style="white-space: pre-wrap;">If you are on a free plan, please use the </span><a href="https://github.com/transitland/transitland/discussions?ref=interline.io"><span style="white-space: pre-wrap;">Transitland discussion board at GitHub</span></a><span style="white-space: pre-wrap;">, where we welcome questions (and answers) from all.</span></p></div> </div><h2 id="plans-pricing">Plans & Pricing</h2><p>Ready to use Transitland APIs for developers? View the <a href="https://www.interline.io/transitland/plans-pricing/#transitland-apis" rel="noreferrer">Transitland API plans and pricing</a>.</p> </article> </section> </main> <footer class="px-4 sm:px-6 bg-bgr mt-16" data-footer> <div class="max-w-container mx-auto relative before:content-[''] before:absolute before:top-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4 py-8 md:gap-8 md:py-12"> <div class="flex flex-col items-start gap-3 col-span-2 md:col-span-1 lg:col-span-2" data-footer-brand> <a href="https://www.interline.io" data-brand> <picture data-logo='dark'> <source srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2024/11/interline-logo-white-on-transparent-2.png" alt="Interline Technologies" /> </picture> <picture data-logo='default'> <source srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2023/10/Interline-logo-full-1.png" alt="Interline Technologies" /> </picture> </a> <p class="text-typ-tone">We're a product and consulting business that helps organizations understand and improve transportation networks, digitally.</p> <nav class="flex items-center gap-2 text-typ-tone text-base" data-socials="footer" x-data="socials"> <a :href="rss" :class="rss && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="RSS"><i class="icon icon-rss w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-rss" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <circle cx="5" cy="19" r="1" /> <path d="M4 4a16 16 0 0 1 16 16" /> <path d="M4 11a9 9 0 0 1 9 9" /> </svg> </i><span class="sr-only">RSS</span></a> <a :href="threads" :class="threads && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Threads"><i class="icon icon-threads w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-threads"> <path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M19 7.5c-1.333 -3 -3.667 -4.5 -7 -4.5c-5 0 -8 2.5 -8 9s3.5 9 8 9s7 -3 7 -5s-1 -5 -7 -5c-2.5 0 -3 1.25 -3 2.5c0 1.5 1 2.5 2.5 2.5c2.5 0 3.5 -1.5 3.5 -5s-2 -4 -3 -4s-1.833 .333 -2.5 1" /> </svg> </i><span class="sr-only">Threads</span></a> <a :href="linkedin" :class="linkedin && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Linkedin"><i class="icon icon-linkedin w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-linkedin" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path> <rect x="2" y="9" width="4" height="12"></rect> <circle cx="4" cy="4" r="2"></circle> </svg> </i><span class="sr-only">Linkedin</span></a> <a :href="discord" :class="discord && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Discord"><i class="icon icon-discord w-4 h-4 stroke-2 stroke-2"> </i><span class="sr-only">Discord</span></a> <a :href="github" :class="github && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Github"><i class="icon icon-github w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-github</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /> </svg> </i><span class="sr-only">Github</span></a> <a :href="instagram" :class="instagram && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Instagram"><i class="icon icon-instagram w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-instagram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-instagram</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <rect x="4" y="4" width="16" height="16" rx="4" /> <circle cx="12" cy="12" r="3" /> <line x1="16.5" y1="7.5" x2="16.5" y2="7.501" /> </svg> </i><span class="sr-only">Instagram</span></a> <a :href="pinterest" :class="pinterest && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Pinterest"><i class="icon icon-pinterest w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-pinterest" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <line x1="8" y1="20" x2="12" y2="11" /> <path d="M10.7 14c.437 1.263 1.43 2 2.55 2c2.071 0 3.75 -1.554 3.75 -4a5 5 0 1 0 -9.7 1.7" /> <circle cx="12" cy="12" r="9" /> </svg> </i><span class="sr-only">Pinterest</span></a> <a :href="reddit" :class="reddit && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Reddit"><i class="icon icon-reddit w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-reddit" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 8c2.648 0 5.028 .826 6.675 2.14a2.5 2.5 0 0 1 2.326 4.36c0 3.59 -4.03 6.5 -9 6.5c-4.875 0 -8.845 -2.8 -9 -6.294l-1 -.206a2.5 2.5 0 0 1 2.326 -4.36c1.646 -1.313 4.026 -2.14 6.674 -2.14z" /> <path d="M12 8l1 -5l6 1" /> <circle cx="19" cy="4" r="1" /> <circle cx="9" cy="13" r=".5" fill="currentColor" /> <circle cx="15" cy="13" r=".5" fill="currentColor" /> <path d="M10 17c.667 .333 1.333 .5 2 .5s1.333 -.167 2 -.5" /> </svg> </i><span class="sr-only">Reddit</span></a> <a :href="telegram" :class="telegram && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Telegram"><i class="icon icon-telegram w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-telegram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-telegram</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4" /> </svg> </i><span class="sr-only">Telegram</span></a> <a :href="tiktok" :class="tiktok && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Tiktok"><i class="icon icon-tiktok w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-tiktok" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-tiktok</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M9 12a4 4 0 1 0 4 4v-12a5 5 0 0 0 5 5" /> </svg> </i><span class="sr-only">Tiktok</span></a> <a :href="whatsapp" :class="whatsapp && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Whatsapp"><i class="icon icon-whatsapp w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-whatsapp" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-whatsapp</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M3 21l1.65 -3.8a9 9 0 1 1 3.4 2.9l-5.05 .9" /> <path d="M9 10a0.5 .5 0 0 0 1 0v-1a0.5 .5 0 0 0 -1 0v1a5 5 0 0 0 5 5h1a0.5 .5 0 0 0 0 -1h-1a0.5 .5 0 0 0 0 1" /> </svg> </i><span class="sr-only">Whatsapp</span></a> <a :href="youtube" :class="youtube && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Youtube"><i class="icon icon-youtube w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-youtube" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-youtube</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <rect x="3" y="5" width="18" height="14" rx="4" /> <path d="M10 9l5 3l-5 3z" /> </svg> </i><span class="sr-only">Youtube</span></a> <a rel="me" :href="mastodon" :class="mastodon && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Mastodon"><i class="icon icon-mastodon w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-mastodon" ><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M18.648 15.254c-1.816 1.763 -6.648 1.626 -6.648 1.626a18.262 18.262 0 0 1 -3.288 -.256c1.127 1.985 4.12 2.81 8.982 2.475c-1.945 2.013 -13.598 5.257 -13.668 -7.636l-.026 -1.154c0 -3.036 .023 -4.115 1.352 -5.633c1.671 -1.91 6.648 -1.666 6.648 -1.666s4.977 -.243 6.648 1.667c1.329 1.518 1.352 2.597 1.352 5.633s-.456 4.074 -1.352 4.944z" /><path d="M12 11.204v-2.926c0 -1.258 -.895 -2.278 -2 -2.278s-2 1.02 -2 2.278v4.722m4 -4.722c0 -1.258 .895 -2.278 2 -2.278s2 1.02 2 2.278v4.722" /></svg> </i><span class="sr-only">Mastodon</span></a> </nav> </div> <span class="hidden lg:block"></span> <div class="flex flex-col gap-2 mt-2" data-footer-nav="primary"> <span class="font-semibold">Navigate to</span> <nav class=""> <ul class="flex flex-col items-start gap-2 text-typ-tone text-sm"> <li class="nav-transitland-platform nav-current-parent flex flex-col relative" data-label="Transitland Platform" data-slug="transitland-platform" data-length="20"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/" > <span>Transitland Platform</span> </a> </li> <li class="nav-intro-to-transitland nav-current-parent flex flex-col relative is-subitem" data-label="- Intro to Transitland" data-slug="intro-to-transitland" data-length="22"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/" > <span>- Intro to Transitland</span> </a> </li> <li class="nav-transitland-apis-for-developers nav-current flex flex-col relative is-subitem" data-label="- Transitland APIs for Developers" data-slug="transitland-apis-for-developers" data-length="33"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/apis-for-developers/" > <span>- Transitland APIs for Developers</span> </a> </li> <li class="nav-custom-bulk-transit-data-exports flex flex-col relative is-subitem" data-label="- Custom Bulk Transit Data Exports" data-slug="custom-bulk-transit-data-exports" data-length="34"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/custom-bulk-transit-data/" > <span>- Custom Bulk Transit Data Exports</span> </a> </li> <li class="nav-all-stops-in-the-united-states flex flex-col relative is-subitem" data-label="- All Stops in the United States" data-slug="all-stops-in-the-united-states" data-length="32"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/all-us-stops-bulk-data/" > <span>- All Stops in the United States</span> </a> </li> <li class="nav-compare-transitland flex flex-col relative is-subitem" data-label="- Compare Transitland" data-slug="compare-transitland" data-length="21"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/compare/" > <span>- Compare Transitland</span> </a> </li> <li class="nav-transitland-plans-pricing flex flex-col relative is-subitem" data-label="- Transitland Plans & Pricing" data-slug="transitland-plans-pricing" data-length="30"> <a class="flex hover:text-brand" href="https://www.transit.land/plans-pricing/" > <span>- Transitland Plans & Pricing</span> </a> </li> <li class="nav-interline-routing-platform flex flex-col relative" data-label="Interline Routing Platform" data-slug="interline-routing-platform" data-length="26"> <a class="flex hover:text-brand" href="https://www.interline.io/routing-platform/" > <span>Interline Routing Platform</span> </a> </li> <li class="nav-intro-to-valhalla flex flex-col relative is-subitem" data-label="- Intro to Valhalla" data-slug="intro-to-valhalla" data-length="19"> <a class="flex hover:text-brand" href="https://www.interline.io/valhalla/" > <span>- Intro to Valhalla</span> </a> </li> <li class="nav-valhalla-tilepacks flex flex-col relative is-subitem" data-label="- Valhalla Tilepacks" data-slug="valhalla-tilepacks" data-length="20"> <a class="flex hover:text-brand" href="https://www.interline.io/valhalla/tilepacks/" > <span>- Valhalla Tilepacks</span> </a> </li> <li class="nav-global-hosted-valhalla-apis flex flex-col relative is-subitem" data-label="- Global Hosted Valhalla APIs" data-slug="global-hosted-valhalla-apis" data-length="29"> <a class="flex hover:text-brand" href="https://rapidapi.com/interline-technologies-interline-technologies-default/api/interline-global-valhalla-navigation-and-routing-engine/" > <span>- Global Hosted Valhalla APIs</span> </a> </li> <li class="nav-transitland-routing-api flex flex-col relative is-subitem" data-label="- Transitland Routing API" data-slug="transitland-routing-api" data-length="25"> <a class="flex hover:text-brand" href="https://www.transit.land/documentation/routing-api/" > <span>- Transitland Routing API</span> </a> </li> <li class="nav-resources flex flex-col relative" data-label="Resources" data-slug="resources" data-length="9"> <a class="flex hover:text-brand" href="https://www.interline.io/resources/" > <span>Resources</span> </a> </li> <li class="nav-blog flex flex-col relative is-subitem" data-label="- Blog" data-slug="blog" data-length="6"> <a class="flex hover:text-brand" href="https://www.interline.io/blog/" > <span>- Blog</span> </a> </li> <li class="nav-consulting flex flex-col relative is-subitem" data-label="- Consulting" data-slug="consulting" data-length="12"> <a class="flex hover:text-brand" href="https://www.interline.io/consulting/" > <span>- Consulting</span> </a> </li> <li class="nav-applied-research flex flex-col relative is-subitem" data-label="- Applied Research" data-slug="applied-research" data-length="18"> <a class="flex hover:text-brand" href="https://www.interline.io/resources/applied-research/" > <span>- Applied Research</span> </a> </li> <li class="nav-osm-extracts flex flex-col relative is-subitem" data-label="- OSM Extracts" data-slug="osm-extracts" data-length="14"> <a class="flex hover:text-brand" href="https://app.interline.io/osm_extracts/interactive_view" > <span>- OSM Extracts</span> </a> </li> <li class="nav-about-interline flex flex-col relative" data-label="About Interline" data-slug="about-interline" data-length="15"> <a class="flex hover:text-brand" href="https://www.interline.io/about/" > <span>About Interline</span> </a> </li> </ul> </nav> </div> <div class="flex flex-col gap-2 mt-2" data-footer-nav="secondary"> <span class="font-semibold">For more info</span> <nav class=""> <ul class="flex flex-col items-start gap-2 text-typ-tone text-sm"> <li class="nav-terms flex flex-col relative" data-label="Terms" data-slug="terms" data-length="5"> <a class="flex hover:text-brand" href="https://www.interline.io/legal/terms/" > <span>Terms</span> </a> </li> <li class="nav-privacy flex flex-col relative" data-label="Privacy" data-slug="privacy" data-length="7"> <a class="flex hover:text-brand" href="https://www.interline.io/legal/privacy/" > <span>Privacy</span> </a> </li> <li class="nav-support flex flex-col relative" data-label="Support" data-slug="support" data-length="7"> <a class="flex hover:text-brand" href="https://www.interline.io/support/" > <span>Support</span> </a> </li> <li class="nav-docs flex flex-col relative" data-label="Docs" data-slug="docs" data-length="4"> <a class="flex hover:text-brand" href="https://www.interline.io/docs/" > <span>Docs</span> </a> </li> </ul> </nav> </div> <div class="flex flex-col gap-2 mt-2" data-footer-nav="categories"> <span class="font-semibold">Read on our blog</span> <nav class=""> <ul class="flex flex-col items-start gap-2 text-typ-tone text-sm"> <li class="flex flex-col relative"> <a href="/blog/tag/about-interline/" class="flex hover:text-brand">About Interline</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/transitland/" class="flex hover:text-brand">Transitland</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/gtfs/" class="flex hover:text-brand">GTFS</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/511-sf-bay-regional-feed/" class="flex hover:text-brand">511.org SF Bay Regional Feed</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/openstreetmap/" class="flex hover:text-brand">OpenStreetMap</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/geojsonl/" class="flex hover:text-brand">GeoJSONL</a> </li> </ul> </nav> </div> </div> <div class="py-4 md:py-6 flex flex-wrap items-center gap-2 relative before:content-[''] before:absolute before:top-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="text-sm text-typ-tone"> <span data-footer-date>© 2018 - 2024 <a class="hover:underline" href="https://www.interline.io">Interline Technologies LLC</a>.</span> </div> <button class="flex gap-0.5 p-[3px] border border-brd text-typ-tone rounded-theme hover:bg-bgr-tone" aria-label="Toggle color scheme" data-color-scheme-toggle @click="toggleColorScheme(event)"> <span data-theme="light" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-sun size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> <span data-theme="dark" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-moon size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> </button> </div> </div> </footer> <template data-toggle-template> <button class="ml-0.5" data-class="rotate-180" title="Menu toggle" aria-label="Menu toggle" aria-controls="" aria-expanded="false" @click="toggleSubmenu(event)" > <i class="icon icon-chevron-down size-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <polyline points="6 9 12 15 18 9"></polyline> </svg> </i> </button> </template> <script> function renderSubmenus() { const navItems = document.querySelectorAll('[data-nav] li') const subItems = document.querySelectorAll('.is-subitem') const mobileClass = "hidden pl-4 flex flex-col gap-0.5 py-1 px-1.5 basis-full" const desktopClass = "z-[50] min-w-[calc(100%_+_24px)] absolute flex flex-col gap-1 shadow-2xl border border-brd rounded-theme-xxs bg-bgr py-2 px-1.5 -ml-2 mt-11 opacity-0 invisible translate-y-1 transition-all" // Remove '-' signs subItems.forEach(item => { const itemName = item.querySelector('a span') itemName.innerText = itemName.innerText.slice(1) }); // Add subitems in place let subMenu, hasItems navItems.forEach((item, index) => { if (item.classList.contains('is-subitem') && !navItems[index - 1].classList.contains('is-subitem')) { navItems[index - 1].classList.add('is-mainitem'); navItems[index - 1].setAttribute('x-on:click.outside', 'closeSubmenus(event)') } subMenu = item.classList.contains('is-subitem') ? subMenu : document.createElement('ul'); if (item.classList.contains('is-subitem')) { subMenu.appendChild(item) subMenu.setAttribute('data-submenu', '') subMenu.getAttribute('id') === null ? subMenu.setAttribute('id', navItems[index - 1].getAttribute('data-slug')) : '' const menuType = subMenu.closest('nav').getAttribute('data-nav') subMenu.classList = menuType === 'desktop' ? desktopClass : mobileClass } else { item.appendChild(subMenu) } }); const dropdownMenus = document.querySelectorAll('[data-nav] .is-mainitem') const toggle = document.querySelector('[data-toggle-template]'); dropdownMenus.forEach(menu => { const toggleBtn = toggle.content.firstElementChild.cloneNode(true); toggleBtn.setAttribute('aria-controls', menu.getAttribute('data-slug')) menu.insertBefore(toggleBtn, menu.children[1]); }); } </script> <script> window.socials = { rss: '/blog/rss/', threads: '', linkedin: 'https://www.linkedin.com/company/interline-io/', discord: '', github: 'https://github.com/interline-io', instagram: '', pinterest: '', reddit: '', telegram: '', tiktok: '', whatsapp: '', youtube: '', mastodon: 'https://mastodon.social/@interline' } document.addEventListener('alpine:init', () => { Alpine.data('socials', () => (window.socials)) }) </script> </body> </html>