{"id":22468508,"url":"https://github.com/projectweekend/node-cta-bus-tracker","last_synced_at":"2025-09-20T23:51:34.718Z","repository":{"id":19720771,"uuid":"22976567","full_name":"projectweekend/Node-CTA-Bus-Tracker","owner":"projectweekend","description":"A Node.js package for the Chicago Transit Authority's bus tracker API","archived":false,"fork":false,"pushed_at":"2016-11-07T01:15:36.000Z","size":464,"stargazers_count":5,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-31T14:02:52.850Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/projectweekend.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-08-15T02:56:38.000Z","updated_at":"2017-01-04T17:24:27.000Z","dependencies_parsed_at":"2022-08-24T14:09:06.373Z","dependency_job_id":null,"html_url":"https://github.com/projectweekend/Node-CTA-Bus-Tracker","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/projectweekend/Node-CTA-Bus-Tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectweekend%2FNode-CTA-Bus-Tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectweekend%2FNode-CTA-Bus-Tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectweekend%2FNode-CTA-Bus-Tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectweekend%2FNode-CTA-Bus-Tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/projectweekend","download_url":"https://codeload.github.com/projectweekend/Node-CTA-Bus-Tracker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectweekend%2FNode-CTA-Bus-Tracker/sbom","scorecard":{"id":746699,"data":{"date":"2025-08-11","repo":{"name":"github.com/projectweekend/Node-CTA-Bus-Tracker","commit":"9f4d3b8d39d7d72cd3516fb708b3182951da1136"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T18:59:20.091Z","repository_id":19720771,"created_at":"2025-08-22T18:59:20.091Z","updated_at":"2025-08-22T18:59:20.091Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272988919,"owners_count":25026961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-06T11:17:00.677Z","updated_at":"2025-09-20T23:51:29.665Z","avatar_url":"https://github.com/projectweekend.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"A Node.js package for the Chicago Transit Authority's bus tracker API. For complete details regarding the data returned for each method, check out the CTA's documentation: [http://www.transitchicago.com/assets/1/developer_center/BusTime_Developer_API_Guide.pdf](http://www.transitchicago.com/assets/1/developer_center/BusTime_Developer_API_Guide.pdf)\n\n### Key Features\n\n* JSON is returned instead of the CTA's crappy XML\n* All date properties are converted from strings formatted like \"YYYYMMDD HH:MM:SS\" to a normal JavaScript date strings like \"2014-08-30T14:53:34-05:00\"\n\n\n#### Install It\n```\nnpm install cta-bus-tracker\n```\n\n\n---------------------------\n\n\n#### Require It\n```javascript\nvar cta = require( \"cta-bus-tracker\" );\n```\n\n\n---------------------------\n\n\n#### Initialize It\n```javascript\nvar busTracker = cta( \"your CTA API KEY\" );\n```\n\n\n---------------------------\n\n\n#### Time\n```javascript\nbusTracker.time( function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n```\n\n**Example data:**\n~~~javascript\n\"2014-08-30T14:53:34-05:00\"\n~~~\n\n\n---------------------------\n\n\n#### Vehicles By ID\n~~~javascript\n// a list of up to 10 vehicle IDs\nvar vehicleIds = [ \"1973\" ];\n\nbusTracker.vehiclesById( vehicleIds, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n{\n    vid: '1973',\n    tmstmp: '2014-08-30T14:55:00-05:00',\n    lat: '41.949149812970845',\n    lon: '-87.64872932434082',\n    hdg: '287',\n    pid: '4735',\n    rt: '8',\n    des: '79th',\n    pdist: '318',\n    spd: '0',\n    tablockid: '8 -752',\n    tatripid: '139',\n    zone: ''\n}\n~~~\n\n**Note:** If more than one vehicle ID is provided *data* will be an array of objects.\n\n\n---------------------------\n\n\n#### Vehicles By route\n~~~javascript\n// a list of up to 10 vehicle IDs\nvar routeIds = [ \"8\" ];\n\nbusTracker.vehiclesById( routeIds, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        vid: '1973',\n        tmstmp: '2014-08-30T15:05:00-05:00',\n        lat: '41.93126130439866',\n        lon: '-87.64894748741472',\n        hdg: '173',\n        pid: '4735',\n        rt: '8',\n        des: '79th',\n        pdist: '7027',\n        spd: '23',\n        tablockid: '8 -752',\n        tatripid: '139',\n        zone: ''\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Routes\n~~~javascript\nbusTracker.routes( function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        rt: '1',\n        rtnm: 'Bronzeville/Union Station',\n        rtclr: '#336633'\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Route Directions\n~~~javascript\nvar routeId = \"1\";\n\nbusTracker.routeDirections( routeId, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    'Northbound',\n    'Southbound'\n]\n~~~\n\n\n---------------------------\n\n\n#### Stops\n~~~javascript\nvar routeId = \"1\";\nvar routeDirection = \"Northbound\";\n\nbusTracker.stops( routeId, routeDirection, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        stpid: '1577',\n        stpnm: '1509 S Michigan',\n        lat: '41.861838603628',\n        lon: '-87.623975872993'\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Patterns By ID\n~~~javascript\n// a list of up to 10 pattern IDs\nvar parrernIds = [ \"4735\" ];\n\nbusTracker.patternsById( patternIds, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n{\n    pid: '4735',\n    ln: '74252.0',\n    rtdir: 'Southbound',\n    pt:\n    [\n        {\n            seq: '1',\n            lat: '41.949815854453',\n            lon: '-87.649156451225',\n            typ: 'S',\n            stpid: '5756',\n            stpnm: 'Halsted \u0026 Waveland/Broadway Terminal',\n            pdist: '0.0'\n        },\n        ...\n    ]\n}\n~~~\n\n**Note:** If more than one pattern ID is provided *data* will be an array of objects.\n\n\n---------------------------\n\n\n#### Patterns By Route\n~~~javascript\n// a list of up to 10 pattern IDs\nvar routeId = \"1\";\n\nbusTracker.patternsByRoute( routeId, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        pid: '4735',\n        ln: '74252.0',\n        rtdir: 'Southbound',\n        pt:\n        [\n            {\n                seq: '1',\n                lat: '41.949815854453',\n                lon: '-87.649156451225',\n                typ: 'S',\n                stpid: '5756',\n                stpnm: 'Halsted \u0026 Waveland/Broadway Terminal',\n                pdist: '0.0'\n            },\n            ...\n        ]\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Predictions By Stop\n~~~javascript\nvar options = {\n    // a list of up to 10 stop IDs\n    stopIds: [ \"1577\" ],\n    // topCount is optional\n    topCount: 5\n};\n\nbusTracker.predictionsByStop( options, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        tmstmp: '2014-08-30T15:26:00-05:00',\n        typ: 'A',\n        stpnm: '1509 S Michigan',\n        stpid: '1577',\n        vid: '1261',\n        dstp: '7564',\n        rt: '4',\n        rtdir: 'Northbound',\n        des: 'Illinois Center',\n        prdtm: '2014-08-30T15:34:00-05:00',\n        tablockid: '4 -715',\n        tatripid: '126',\n        zone: ''\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Predictions By Vehicle\n~~~javascript\nvar options = {\n    // a list of up to 10 vehicle IDs\n    vehicleIds: [ \"1230\" ],\n    // topCount is optional\n    topCount: 5\n};\n\nbusTracker.predictionsByVehicle( options, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        tmstmp: '2014-08-30T15:31:00-05:00',\n        typ: 'A',\n        stpnm: 'Halsted \u0026 Addison',\n        stpid: '14901',\n        vid: '1230',\n        dstp: '86',\n        rt: '8',\n        rtdir: 'Southbound',\n        des: '79th',\n        prdtm: '2014-08-30T15:31:00-05:00',\n        tablockid: '8 -706',\n        tatripid: '145',\n        zone: ''\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Service Bulletins By Route\n~~~javascript\nvar options = {\n    // a list of up to 10 route IDs\n    routeIds: [ \"1\" ],\n    // routeDirection is optional\n    routeDirection: \"Northbound\"\n};\n\nbusTracker.serviceBulletinsByRoute( options, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        nm: '#36 Broadway - Bus Stop Relocation',\n        sbj: ' Bus Stop Relocation',\n        dtl: 'Effective Wed, May 7\u003cbr/\u003e\u003cbr/\u003eThe northbound #36 bus stop on the northeast corner at Broadway/Granville has been relocated to the southeast corner at Broadway/Granville.\u003cbr/\u003e \u003cbr/\u003e',\n        brf: '',\n        prty: 'Low'\n    },\n    ...\n]\n~~~\n\n\n---------------------------\n\n\n#### Service Bulletins By Route\n~~~javascript\n// a list of up to 10 stop IDs\nvar stopIds = [ \"1577\" ];\n\nbusTracker.serviceBulletinsByStop( stopIds, function ( err, data ) {\n    if ( err ) {\n        // handle error\n    }\n    // use data\n} );\n~~~\n\n**Example data:**\n~~~javascript\n[\n    {\n        nm: '3 K. Drive buses are temp rerouted at K Drive/79th',\n        sbj: '# 3 King Drive buses rerouted',\n        dtl: '#3 King Drive buses are temporarily rerouted in both directions via King Drive, 79th, Cottage Grove, 83rd, and King Drive, due to street blockage.\u003cbr/\u003e\u003cbr/\u003eAllow extra travel time.\u003cbr/\u003e \u003cbr/\u003e',\n        brf: '',\n        prty: 'Medium',\n        srvc: { rt: '3' }\n    },\n    ...\n]\n~~~\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprojectweekend%2Fnode-cta-bus-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprojectweekend%2Fnode-cta-bus-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprojectweekend%2Fnode-cta-bus-tracker/lists"}