{"id":27695084,"url":"https://github.com/outadoc/twisto-api","last_synced_at":"2025-04-25T14:15:31.023Z","repository":{"id":140238146,"uuid":"13181539","full_name":"outadoc/Twisto-API","owner":"outadoc","description":"API JSON pour Twisto, le réseau de bus et tram de Caen.","archived":false,"fork":false,"pushed_at":"2014-08-31T22:16:59.000Z","size":433,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-25T14:15:21.830Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://dev.outadoc.fr","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/outadoc.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":"2013-09-28T21:55:59.000Z","updated_at":"2017-08-01T05:42:10.000Z","dependencies_parsed_at":"2023-03-13T10:44:01.787Z","dependency_job_id":null,"html_url":"https://github.com/outadoc/Twisto-API","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2FTwisto-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2FTwisto-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2FTwisto-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2FTwisto-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outadoc","download_url":"https://codeload.github.com/outadoc/Twisto-API/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250831517,"owners_count":21494380,"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","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":"2025-04-25T14:15:30.291Z","updated_at":"2025-04-25T14:15:31.016Z","avatar_url":"https://github.com/outadoc.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Twisto/Timeo Real-time API\n\n## Mise en garde\n\nCette API n'est plus franchement utile depuis que j'ai découvert l'existence de l'[API officielle un peu cachée](https://gist.github.com/outadoc/40060db45c436977a912). Utilisez-la de préférence, l'API non-officielle de ce repo ne sera plus mise à jour.\n\n## Introduction\n\nLe réseau Twisto est le réseau de bus et tram de la ville de Caen, géré par Viacités. Malheureusement, ce syndicat ne propose pas d'API pour accéder à ses services qui se vantent pourtant d'être disponibles sur un maximum d'appareils possible.\n\nCette API non-officielle comble partiellement ce manque en vous permettant, notamment, d'obtenir en temps réel et au format JSON les horaires des prochains bus Twisto, de la ville de Caen.\n\nVous pourrez également lister les lignes de bus, directions et arrêts disponibles.\n\n## Fonctionnement\n\nL'API est écrite en PHP et repose sur le système Timeo de Actigraph, disponible sur les sites officiels de Twisto et les applications mobiles.\n\n## Utilisation\n\nAppelez le script `twisto-api.php` avec différentes variables GET (ou POST) en fonction du résultat souhaité.  \nLe résultat est renvoyé sous forme d'un string JSON.\n\n### Lister les lignes de bus/tram\n\n\ttwisto-api.php?func=getLines\n\n*Exemple de résultat* :\n\n```json\n[\n\t{\"id\": \"TRAM\", \"name\": \"TRAM\"},\n\t{\"id\": \"1\", \"name\": \"Lianes 1\"},\n\t{\"id\": \"2\", \"name\": \"Lianes 2\"},\n\t{\"id\": \"3\", \"name\": \"Lianes 3\"},\n\t{\"id\": \"4\", \"name\": \"Lianes 4\"},\n\t{\"id\": \"5\", \"name\": \"Ligne 5\"},\n\t{\"id\": \"6\", \"name\": \"Ligne 6\"},\n\t{\"id\": \"7\", \"name\": \"Ligne 7\"},\n\t{\"id\": \"8\", \"name\": \"Ligne 8\"},\n\t{\"id\": \"9\", \"name\": \"Ligne 9\"},\n\t...\n\t{\"id\": \"NUIT\", \"name\": \"Ligne Noctibus\"}\n]\n```\n\nL'identifiant obtenu pour chaque ligne pourra servir pour les autres fonctions du script.\n\n----------------------------------------\n\n### Lister les directions pour une ligne donnée\n\n\ttwisto-api.php?func=getDirections\u0026line=XX\n\n...où XX est l'identifiant de la ligne.\n\n*Exemple de requête* :\n\n\ttwisto-api.php?func=getDirections\u0026line=11\n\n*Exemple de résultat* :\n\n```json\n[\n\t{\"id\": \"A\", \"name\": \"Cuverville mairie\"},\n\t{\"id\": \"R\", \"name\": \"Bretteville l'enclos\"}\n]\n```\n\nL'identifiant est A pour \"aller\", ou R pour \"retour\".\n\n----------------------------------------\n\n### Lister les arrêts pour une ligne et une direction données\n\n\ttwisto-api.php?func=getStops\u0026line=XX\u0026direction=A|R\n\n...où XX est l'identifiant de la ligne, et la direction est A ou R.\n\n*Exemple de requête* :\n\n\ttwisto-api.php?func=getStops\u0026line=11\u0026direction=A\n\n*Exemple de résultat* :\n\n```json\n[\n\t{\"id\": \"5421\", \t\"name\": \"50 acres\"},\n\t{\"id\": \"11\", \t\"name\": \"Bibliotheque\"},\n\t{\"id\": \"4072\", \t\"name\": \"Bois claquet\"},\n\t{\"id\": \"4082\", \t\"name\": \"Briere\"},\n\t{\"id\": \"3532\", \t\"name\": \"Carrefour de la liberte\"},\n\t{\"id\": \"4112\",\t\"name\": \"Charmettes\"},\n\t{\"id\": \"4122\", \t\"name\": \"Clair soleil\"},\n\t{\"id\": \"511\", \t\"name\": \"Creux au renard\"},\n\t{\"id\": \"1892\", \t\"name\": \"Demi-lune\"},\n\t{\"id\": \"121\", \t\"name\": \"Demoge\"},\n\t{\"id\": \"2052\", \t\"name\": \"Edmond rostand\"},\n\t{\"id\": \"5461\", \t\"name\": \"Eglise de bretteville\"},\n\t...\n\t{\"id\": \"4392\", \t\"name\": \"Vallee barrey\"}\n]\n```\n\n----------------------------------------\n\n### Lister les prochains bus pour UNE ligne, UNE direction et UN arrêt\n\n\ttwisto-api.php?func=getSchedule\u0026line=XX\u0026direction=A|R\u0026stop=XXXX\n\n...où XX est l'identifiant de la ligne, la direction est A ou R et XXXX est l'identifiant de l'arrêt.\n\n*Exemple de requête* :\n\n\ttwisto-api.php?func=getSchedule\u0026line=11\u0026direction=A\u0026stop=5421\n\n*Exemple de résultat* :\n\n```json\n[\n\t{\n\t\t\"line\": \"Ligne 11\",\n\t\t\"direction\": \"Cuverville mairie\",\n\t\t\"stop\": \"Arrêt 50 acres\",\n\t\t\"next\": [\n\t\t\t\"Dans 15 minutes\", \n\t\t\t\"Dans 35 minutes\"\n\t\t]\n\t}\n]\n```\n\n----------------------------------------\n\n### Lister les prochains bus pour plusieurs lignes/directions/arrêts à la fois\n\nPour cela, on envoie directement un cookie (le même que celui utilisé par le système officiel).  \nLe cookie est de la forme `ARRÊT|LIGNE|DIRECTION;ARRÊT|LIGNE|DIRECTION;...`.\n\n*Exemple de requête (non-URLencoded)* :\n\n\ttwisto-api.php?func=getSchedule\u0026data=5421|11|A;12|11|R;251|3|A\n\n*Exemple de requête (URLencoded)* :\n\n\ttwisto-api.php?func=getSchedule\u0026data=5421%7C11%7CA%3B12%7C11%7CR%3B251%7C3%7CA\n\n*Exemple de résultat* :\n\n```json\n[\n\t{\n\t\t\"line\": \"Ligne 11\",\n\t\t\"direction\": \"Cuverville mairie\",\n\t\t\"stop\": \"Arrêt 50 acres\",\n\t\t\"next\": [\n\t\t\t\"Dans 15 minutes\", \n\t\t\t\"Dans 35 minutes\"\n\t\t]\n\t}, {\n\t\t\"line\": \"Ligne 11\",\n\t\t\"direction\": \"Bretteville l'enclos\",\n\t\t\"stop\": \"Arrêt Bibliotheque\",\n\t\t\"next\": [\n\t\t\t\"Dans 3 minutes\", \n\t\t\t\"Dans 25 minutes\"\n\t\t]\n\t}, {\n\t\t\"line\": \"Lianes 3\",\n\t\t\"direction\": \"Herouville st-clair\",\n\t\t\"stop\": \"Arrêt Bicoquet\",\n\t\t\"next\": [\n\t\t\t\"Passage imminent\",\n\t\t\t\"À 0 H 25\"\n\t\t]\n\t}\n]\n```\n\n----------------------------------------\n\n### Gestion des erreurs\n\nSi une erreur survient durant l'exécution du script, un message d'erreur devrait être inclus dans le JSON retourné, ainsi qu'une code de statut HTTP 500 (ou 400 en cas de paramètres manquants).\n\n*Exemples* :\n\n```json\n{\"error\": \"Could not resolve host: dev.actigraph.fr; nodename nor servname provided, or not known\"}\n```\n\nSi plus d'informations majeures sur le problème sont disponibles, un message complémentaire sera ajouté :\n\n```json\n{\n\t\"error\": \"Service indisponible\",\n\t\"message\": \"Chers clients, le service \\\"Prochains passages\\\" est actuellement indisponible. Nous faisons le maximum pour le rétablir au plus vite. Merci de votre compréhension.\"\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutadoc%2Ftwisto-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutadoc%2Ftwisto-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutadoc%2Ftwisto-api/lists"}