Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MTA Realtime API JSON Proxy

MTAPI is a small HTTP server that converts the MTA's realtime subway feed from Protocol Buffers/GTFS to JSON. The app also adds caching and makes it possible to retrieve information by location and train line.

Active Development

This project is under active development and any part of the API may change. Feedback is very welcome.

Running the server

MTAPI is a Flask app designed to run under Python 3.3+.

  1. Create a settings.cfg file. A sample is provided as settings.cfg.sample.
  2. Set up your environment and install dependencies.
    $ python3 -m venv .venv
    $ source .venv/bin/activate
    $ python3 -m pip install -r requirements.txt
  3. Run the server
    $ python app.py

If your configuration is named something other than settings.cfg, set the MTAPI_SETTINGS env variable to your configuration path.

This app makes use of Python threads. If running under uWSGI include the --enable-threads flag.

Endpoints

Endpoints to retrieve train data and sample input and output are listed here.

Settings

  • STATIONS_FILE (required)
    Path to the JSON file containing station information. See Generating a Stations File for more info.
    default: None

  • CROSS_ORIGIN
    Add CORS headers to the HTTP output.
    default: "*" when in debug mode, None otherwise

  • MAX_TRAINS
    Limits the number of trains that will be listed for each station.
    default: 10

  • MAX_MINUTES
    Limits how far in advance train information will be listed.
    default: 30

  • CACHE_SECONDS
    How frequently the app will request fresh data from the MTA API.
    default: 60

  • THREADED
    Enable background data refresh. This will prevent requests from hanging while new data is retrieved from the MTA API.
    default: True

  • DEBUG
    Standard Flask option. Will enabled enhanced logging and wildcard CORS headers.
    default: False

Generating a Stations File

The MTA provides several static data files about the subway system but none include canonical information about each station. MTAPI includes a script that will parse the stops.txt and transfers.txt datasets provided by the MTA and attempt to group the different train stops into subway stations. MTAPI will use this JSON file for station names and locations. The grouping is not perfect and editing the resulting files is encouraged.

Usage:

$ python make_stations_csv.py stops.txt transfers.txt > stations.csv
# edit groupings in stations.csv
$ python make_stations_json.py stations.csv > stations.json
# edit names in stations.json

Help

Submit a GitHub Issues request.

Projects

Here are some projects that use MTAPI.

License

The project is made available under the MIT license.

About

JSON proxy server for the MTA's realtime New York City subway feed

Topics

Resources

Stars

324 stars

Watchers

26 watching

Forks

Releases

Packages

Used by

Contributors

Languages