{"id":31834,"date":"2026-10-05T09:10:00","date_gmt":"2026-10-05T07:10:00","guid":{"rendered":"https:\/\/botnation.ai\/bus-chatbot\/"},"modified":"2026-10-05T16:47:46","modified_gmt":"2026-10-05T14:47:46","slug":"bus-chatbot","status":"publish","type":"post","link":"https:\/\/botnation.ai\/en\/bus-chatbot\/","title":{"rendered":"Bus chatbot: real use cases, open data, and how to deploy one (2026)"},"content":{"rendered":"<p><script>var s=document.createElement(\"style\");s.appendChild(document.createTextNode(`.bn-art{ --bn-cream:#faf8f2; --bn-card:#faf6ea; --bn-sand:#ebe3cb; --bn-sand-2:#f3ecd9; --bn-sand-zebra:#f6f0df; --bn-coral:#fe716b; --bn-coral-soft:#fdeeed; --bn-coral-line:#f6c9c6; --bn-coral-txt:#bd3a34; --bn-blue:#3358f0; --bn-blue-soft:#eef1fe; --bn-blue-line:#c9d4fb; --bn-green:#427632; --bn-green-soft:#eef6ea; --bn-ink:#3d351f; --bn-text:#414b56; --bn-muted:#6d6653; --bn-border:#e6dcc2; --bn-r:16px; --bn-r-sm:11px; --bn-sp:22px; --bn-sh:0 1px 2px rgba(61,53,31,.05),0 10px 26px rgba(61,53,31,.07); --bn-sh-sm:0 1px 2px rgba(61,53,31,.05),0 4px 12px rgba(61,53,31,.05); --bn-mono:'IBM Plex Mono','SFMono-Regular',ui-monospace,'Courier New',monospace; color:var(--bn-text); font-size:18px; line-height:1.75; max-width:820px; margin:0 auto; } .bn-art *{box-sizing:border-box} .bn-art p{margin:0 0 1.15em; color:var(--bn-text)} .bn-art h2{ color:var(--bn-ink); font-weight:700; line-height:1.25; font-size:1.72em; margin:2.2em 0 .7em; letter-spacing:-.01em; } .bn-art h3{color:var(--bn-ink); font-weight:700; font-size:1.22em; margin:1.8em 0 .5em} .bn-art a{color:#3f5cd6; text-decoration:underline; text-underline-offset:2px; text-decoration-thickness:1px} .bn-art a:hover{color:var(--bn-coral)} .bn-art strong{color:var(--bn-ink); font-weight:700} .bn-art ul,.bn-art ol{margin:0 0 1.3em; padding-left:1.25em} .bn-art li{margin:.4em 0} .bn-art ul li::marker{color:var(--bn-coral)} .bn-art ol li::marker{color:var(--bn-blue); font-weight:700} .bn-klabel{ display:inline-flex; align-items:center; gap:7px; font-family:var(--bn-mono); font-size:14px; font-weight:600; text-transform:uppercase; letter-spacing:.12em; color:var(--bn-coral); margin:0 0 .2em; } .bn-klabel svg{width:15px;height:15px;flex:none} .bn-tldr{ background:var(--bn-card); border:1px solid var(--bn-border); border-left:4px solid var(--bn-coral); border-radius:var(--bn-r); padding:20px 24px; margin:0 0 30px; box-shadow:var(--bn-sh-sm); } .bn-tldr p{margin:0; color:var(--bn-text)} .bn-tldr p+p{margin-top:.6em} .bn-toc{ background:var(--bn-sand-2); border:1px solid var(--bn-sand); border-radius:var(--bn-r); padding:18px 22px; margin:0 0 34px; } .bn-toc .bn-klabel{color:var(--bn-coral)} .bn-toc ol{margin:.4em 0 0; padding-left:1.2em; columns:2; column-gap:28px} .bn-toc li{margin:.25em 0; break-inside:avoid} .bn-toc a{color:var(--bn-ink); text-decoration:none; font-weight:600; font-size:.96em} .bn-toc a:hover{color:var(--bn-coral); text-decoration:underline} .bn-stats{display:grid; grid-template-columns:repeat(3,1fr); gap:16px; margin:28px 0} .bn-stat{ background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:20px 18px; text-align:center; box-shadow:var(--bn-sh-sm); } .bn-stat b{display:block; font-size:2em; line-height:1.1; color:var(--bn-coral); font-weight:800; letter-spacing:-.02em} .bn-stat span{display:block; margin-top:6px; font-size:.86em; color:var(--bn-muted); line-height:1.45} .bn-stat:nth-child(2) b{color:var(--bn-blue)} .bn-stat:nth-child(3) b{color:var(--bn-ink)} .bn-grid{display:grid; grid-template-columns:1fr 1fr; gap:18px; margin:26px 0} .bn-card{ background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:22px; box-shadow:var(--bn-sh-sm); } .bn-card h4{margin:.1em 0 .35em; color:var(--bn-ink); font-size:1.06em; font-weight:700; display:flex; gap:9px; align-items:center} .bn-card h4 svg{width:20px;height:20px;flex:none;color:var(--bn-coral)} .bn-card p{margin:0; font-size:.96em} .bn-ex{ background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:20px 0; box-shadow:var(--bn-sh); position:relative; } .bn-ex-h{display:flex; align-items:center; gap:13px; margin-bottom:14px} .bn-ex-n{ flex:none; width:38px; height:38px; border-radius:11px; background:var(--bn-coral-soft); color:var(--bn-coral); display:flex; align-items:center; justify-content:center; font-weight:800; font-size:1.1em; font-family:var(--bn-mono); } .bn-ex-h h3{margin:0; font-size:1.18em} .bn-ex-tag{font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.1em; color:var(--bn-muted); display:block; margin-top:2px} .bn-ex p{margin:.2em 0 .9em} .bn-ex .bn-ba{display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-top:14px} .bn-ba div{border-radius:var(--bn-r-sm); padding:13px 15px; font-size:.9em; line-height:1.5} .bn-ba .biz{background:var(--bn-blue-soft); border:1px solid var(--bn-blue-line)} .bn-ba .cli{background:var(--bn-green-soft); border:1px solid #cfe6c4} .bn-ba b{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; margin-bottom:4px; color:var(--bn-muted)} .bn-tablewrap{overflow-x:auto; margin:26px 0; border-radius:var(--bn-r); border:1px solid var(--bn-border); box-shadow:var(--bn-sh-sm)} .bn-art table{width:100%; border-collapse:collapse; background:var(--bn-card); font-size:.94em; min-width:520px} .bn-art thead th{background:var(--bn-ink); color:#fbf7ec; text-align:left; font-weight:700; padding:13px 16px; font-size:16px} .bn-art tbody td{padding:12px 16px; border-top:1px solid var(--bn-border); color:var(--bn-text); vertical-align:top; font-size:16px} .bn-art tbody tr:nth-child(even){background:var(--bn-sand-zebra)} .bn-art tbody td:first-child{font-weight:700; color:var(--bn-ink)} .bn-cols{display:grid; grid-template-columns:1fr 1fr; gap:18px; margin:26px 0} .bn-col{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:22px; box-shadow:var(--bn-sh-sm)} .bn-col h4{margin:0 0 12px; font-size:1.05em; color:var(--bn-ink); display:flex; align-items:center; gap:9px} .bn-col h4 svg{width:20px;height:20px;flex:none} .bn-col.biz h4 svg{color:var(--bn-blue)} .bn-col.cli h4 svg{color:var(--bn-green)} .bn-col.warn h4 svg{color:var(--bn-coral)} .bn-col ul{margin:0; padding:0; list-style:none} .bn-col li{position:relative; padding-left:26px; margin:.55em 0; font-size:.96em} .bn-col li::before{content:\"\"; position:absolute; left:0; top:.5em; width:13px; height:13px; border-radius:50%; background:var(--bn-coral-soft); border:2px solid var(--bn-coral)} .bn-col.biz li::before{background:var(--bn-blue-soft); border-color:var(--bn-blue)} .bn-col.cli li::before{background:var(--bn-green-soft); border-color:var(--bn-green)} .bn-call{ display:flex; gap:14px; border-radius:var(--bn-r); padding:18px 20px; margin:24px 0; background:var(--bn-card); border:1px solid var(--bn-border); box-shadow:var(--bn-sh-sm); } .bn-call svg{width:22px; height:22px; flex:none; margin-top:1px} .bn-call b{color:var(--bn-ink)} .bn-call p{margin:0; font-size:.95em} .bn-call .bn-klabel{margin-bottom:3px} .bn-tip{border-left:4px solid var(--bn-green)} .bn-tip svg{color:var(--bn-green)} .bn-tip .bn-klabel{color:var(--bn-green)} .bn-warn{border-left:4px solid var(--bn-coral)} .bn-warn svg{color:var(--bn-coral)} .bn-warn .bn-klabel{color:var(--bn-coral)} .bn-info{border-left:4px solid var(--bn-blue)} .bn-info svg{color:var(--bn-blue)} .bn-info .bn-klabel{color:var(--bn-blue)} .bn-def{background:var(--bn-blue-soft); border:1px solid var(--bn-blue-line); border-radius:var(--bn-r); padding:20px 24px; margin:24px 0} .bn-def .bn-klabel{color:var(--bn-blue)} .bn-def p{margin:0} .bn-steps{counter-reset:s; list-style:none; padding:0; margin:24px 0} .bn-steps li{position:relative; padding:0 0 4px 56px; margin:0 0 18px; min-height:40px} .bn-steps li::before{ counter-increment:s; content:counter(s); position:absolute; left:0; top:0; width:40px; height:40px; border-radius:12px; background:var(--bn-coral); color:#fff; font-weight:800; font-family:var(--bn-mono); display:flex; align-items:center; justify-content:center; box-shadow:var(--bn-sh-sm); } .bn-steps li b{display:block; color:var(--bn-ink); margin-bottom:2px} .bn-check{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-check h3{margin:.1em 0 .3em} .bn-check>p{font-size:.95em; color:var(--bn-muted); margin-bottom:14px} .bn-check ul{list-style:none; padding:0; margin:0 0 18px} .bn-check li{margin:0; border-top:1px solid var(--bn-border)} .bn-check li:first-child{border-top:none} .bn-check label{display:flex; align-items:flex-start; gap:13px; padding:12px 2px; cursor:pointer; font-size:.97em; color:var(--bn-text)} .bn-check input{appearance:none; -webkit-appearance:none; flex:none; width:22px; height:22px; margin-top:1px; border:2px solid var(--bn-coral-line); border-radius:7px; background:#fff; cursor:pointer; position:relative; transition:.15s} .bn-check input:checked{background:var(--bn-coral); border-color:var(--bn-coral)} .bn-check input:checked::after{content:\"\"; position:absolute; left:6px; top:2px; width:6px; height:11px; border:solid #fff; border-width:0 2.5px 2.5px 0; transform:rotate(45deg)} .bn-result{border-radius:var(--bn-r-sm); padding:16px 18px; background:var(--bn-coral-soft); border:1px solid var(--bn-coral-line); font-size:.96em} .bn-result b{color:var(--bn-ink)} .bn-result .bn-score{font-family:var(--bn-mono); font-weight:700; color:var(--bn-coral)} .bn-result .bnc-res{display:none; margin-top:10px} .bn-result .bnc-res.on{display:block} .bn-result .bnc-res p{margin:0; color:var(--bn-text)} .bn-faq{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); margin:0 0 12px; box-shadow:var(--bn-sh-sm); overflow:hidden} .bn-faq summary{cursor:pointer; padding:17px 20px; font-weight:700; color:var(--bn-ink); list-style:none; display:flex; justify-content:space-between; align-items:center; gap:14px; font-size:1.03em} .bn-faq summary::-webkit-details-marker{display:none} .bn-faq summary::after{content:\"+\"; font-family:var(--bn-mono); font-size:1.5em; color:var(--bn-coral); flex:none; line-height:1; transition:transform .2s} .bn-faq[open] summary::after{transform:rotate(45deg)} .bn-faq .bn-faq-b{padding:0 20px 18px; color:var(--bn-text)} .bn-faq .bn-faq-b p{margin:0} .bn-fig{margin:30px 0; text-align:center} .bn-fig img{width:100%; height:auto; border-radius:var(--bn-r); box-shadow:var(--bn-sh); display:block} .bn-fig figcaption{margin-top:10px; font-size:.85em; color:var(--bn-muted); font-style:italic} .bn-cta{background:var(--bn-ink); border-radius:var(--bn-r); padding:34px 32px; margin:36px 0 12px; text-align:center} .bn-cta h3{color:#fff; margin:0 0 .4em; font-size:1.4em} .bn-cta p{color:#e9e2cf; margin:0 auto 20px; max-width:560px; font-size:1em} .bn-cta-btn{display:inline-block; background:var(--bn-coral); color:#332c19 !important; text-decoration:none !important; font-weight:800; padding:15px 34px; border-radius:999px; font-size:1.02em; box-shadow:0 8px 22px rgba(254,113,107,.35); transition:.15s} .bn-cta-btn:hover{background:#ff8782; color:#fff !important} .bn-quiz{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-quiz .bnq-q{padding:14px 0; border-top:1px solid var(--bn-border)} .bn-quiz .bnq-q:first-of-type{border-top:none; padding-top:4px} .bn-quiz .bnq-qt{font-weight:700; color:var(--bn-ink); margin:0 0 10px; font-size:1.02em} .bn-quiz .bnq-opt{display:flex; align-items:flex-start; gap:12px; padding:9px 12px; margin:6px 0; cursor:pointer; font-size:.96em; color:var(--bn-text); border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); background:#fff; transition:.15s} .bn-quiz .bnq-opt:hover{border-color:var(--bn-coral-line); background:var(--bn-coral-soft)} .bn-quiz .bnq-opt input{appearance:none; -webkit-appearance:none; flex:none; width:20px; height:20px; margin-top:1px; border:2px solid var(--bn-coral-line); border-radius:50%; background:#fff; cursor:pointer; position:relative; transition:.15s} .bn-quiz .bnq-opt input:checked{border-color:var(--bn-coral)} .bn-quiz .bnq-opt input:checked::after{content:\"\"; position:absolute; left:3px; top:3px; width:10px; height:10px; border-radius:50%; background:var(--bn-coral)} .bn-quiz .bnq-opt:has(input:checked){border-color:var(--bn-coral); background:var(--bn-coral-soft)} .bn-quiz .bnq-btn{margin-top:16px; display:inline-block; background:var(--bn-coral); color:#332c19; border:none; font-weight:800; font-size:1em; padding:13px 30px; border-radius:999px; cursor:pointer; box-shadow:0 6px 16px rgba(254,113,107,.28); transition:.15s; font-family:inherit} .bn-quiz .bnq-btn:hover{background:#ff8782} .bn-quiz .bnq-res{display:none; margin-top:18px; padding:18px 20px; border-radius:var(--bn-r-sm); background:var(--bn-blue-soft); border:1px solid var(--bn-blue-line)} .bn-quiz .bnq-res.on{display:block} .bn-quiz #bnq-agent{background:var(--bn-coral-soft); border-color:var(--bn-coral-line)} .bn-quiz #bnq-hybrid{background:var(--bn-green-soft); border-color:#cfe6c4} .bn-quiz .bnq-rt{font-weight:800; color:var(--bn-ink); margin:0 0 6px; font-size:1.08em} .bn-quiz .bnq-res p{margin:0} .bn-spectrum{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-spectrum h3{margin:.1em 0 .3em} .bn-spectrum>p{font-size:.95em; color:var(--bn-muted); margin:0 0 20px} .bn-spec-track{margin:26px 4px 4px} .bn-spec-range{-webkit-appearance:none; appearance:none; width:100%; height:8px; border-radius:999px; background:var(--bn-sand); outline:none; cursor:pointer; margin:0} .bn-spec-range::-webkit-slider-thumb{-webkit-appearance:none; appearance:none; width:26px; height:26px; border-radius:50%; background:var(--bn-coral); border:3px solid #fff; box-shadow:var(--bn-sh-sm); cursor:pointer} .bn-spec-range::-moz-range-thumb{width:26px; height:26px; border-radius:50%; background:var(--bn-coral); border:3px solid #fff; box-shadow:var(--bn-sh-sm); cursor:pointer} .bn-spec-stops{display:flex; justify-content:space-between; margin-top:13px; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.07em; color:var(--bn-muted); gap:8px} .bn-spec-stops span{flex:1; cursor:pointer; transition:.15s; text-align:center} .bn-spec-stops span:first-child{text-align:left} .bn-spec-stops span:last-child{text-align:right} .bn-spec-stops span.on{color:var(--bn-coral); font-weight:700} .bns-pane{display:none; margin-top:22px; border-radius:var(--bn-r-sm); padding:20px 22px; background:var(--bn-sand-2); border:1px solid var(--bn-sand)} .bns-pane.on{display:block} .bns-pane h4{margin:0 0 3px; color:var(--bn-ink); font-size:1.14em} .bns-tag{font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.1em; color:var(--bn-coral); display:block; margin-bottom:11px} .bns-pane>p{margin:0; font-size:.96em; color:var(--bn-text)} .bns-grid{display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-top:15px} .bns-grid div{background:#fff; border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); padding:11px 14px; font-size:.9em; color:var(--bn-text)} .bns-grid b{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.07em; color:var(--bn-muted); margin-bottom:3px} .bn-roi{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-roi h3{margin:.1em 0 .3em} .bn-roi>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-roi-fields{display:grid; grid-template-columns:1fr 1fr; gap:20px 28px; margin:18px 0 24px} .bn-roi-field:last-child{grid-column:1\/-1} .bn-roi-field label{display:block; font-size:.9em; color:var(--bn-text); font-weight:600; margin-bottom:11px} .bn-roi-field output{font-family:var(--bn-mono); font-weight:700; color:var(--bn-coral)} .bn-roi-out{display:grid; grid-template-columns:repeat(3,1fr); gap:16px; margin-top:4px} .bn-roi-stat{background:var(--bn-sand-2); border:1px solid var(--bn-sand); border-radius:var(--bn-r); padding:20px 16px; text-align:center} .bn-roi-stat b{display:block; font-size:1.85em; line-height:1.05; color:var(--bn-coral); font-weight:800; letter-spacing:-.02em; font-family:var(--bn-mono)} .bn-roi-stat:nth-child(2) b{color:var(--bn-blue)} .bn-roi-stat:nth-child(3) b{color:var(--bn-ink)} .bn-roi-stat span{display:block; margin-top:7px; font-size:.82em; color:var(--bn-muted); line-height:1.4} .bn-roi-note{font-size:16px; color:var(--bn-muted); margin:16px 0 0; font-style:italic} .bn-bot{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:22px 24px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-bot h3{margin:.1em 0 .3em} .bn-bot>p{font-size:.95em; color:var(--bn-muted); margin:0 0 16px} .bn-bot-win{border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); background:#fff; overflow:hidden} .bn-bot-bar{display:flex; align-items:center; gap:11px; padding:12px 16px; background:var(--bn-sand-2); border-bottom:1px solid var(--bn-border)} .bn-bot-ava{flex:none; width:32px; height:32px; border-radius:50%; background:var(--bn-coral-soft); display:flex; align-items:center; justify-content:center} .bn-bot-ava svg{width:19px; height:19px; color:var(--bn-coral)} .bn-bot-id b{display:block; color:var(--bn-ink); font-size:.95em; line-height:1.2} .bn-bot-id span{font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; color:var(--bn-green); display:inline-flex; align-items:center; gap:5px} .bn-bot-id span::before{content:\"\"; width:7px; height:7px; border-radius:50%; background:var(--bn-green)} .bn-bot-log{padding:16px; min-height:130px; max-height:320px; overflow-y:auto; display:flex; flex-direction:column; gap:10px} .bn-bot-msg{max-width:82%; padding:10px 14px; border-radius:15px; font-size:.95em; line-height:1.5} .bn-bot-msg.bot{align-self:flex-start; background:var(--bn-sand-2); color:var(--bn-text); border-bottom-left-radius:4px} .bn-bot-msg.user{align-self:flex-end; background:var(--bn-coral); color:#332c19; border-bottom-right-radius:4px} .bn-bot-quick{display:flex; flex-wrap:wrap; gap:8px; padding:2px 16px 14px} .bn-art .bn-bot-qbtn{font-family:inherit; font-size:16px; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-coral-line); border-radius:999px; padding:7px 14px; cursor:pointer; transition:.15s} .bn-art .bn-bot-qbtn:hover{background:var(--bn-coral-soft); border-color:var(--bn-coral)} .bn-bot-form{display:flex; gap:8px; padding:12px 16px; border-top:1px solid var(--bn-border); background:var(--bn-sand-2)} .bn-bot-input{flex:1; min-width:0; font-family:inherit; font-size:.95em; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-border); border-radius:999px; padding:10px 16px; outline:none} .bn-bot-input:focus{border-color:var(--bn-coral)} .bn-art .bn-bot-send{flex:none; font-family:inherit; font-weight:700; font-size:16px; color:#fff; background:var(--bn-coral); border:none; border-radius:999px; padding:10px 20px; cursor:pointer; transition:.15s} .bn-art .bn-bot-send:hover{background:#ff8782} .bn-art .bn-bot-note{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic} .bbot-kb,.bbot-fallback{display:none} .bn-shot{margin:16px 0 2px; border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); background:#fff; overflow:hidden} .bn-shot-bar{display:flex; align-items:center; gap:8px; padding:9px 13px; background:var(--bn-sand-2); border-bottom:1px solid var(--bn-border)} .bn-shot-dot{width:8px;height:8px;border-radius:50%;background:var(--bn-green);flex:none} .bn-shot-bar b{color:var(--bn-ink); font-size:.9em} .bn-shot-bar span{margin-left:auto; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.06em; color:var(--bn-muted)} .bn-shot-log{padding:13px 14px; display:flex; flex-direction:column; gap:8px} .bn-shot .bn-bot-msg{max-width:86%; font-size:.9em} .bn-shot-quick{display:flex; flex-wrap:wrap; gap:6px; margin-top:2px} .bn-shot-quick span{font-size:14px; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-coral-line); border-radius:999px; padding:4px 11px} .bn-exlink{margin:13px 0 0; font-weight:700; display:flex; align-items:center; gap:6px} .bn-exlink svg{width:16px;height:16px;flex:none;color:var(--bn-coral)} .bn-lb{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-lb h3{margin:.1em 0 .3em} .bn-lb>p{font-size:.95em; color:var(--bn-muted); margin:0 0 16px} .bn-lb-ctrl{display:flex; flex-wrap:wrap; gap:11px; align-items:center; margin:0 0 16px} .bn-lb-ctrl br{display:none} .bn-lb-search{flex:1; min-width:200px; font-family:inherit; font-size:16px; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-border); border-radius:999px; padding:11px 18px; outline:none} .bn-lb-search:focus{border-color:var(--bn-coral)} .bn-lb-filters{display:flex; flex-wrap:wrap; gap:8px} .bn-art .bn-lb-fbtn{font-family:inherit; font-size:16px; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-coral-line); border-radius:999px; padding:9px 16px; cursor:pointer; transition:.15s} .bn-art .bn-lb-fbtn:hover{background:var(--bn-coral-soft)} .bn-art .bn-lb-fbtn.on{background:var(--bn-coral); color:#fff; border-color:var(--bn-coral)} .bn-lb .bn-lb-th{cursor:pointer; user-select:none; white-space:nowrap} .bn-lb .bn-lb-th:hover{color:#fbf7ec; opacity:.85} .bn-lb-rank{font-family:var(--bn-mono); font-weight:700; color:var(--bn-coral); text-align:center} .bn-lb-score{font-family:var(--bn-mono); font-weight:700; color:var(--bn-ink); text-align:right; white-space:nowrap} .lb-empty{padding:16px; text-align:center; color:var(--bn-muted); font-size:.95em} .bn-lb-foot{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic} @media(max-width:680px){ .bn-art{font-size:17px} .bn-stats,.bn-grid,.bn-cols,.bn-ex .bn-ba,.bns-grid,.bn-roi-fields,.bn-roi-out{grid-template-columns:1fr} .bn-roi-field:last-child{grid-column:auto} .bn-toc ol{columns:1} .bn-art h2{font-size:1.5em} .bn-bot-msg{max-width:90%} } .bn-art sup,.bn-art sub{font-size:14px;line-height:0} .bn-klabel.hc{color:var(--bn-coral-txt)} .bn-cdc{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-cdc h3{margin:.1em 0 .3em} .bn-cdc>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-cdc br{display:none} .bn-cdc p:empty{display:none; margin:0} .cdc-q{padding:15px 0; border-top:1px solid var(--bn-border)} .cdc-q:first-of-type{border-top:none; padding-top:2px} .bn-art .cdc-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .cdc-chips{display:flex; flex-wrap:wrap; gap:8px} .cdc-chips p:not([class]){display:contents} .bn-art .cdc-chip{display:inline-flex; align-items:center; font-size:16px; line-height:1.35; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-coral-line); border-radius:999px; padding:9px 16px; cursor:pointer; transition:.15s} .bn-art .cdc-chip:hover{background:var(--bn-coral-soft)} .bn-art .cdc-chip:has(input:checked){background:var(--bn-coral); color:#332c19; border-color:var(--bn-coral); font-weight:700} .cdc-chip input{position:absolute; opacity:0; width:1px; height:1px; pointer-events:none} .cdc-out{margin:22px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .cdc-line{padding:14px 0; border-top:1px solid var(--bn-sand)} .cdc-line:first-of-type{border-top:none; padding-top:2px} .cdc-line p:not([class]){margin:0} .bn-art .cdc-line b{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; color:var(--bn-coral-txt); margin-bottom:6px} .bn-art .cdc-line span{display:block; font-size:16px; line-height:1.62; color:var(--bn-text)} .bn-art .cdc-copy{margin-top:18px; display:inline-block; background:var(--bn-coral); color:#332c19; border:none; font-family:inherit; font-weight:800; font-size:16px; padding:13px 28px; border-radius:999px; cursor:pointer; box-shadow:0 6px 16px rgba(254,113,107,.28); transition:.15s} .bn-art .cdc-copy:hover{background:#ff8782} .bn-art .cdc-note{font-size:16px; color:var(--bn-muted); margin:12px 0 0; font-style:italic; min-height:1.5em} @media(max-width:680px){ .cdc-chips{flex-direction:column; align-items:stretch} .bn-art .cdc-chip{justify-content:flex-start} } .bn-niv{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-niv h3{margin:.1em 0 .3em} .bn-niv>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-niv br{display:none} .bn-niv p:empty{display:none; margin:0} .niv-q{padding:15px 0; border-top:1px solid var(--bn-border)} .niv-q:first-of-type{border-top:none; padding-top:2px} .bn-art .niv-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .niv-out{margin:24px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .bn-art .niv-score{display:flex; align-items:baseline; gap:10px; margin:0 0 13px} .bn-art .niv-score b{font-family:var(--bn-mono); font-size:2.1em; line-height:1; color:var(--bn-coral-txt); font-weight:800; letter-spacing:-.02em} .bn-art .niv-score span{font-size:16px; color:var(--bn-muted)} .niv-gauge{height:10px; border-radius:999px; background:var(--bn-sand); overflow:hidden; margin:0 0 18px} .niv-gauge p:not([class]){display:contents} .niv-gauge i{display:block; height:10px; background:var(--bn-coral); border-radius:999px; width:0} .nivv{display:none; border-radius:var(--bn-r-sm); padding:17px 19px; background:#fff; border:1px solid var(--bn-border)} .nivv.on{display:block} .bn-art .nivv b{display:block; font-size:1.08em; color:var(--bn-ink); margin-bottom:5px} .bn-art .nivv p{margin:0; font-size:16px; line-height:1.62} .bn-art .niv-weak{margin:15px 0 0; font-size:16px; color:var(--bn-text)} .bn-art .niv-weak b{font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; color:var(--bn-coral-txt); display:block; margin-bottom:4px} .bn-art blockquote{margin:26px 0; padding:18px 22px; background:var(--bn-card); border:1px solid var(--bn-border); border-left:4px solid var(--bn-blue); border-radius:var(--bn-r); box-shadow:var(--bn-sh-sm)} .bn-art blockquote p{margin:0; font-size:17px; line-height:1.65; color:var(--bn-text)} .bn-chk{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-chk h3{margin:.1em 0 .3em} .bn-chk>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-chk br{display:none} .bn-chk p:empty{display:none; margin:0} .chk-doc{border-radius:var(--bn-r-sm); background:#fff; border:1px solid var(--bn-border); padding:16px 18px; margin:0 0 6px} .bn-art .chk-doc b{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; color:var(--bn-coral-txt); margin-bottom:6px} .bn-art .chk-doc span{display:block; font-size:16px; line-height:1.62; color:var(--bn-text)} .chk-q{padding:15px 0; border-top:1px solid var(--bn-border)} .bn-art .chk-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .chk-out{margin:22px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .chk-pieces{display:grid; gap:10px; margin:0 0 16px} .chk-piece{border-radius:var(--bn-r-sm); background:#fff; border:1px solid var(--bn-border); padding:12px 14px} .chk-piece.hit{border-color:var(--bn-green); background:var(--bn-green-soft)} .bn-art .chk-piece b{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; color:var(--bn-muted); margin-bottom:5px} .bn-art .chk-piece.hit b{color:var(--bn-green)} .bn-art .chk-piece span{display:block; font-size:16px; line-height:1.6; color:var(--bn-text)} .bn-art .chk-verdict{border-radius:var(--bn-r-sm); padding:14px 16px; font-size:16px; line-height:1.55; background:var(--bn-green-soft); border:1px solid #cfe6c4; color:var(--bn-text); margin:0 0 12px} .bn-art .chk-verdict.ko{background:var(--bn-coral-soft); border-color:var(--bn-coral-line)} .bn-art .chk-stats{margin:0; font-size:16px; line-height:1.6; color:var(--bn-text)} .bn-art .chk-stats b{font-family:var(--bn-mono); color:var(--bn-coral-txt); font-weight:700} .bn-dev{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-dev h3{margin:.1em 0 .3em} .bn-dev>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-dev br{display:none} .bn-dev p:empty{display:none; margin:0} .dev-q{padding:15px 0; border-top:1px solid var(--bn-border)} .dev-q:first-of-type{border-top:none; padding-top:2px} .bn-art .dev-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .dev-out{margin:24px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .dev-tiles{display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin:0 0 16px} .dev-stat{background:#fff; border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); padding:16px 12px; text-align:center} .bn-art .dev-stat b{display:block; font-family:var(--bn-mono); font-size:1.5em; line-height:1.12; font-weight:800; letter-spacing:-.02em; color:var(--bn-coral-txt)} .bn-art .dev-stat:nth-child(2) b{color:var(--bn-blue)} .bn-art .dev-stat:nth-child(3) b{color:var(--bn-green)} .bn-art .dev-stat:nth-child(4) b{color:var(--bn-ink)} .bn-art .dev-stat span{display:block; margin-top:7px; font-size:14px; color:var(--bn-muted); line-height:1.4} .bn-art .dev-line{margin:0 0 14px; font-size:16px; line-height:1.6; color:var(--bn-text)} .bn-art .dev-line b{font-family:var(--bn-mono); color:var(--bn-coral-txt); font-weight:700} .dvv{display:none; border-radius:var(--bn-r-sm); padding:16px 18px; background:#fff; border:1px solid var(--bn-border)} .dvv.on{display:block} .bn-art .dvv b{display:block; font-size:1.06em; color:var(--bn-ink); margin-bottom:5px} .bn-art .dvv p{margin:0; font-size:16px; line-height:1.62} @media(max-width:680px){ .dev-tiles{grid-template-columns:1fr 1fr} } .bn-fig.chat img{max-width:400px; margin:0 auto} .bn-fig.doc img{max-width:520px; margin:0 auto} .bn-nlu{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-nlu h3{margin:.1em 0 .3em} .bn-nlu>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-nlu br{display:none} .bn-nlu p:empty{display:none; margin:0} .nlu-q{padding:15px 0; border-top:1px solid var(--bn-border)} .nlu-q:first-of-type{border-top:none; padding-top:2px} .bn-art .nlu-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .bn-art .nlu-in{width:100%; font-family:inherit; font-size:16px; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-border); border-radius:999px; padding:12px 18px; outline:none} .bn-art .nlu-in:focus{border-color:var(--bn-coral)} .nlu-ex{display:flex; flex-wrap:wrap; gap:8px; margin-top:12px} .nlu-ex p:not([class]){display:contents} .bn-art .nlu-exb{font-family:inherit; font-size:16px; line-height:1.35; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-coral-line); border-radius:999px; padding:9px 16px; cursor:pointer; transition:.15s; text-align:left} .bn-art .nlu-exb:hover{background:var(--bn-coral-soft)} .nlu-out{margin:24px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .bn-art .nlu-toks{margin:0 0 14px; font-size:16px; line-height:1.7; color:var(--bn-text)} .bn-art .nlu-toks b{font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.08em; color:var(--bn-coral-txt); display:block; margin-bottom:8px} .bn-art .nlu-tk{display:inline-block; font-family:var(--bn-mono); font-size:14px; background:#fff; border:1px solid var(--bn-border); border-radius:999px; padding:3px 11px; margin:0 6px 6px 0; color:var(--bn-ink)} .nlu-row{display:grid; grid-template-columns:1fr 130px 54px; gap:12px; align-items:center; padding:10px 0; border-top:1px solid var(--bn-sand)} .nlu-row:first-child{border-top:none} .bn-art .nlu-lab{font-size:16px; line-height:1.4; color:var(--bn-ink); font-weight:700} .nlu-bar{height:10px; border-radius:999px; background:var(--bn-sand); overflow:hidden} .nlu-bar i{display:block; height:10px; background:var(--bn-coral); border-radius:999px; width:0} .nlu-row.win .nlu-bar i{background:var(--bn-green)} .bn-art .nlu-sc{font-family:var(--bn-mono); font-size:16px; font-weight:700; color:var(--bn-coral-txt); text-align:right} .nlu-verdict{margin:16px 0 0; border-radius:var(--bn-r-sm); padding:16px 18px; background:#fff; border:1px solid var(--bn-border); border-left:4px solid var(--bn-green)} .nlu-verdict.ko{border-left-color:var(--bn-coral)} .bn-art .nlu-verdict b{display:block; font-size:1.06em; color:var(--bn-ink); margin-bottom:5px} .bn-art .nlu-verdict p{margin:0; font-size:16px; line-height:1.62} .bn-art .nlu-note{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic} @media(max-width:680px){ .nlu-row{grid-template-columns:minmax(0,1fr) 64px 48px; gap:9px} .bn-art .nlu-lab{font-size:16px} } @media(max-width:560px){ .nlu-row{grid-template-columns:minmax(0,1fr) auto; gap:7px 10px; padding:12px 0} .bn-art .nlu-lab{grid-column:1; grid-row:1} .bn-art .nlu-sc{grid-column:2; grid-row:1; text-align:right} .nlu-bar{grid-column:1\/3; grid-row:2} } .bn-art code{font-family:var(--bn-mono); font-size:16px; line-height:1.5; background:var(--bn-sand-2); border:1px solid var(--bn-sand); border-radius:6px; padding:1px 7px; color:var(--bn-ink); word-break:break-word} .bn-art pre{background:var(--bn-sand-2); border:1px solid var(--bn-sand); border-radius:var(--bn-r-sm); padding:16px 18px; overflow-x:auto; margin:22px 0} .bn-art pre code{background:none; border:none; padding:0; font-size:16px} .bn-hd{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-hd h3{margin:.1em 0 .3em} .bn-hd>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-hd br{display:none} .bn-hd p:empty{display:none; margin:0} .hd-q{padding:15px 0; border-top:1px solid var(--bn-border)} .hd-q:first-of-type{border-top:none; padding-top:2px} .bn-art .hd-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .hd-out{margin:22px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .hd-head{display:grid; grid-template-columns:minmax(0,auto) minmax(0,1fr); gap:18px; align-items:center} .hd-n{font-family:var(--bn-mono); font-weight:800; line-height:1; color:var(--bn-ink); white-space:nowrap} .bn-art .hd-n span{font-size:34px} .bn-art .hd-n i{font-style:normal; font-size:16px; color:var(--bn-muted); font-weight:600} .hd-track{position:relative; height:14px; border-radius:999px; background:#fff; border:1px solid var(--bn-sand); overflow:hidden} .hd-fill{position:absolute; left:0; top:0; bottom:0; width:0; background:var(--bn-coral); transition:width .18s} .hd-parts{display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; margin-top:16px} .hd-part{background:#fff; border:1px solid var(--bn-sand); border-radius:var(--bn-r-sm); padding:11px 8px; text-align:center} .bn-art .hd-part span{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.05em; color:var(--bn-muted); line-height:1.3} .bn-art .hd-part b{display:block; font-family:var(--bn-mono); font-size:20px; font-weight:800; color:var(--bn-coral-txt); margin-top:4px} .hdv{display:none; margin-top:18px; border-radius:var(--bn-r-sm); background:#fff; border:1px solid var(--bn-sand); padding:17px 19px} .hdv-1{display:block; border-left:4px solid var(--bn-green)} .hdv-2{border-left:4px solid var(--bn-blue)} .hdv-3{border-left:4px solid var(--bn-coral)} .hdv-4{border-left:4px solid var(--bn-ink)} .bn-art .hdv b{display:block; font-size:18px; line-height:1.4; color:var(--bn-ink); margin-bottom:7px} .bn-art .hdv p{margin:0; font-size:16px; line-height:1.62; color:var(--bn-text)} .bn-art .hd-note{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic; line-height:1.55} @media(max-width:680px){ .bn-hd{padding:20px 17px} .hd-out{padding:17px 15px} .hd-head{grid-template-columns:minmax(0,1fr); gap:12px} .hd-parts{grid-template-columns:repeat(2,minmax(0,1fr))} } .bn-tri{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-tri h3{margin:.1em 0 .3em} .bn-tri>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-tri br{display:none} .bn-tri p:empty{display:none; margin:0} .tri-q{padding:15px 0; border-top:1px solid var(--bn-border)} .tri-q:first-of-type{border-top:none; padding-top:2px} .bn-art .tri-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .tri-out{margin:22px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .triv{display:none; border-radius:var(--bn-r-sm); background:#fff; border:1px solid var(--bn-sand); padding:17px 19px} .triv-1{border-left:4px solid var(--bn-ink)} .triv-2{border-left:4px solid var(--bn-coral)} .triv-3{border-left:4px solid var(--bn-blue)} .triv-4{border-left:4px solid var(--bn-muted)} .triv-5{display:block; border-left:4px solid var(--bn-green)} .bn-art .triv em{display:block; font-style:normal; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.06em; color:var(--bn-coral-txt); margin-bottom:7px; line-height:1.4} .bn-art .triv b{display:block; font-size:18px; line-height:1.4; color:var(--bn-ink); margin-bottom:8px} .bn-art .triv p{margin:0 0 .7em; font-size:16px; line-height:1.62; color:var(--bn-text)} .bn-art .triv p:last-child{margin-bottom:0} .tri-lines{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; margin-top:16px} .tri-line{background:#fff; border:1px solid var(--bn-sand); border-radius:var(--bn-r-sm); padding:13px 15px} .bn-art .tri-line span{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.05em; color:var(--bn-muted); line-height:1.3; margin-bottom:6px} .bn-art .tri-line b{display:block; font-size:16px; line-height:1.55; color:var(--bn-ink); font-weight:600} .bn-art .tri-note{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic; line-height:1.55} .bn-tri .bn-tablewrap{margin-top:22px} .bn-art .tri-load{font-family:var(--bn-mono); font-size:16px; line-height:1.2; color:var(--bn-ink); background:#fff; border:1px solid var(--bn-coral-line); border-radius:999px; padding:8px 15px; cursor:pointer; white-space:nowrap; transition:.15s} .bn-art .tri-load:hover{background:var(--bn-coral-soft)} @media(max-width:680px){ .bn-tri{padding:20px 17px} .tri-out{padding:17px 15px} .tri-lines{grid-template-columns:minmax(0,1fr)} } .bn-art .bn-steps ol{list-style:none;padding:0;margin:0} .bn-art .bn-tip,.bn-art .bn-warn,.bn-art .bn-info{background:var(--bn-card);border:1px solid var(--bn-border);border-radius:var(--bn-r);padding:18px 20px;margin:24px 0;box-shadow:var(--bn-sh-sm)} .bn-art .bn-tip{border-left:4px solid var(--bn-green)} .bn-art .bn-warn{border-left:4px solid var(--bn-coral)} .bn-art .bn-info{border-left:4px solid var(--bn-blue)} .bn-art .bn-tip .bn-klabel,.bn-art .bn-warn .bn-klabel,.bn-art .bn-info .bn-klabel{margin-bottom:6px} .bn-art .bn-tip p,.bn-art .bn-warn p,.bn-art .bn-info p{margin:0} .bn-art .bn-tri table{table-layout:fixed;min-width:640px} .bn-art .bn-tri th:nth-child(1),.bn-art .bn-tri td:nth-child(1){width:22%} .bn-art .bn-tri th:nth-child(2),.bn-art .bn-tri td:nth-child(2){width:14%} .bn-art .bn-tri th:nth-child(3),.bn-art .bn-tri td:nth-child(3){width:14%} .bn-art .bn-tri th:nth-child(4),.bn-art .bn-tri td:nth-child(4){width:13%} .bn-art .bn-tri th:nth-child(5),.bn-art .bn-tri td:nth-child(5){width:22%} .bn-art .bn-tri th:nth-child(6),.bn-art .bn-tri td:nth-child(6){width:15%} .bn-art .bn-tri thead th,.bn-art .bn-tri tbody td{padding:11px 8px} .bn-art .tri-load{padding:4px 10px} .bn-art .bn-cta-in{text-align:center;margin:26px 0} .bn-lng{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-lng h3{margin:.1em 0 .3em} .bn-lng>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-lng br{display:none} .bn-lng p:empty{display:none; margin:0} .lng-q{padding:15px 0; border-top:1px solid var(--bn-border)} .lng-q:first-of-type{border-top:none; padding-top:2px} .bn-art .lng-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .lng-out{margin:22px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .lng-lines{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px} .lng-line{background:#fff; border:1px solid var(--bn-sand); border-radius:var(--bn-r-sm); padding:13px 15px} .bn-art .lng-line b{display:block; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.05em; color:var(--bn-muted); line-height:1.3; margin-bottom:6px} .bn-art .lng-line span{display:block; font-size:16px; line-height:1.55; color:var(--bn-ink); font-weight:600} .lngv{display:none; margin-top:16px; border-radius:var(--bn-r-sm); background:#fff; border:1px solid var(--bn-sand); padding:17px 19px} .lngv-1{display:block; border-left:4px solid var(--bn-blue)} .lngv-2{border-left:4px solid var(--bn-coral)} .lngv-3{border-left:4px solid var(--bn-green)} .lngv-4{border-left:4px solid var(--bn-ink)} .bn-art .lngv em{display:block; font-style:normal; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.06em; color:var(--bn-coral-txt); margin-bottom:7px; line-height:1.4} .bn-art .lngv b{display:block; font-size:18px; line-height:1.4; color:var(--bn-ink); margin-bottom:8px} .bn-art .lngv p{margin:0 0 .7em; font-size:16px; line-height:1.62; color:var(--bn-text)} .bn-art .lngv p:last-child{margin-bottom:0} .bn-art .lng-note{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic; line-height:1.55} .bn-lng .bn-tablewrap{margin-top:22px} .bn-art .bn-lng table{table-layout:fixed; min-width:620px} .bn-art .bn-lng th:nth-child(1),.bn-art .bn-lng td:nth-child(1){width:26%} .bn-art .bn-lng th:nth-child(2),.bn-art .bn-lng td:nth-child(2){width:28%} .bn-art .bn-lng th:nth-child(3),.bn-art .bn-lng td:nth-child(3){width:32%} .bn-art .bn-lng th:nth-child(4),.bn-art .bn-lng td:nth-child(4){width:14%} .bn-art .bn-lng thead th,.bn-art .bn-lng tbody td{padding:11px 10px} @media(max-width:680px){ .bn-lng{padding:20px 17px} .lng-out{padding:17px 15px} .lng-lines{grid-template-columns:minmax(0,1fr)} } .bn-gem{background:var(--bn-card);border:1px solid var(--bn-border);border-radius:var(--bn-r);padding:24px 26px;margin:28px 0;box-shadow:var(--bn-sh)} .bn-gem h3{margin:.1em 0 .3em} .bn-gem>p{font-size:16px;color:var(--bn-muted);margin:0 0 18px} .bn-gem br{display:none} .bn-gem p:empty{display:none;margin:0} .gem-q{padding:15px 0;border-top:1px solid var(--bn-border)} .gem-q:first-of-type{border-top:none;padding-top:2px} .bn-art .gem-qt{font-weight:700;color:var(--bn-ink);margin:0 0 11px;font-size:16px;line-height:1.45} .gem-out{margin:22px 0 0;border-radius:var(--bn-r-sm);background:var(--bn-sand-2);border:1px solid var(--bn-sand);padding:20px 22px} .giv{display:none;border-radius:var(--bn-r-sm);background:#fff;border:1px solid var(--bn-sand);padding:17px 19px;border-left:4px solid var(--bn-coral)} .giv.on{display:block} .giv0{border-left-color:var(--bn-green)} .giv4{border-left-color:var(--bn-blue)} .bn-art .giv em{display:block;font-style:normal;font-family:var(--bn-mono);font-size:14px;text-transform:uppercase;letter-spacing:.06em;color:var(--bn-coral-txt);margin-bottom:7px;line-height:1.4} .bn-art .giv b{display:block;font-size:18px;line-height:1.4;color:var(--bn-ink);margin-bottom:8px} .bn-art .giv p{margin:0;font-size:16px;line-height:1.62;color:var(--bn-text)} .bn-gem .bn-tablewrap{margin-top:22px} @media(max-width:680px){.bn-gem{padding:20px 17px}.gem-out{padding:17px 15px}} .bn-gene{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-gene h3{margin:.1em 0 .3em} .bn-gene>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-gene br{display:none} .bn-gene p:empty{display:none; margin:0} .gene-q{padding:15px 0; border-top:1px solid var(--bn-border)} .gene-q:first-of-type{border-top:none; padding-top:2px} .bn-art .gene-qt{font-weight:700; color:var(--bn-ink); margin:0 0 11px; font-size:16px; line-height:1.45} .gene-out{margin:24px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .gene-tiles{display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; margin:0 0 16px} .gene-stat{background:#fff; border:1px solid var(--bn-border); border-radius:var(--bn-r-sm); padding:16px 12px; text-align:center} .bn-art .gene-stat b{display:block; font-family:var(--bn-mono); font-size:1.5em; line-height:1.12; font-weight:800; letter-spacing:-.02em; color:var(--bn-coral-txt)} .bn-art .gene-stat:nth-child(2) b{color:var(--bn-blue)} .bn-art .gene-stat:nth-child(3) b{color:var(--bn-green)} .bn-art .gene-stat span{display:block; margin-top:7px; font-size:14px; color:var(--bn-muted); line-height:1.4} .bn-art .gene-line{margin:0 0 14px; font-size:16px; line-height:1.6; color:var(--bn-text)} .bn-art .gene-line b{font-family:var(--bn-mono); color:var(--bn-coral-txt); font-weight:700} .gene-v{display:none; border-radius:var(--bn-r-sm); padding:16px 18px; background:#fff; border:1px solid var(--bn-border)} .gene-v.on{display:block} .bn-art .gene-v b{display:block; font-size:1.06em; color:var(--bn-ink); margin-bottom:5px} .bn-art .gene-v p{margin:0; font-size:16px; line-height:1.62} .bn-art .gene-note{margin:14px 0 0; font-size:16px; line-height:1.55; color:var(--bn-muted)} .bn-gene table.gene-data{margin:0 0 4px} .bn-art table.gene-data tbody tr.gene-hit td{background:var(--bn-green-soft)} @media(max-width:680px){ .gene-tiles{grid-template-columns:minmax(0,1fr)} } .bn-bud{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-bud h3{margin:.1em 0 .3em} .bn-bud>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-bud br{display:none} .bn-bud p:empty{display:none; margin:0} .bud-out{margin:22px 0 0; border-radius:var(--bn-r-sm); background:var(--bn-sand-2); border:1px solid var(--bn-sand); padding:20px 22px} .budv{display:none; margin-top:16px; border-radius:var(--bn-r-sm); background:#fff; border:1px solid var(--bn-sand); padding:17px 19px} .budv-1{display:block; border-left:4px solid var(--bn-green)} .budv-2{border-left:4px solid var(--bn-blue)} .budv-3{border-left:4px solid var(--bn-coral)} .budv-4{border-left:4px solid var(--bn-ink)} .bn-art .budv em{display:block; font-style:normal; font-family:var(--bn-mono); font-size:14px; text-transform:uppercase; letter-spacing:.06em; color:var(--bn-coral-txt); margin-bottom:7px; line-height:1.4} .bn-art .budv b{display:block; font-size:18px; line-height:1.4; color:var(--bn-ink); margin-bottom:8px} .bn-art .budv p{margin:0 0 .7em; font-size:16px; line-height:1.62; color:var(--bn-text)} .bn-art .budv p:last-child{margin-bottom:0} .bn-art .bud-note{font-size:16px; color:var(--bn-muted); margin:14px 0 0; font-style:italic; line-height:1.55} .bn-bud .bn-tablewrap{margin-top:22px} @media(max-width:680px){ .bn-bud{padding:20px 17px} .bud-out{padding:17px 15px} } .bn-bil{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-bil h3{margin:.1em 0 .3em} .bn-bil>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-bil br{display:none} .bn-bil p:empty{display:none; margin:0} .bn-bil .tri-out{margin-top:22px} .bn-bil .bn-tablewrap{margin-top:22px} @media(max-width:680px){ .bn-bil{padding:20px 17px} .bn-bil .tri-out{padding:17px 15px} } .bn-b2b{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-b2b h3{margin:.1em 0 .3em} .bn-b2b>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-b2b br{display:none} .bn-b2b p:empty{display:none; margin:0} .bn-b2b .tri-out{margin-top:22px} .bn-b2b .bn-tablewrap{margin-top:22px} @media(max-width:680px){ .bn-b2b{padding:20px 17px} .bn-b2b .tri-out{padding:17px 15px} } data-d*\/data-c* du wrapper, tableau de reference VISIBLE descendant du wrapper avec boutons .tri-load. Defaut visuel sans JS : panneau triv-2 (verdict du combo par defaut). *\/ .bn-bus{background:var(--bn-card); border:1px solid var(--bn-border); border-radius:var(--bn-r); padding:24px 26px; margin:28px 0; box-shadow:var(--bn-sh)} .bn-bus h3{margin:.1em 0 .3em} .bn-bus>p{font-size:.95em; color:var(--bn-muted); margin:0 0 18px} .bn-bus br{display:none} .bn-bus p:empty{display:none; margin:0} .bn-bus .tri-out{margin-top:22px} .bn-bus .tri-lines{grid-template-columns:1fr} .bn-bus .bn-tablewrap{margin-top:22px} .bn-bus .triv-5{display:none} .bn-bus .triv-2{display:block} @media(max-width:680px){ .bn-bus{padding:20px 17px} .bn-bus .tri-out{padding:17px 15px} }`));document.head.appendChild(s);<\/script><\/p>\n<div class=\"bn-art\">\n<div class=\"bn-tldr\">\n<span class=\"bn-klabel\">In brief<\/span>\n<ul>\n<li>A <strong>bus chatbot<\/strong> is a conversational assistant deployed by a bus or coach network (urban, school, interurban) to answer passenger questions: next departures, disruptions, journey planning, tickets and passes, how the network works. It lives wherever the passenger asks the question: the network website, then WhatsApp on travel day.<\/li>\n<li>Bus is not like other transport modes on the data side: since the French mobility orientation law, organising authorities must make their <strong>static and dynamic data accessible and reusable<\/strong> (article L. 1115-1 of the Transport Code). As of 5 October 2026, the National Access Point lists <strong>221 real-time datasets<\/strong> for public transport, 200 of which publish next departures.<\/li>\n<li>French networks are already doing it, dates included: a Messenger chatbot at RATP as early as <strong>September 2017<\/strong>, the <strong>Bonjour RATP connector on ChatGPT<\/strong> (checked on 5 October 2026), the NomadCarBot of Nomad Normandie on <strong>3 November 2025<\/strong>, the WhatsApp chatbot of AuxR\u2019M le bus in Auxerre on <strong>28 May 2026<\/strong>.<\/li>\n<li>Four <strong>architectures<\/strong> are enough to cover every case: an editorial FAQ, plugging in the real-time feed, door-to-door journey planning, tickets and booking. The <strong>router<\/strong> in the middle of this article decides between 72 real situations (network \u00d7 need \u00d7 volume \u00d7 channel).<\/li>\n<li>The cost comes down to three lines: the licence (from 39 \u20ac per month excluding VAT on the Botnation grid checked on 5 October 2026), AI credits (25 \u20ac per 1,000), and the build, free if you do it yourself or <strong>on quote<\/strong> through Botnation\u2019s Enterprise offer.<\/li>\n<\/ul>\n<\/div>\n<p>A bus chatbot mostly makes the news through announcements: a network launches one, a vendor praises its own, and the story stops there. Nothing on how to build the service, on what the law already hands to a network, or on what it costs on a public price list. That is precisely what this article does.<\/p>\n<p>Bus concentrates difficulties that rail does not know: hundreds of networks run by different organising authorities, timetables that change with every school holiday and every new school year, passengers who will not install one app per network, and a spike of questions on the very morning of the trip. A well-built bus chatbot answers all four constraints at once, and the dated examples below show this is no longer theory.<\/p>\n<p>The plan follows the order that matters: what the passenger asks, dated French evidence, what regulatory open data already provides, the four possible architectures with a router to choose, the method, the channels, the law, and today\u2019s public prices. Botnation appears on both sides that count: as the editor of the no-code platform, and as a custom-build provider through its Enterprise offer.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Summary<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #3d351f;color:#3d351f\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #3d351f;color:#3d351f\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#What_the_passenger_asks_a_bus_chatbot_mission_by_mission\" >What the passenger asks a bus chatbot, mission by mission<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Three_French_networks_have_done_it_the_evidence_dated\" >Three French networks have done it: the evidence, dated<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Open_data_changes_the_equation_what_the_law_already_provides\" >Open data changes the equation: what the law already provides<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Four_bus_chatbot_architectures_and_a_router_to_choose\" >Four bus chatbot architectures, and a router to choose<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Which_architecture_for_your_bus_chatbot\" >Which architecture for your bus chatbot?<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#The_method_in_six_steps_from_the_feed_to_the_first_announced_departure\" >The method in six steps, from the feed to the first announced departure<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Web_WhatsApp_the_channel_follows_the_passenger_not_the_other_way_round\" >Web, WhatsApp: the channel follows the passenger, not the other way round<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#AI_and_personal_data_the_minimum_without_ghost_laws\" >AI and personal data: the minimum, without ghost laws<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#What_a_bus_chatbot_costs_three_lines_not_thirty\" >What a bus chatbot costs: three lines, not thirty<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Frequently_asked_questions\" >Frequently asked questions<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/botnation.ai\/en\/bus-chatbot\/#Your_network_already_has_its_questions_start_with_the_first_twenty\" >Your network already has its questions: start with the first twenty<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 id=\"missions\"><span class=\"ez-toc-section\" id=\"What_the_passenger_asks_a_bus_chatbot_mission_by_mission\"><\/span>What the passenger asks a bus chatbot, mission by mission<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A passenger never asks for \u201ca chatbot\u201d. They ask whether their bus is coming, whether it is late, how much the ride costs, and how to get to the station. Here are the six missions that come back on every network, with the concrete condition that makes each one automatable. The condition, not the technology, separates a demo from a service.<\/p>\n<div class=\"bn-tablewrap\">\n<table>\n<thead>\n<tr>\n<th>Mission<\/th>\n<th>Example question<\/th>\n<th>What makes it automatable<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Next departures<\/td>\n<td>\u201cWhen is the next bus to the station?\u201d<\/td>\n<td>A real-time feed per stop (GTFS-RT or SIRI), otherwise the bot states theoretical times and says so<\/td>\n<\/tr>\n<tr>\n<td>Disruptions and roadworks<\/td>\n<td>\u201cIs my line diverted tonight?\u201d<\/td>\n<td>A feed of the network state, and a written rule: what the bot says when it does not know<\/td>\n<\/tr>\n<tr>\n<td>Door-to-door journeys<\/td>\n<td>\u201cHow do I get from home to the shopping centre?\u201d<\/td>\n<td>A journey engine queried by the bot, often the one the network already exposes<\/td>\n<\/tr>\n<tr>\n<td>Tickets, fares, passes<\/td>\n<td>\u201cWhich pass for a student?\u201d<\/td>\n<td>Answers validated by the commercial team, then ticketing to sell or resend<\/td>\n<\/tr>\n<tr>\n<td>Understanding the network<\/td>\n<td>\u201cWhere to buy a ticket, does the line serve the school?\u201d<\/td>\n<td>An editorial FAQ kept up to date: points of sale, accessibility, rules, back-to-school<\/td>\n<\/tr>\n<tr>\n<td>Complaints and lost property<\/td>\n<td>\u201cI left my bag on the 5 pm bus\u201d<\/td>\n<td>A defined route: declaration, information collection, transfer to the right department<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>On almost every network, the first two lines of the table (departures and disruptions) weigh more than half of the questions: that is where a bus chatbot starts, and that is where open data, a bit further down in this article, changes everything. The last four demand validated editorial content, not plumbing: that is writing work with the network\u2019s departments, not an integration project.<\/p>\n<div class=\"bn-tip\">\n<span class=\"bn-klabel\">Starting point<\/span>\n<p>Collect the questions actually asked to the network over the last three months: email, phone, social media, counter queue. That is the raw material. A bus chatbot that answers the questions that actually arrive beats a chatbot that guesses.<\/p>\n<\/div>\n<h2 id=\"preuves\"><span class=\"ez-toc-section\" id=\"Three_French_networks_have_done_it_the_evidence_dated\"><\/span>Three French networks have done it: the evidence, dated<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The story starts badly, and it is useful to know it. As early as <strong>September 2017<\/strong>, RATP launched a chatbot on Facebook Messenger, built with the start-up Minsday: personalised journeys, departure times at favourite stations, disruption alerts. The consulting firm mc2i tested it feature by feature in <strong>May 2020<\/strong>, during the lockdown: of the five features assessed, none scored above 2 out of 3, journey planning dropped to 1 out of 3, and the finding repeats like a leitmotiv: the user journey falls apart, the bot sends users back to the website for what it should display itself. The lesson fits in one sentence: a chatbot that redirects is not a chatbot.<\/p>\n<p>Six years later, the same ambition is served by other channels and real data, this time on bus and coach networks:<\/p>\n<ul>\n<li><strong>Bonjour RATP on ChatGPT<\/strong> (page checked on 5 October 2026): the Paris-area service offers a connector to activate in ChatGPT, then to call with @BonjourRATP. The service page presents it as giving access to \u201citin\u00e9raires, trafic en temps r\u00e9el et titres de transport en \u00cele-de-France, directement dans vos \u00e9changes\u201d (journeys, real-time traffic and travel passes in the Paris region, directly inside your conversations; published in French only, translation ours), covering metro, RER, Transilien, <strong>bus and tram<\/strong>. The passenger gets a journey, the status of a line or a fare tip without leaving the conversation.<\/li>\n<li><strong>NomadCarBot, Nomad network (Normandy)<\/strong>: in its announcement of <strong>3 November 2025<\/strong>, for the fifth anniversary of the NOMAD Car coach network, the region presents an assistant available on its website around the clock, seven days a week, plus a \u201cNext departures\u201d module showing the theoretical coach times at a given stop, for commercial lines, on any date. The announcement states it is experimenting with real-time timetable diffusion, roadworks and diversions included, starting with a first batch of lines.<\/li>\n<li><strong>AuxR\u2019M le bus (Auxerre urban area)<\/strong>: on <strong>28 May 2026<\/strong>, the network announced a chatbot built into WhatsApp. The announcement text deserves quoting, because it lists the actual scope: \u201caccompagnement pour comprendre le r\u00e9seau, recherche d\u2019un horaire, recherche d\u2019un tarif, prendre rendez-vous en agence virtuelle ou encore vous rediriger vers les r\u00e9servations Flexibus\u201d (guidance to understand the network, timetable lookup, fare lookup, booking an appointment at the virtual agency, or redirecting you to Flexibus bookings; published in French only, translation ours). That is three of the six missions in the table above, plus appointments and demand-responsive transport, on the channel the passenger already holds.<\/li>\n<\/ul>\n<p>The triptych speaks for itself: a national multi-network operator goes through ChatGPT, a regional coach network puts the assistant on its website, a medium-sized urban network picks WhatsApp. Three channels, one movement. For rail, our <a href=\"https:\/\/botnation.ai\/en\/transport-chatbot\/\">transport chatbot overview<\/a> documents a much larger regional deployment, with its 23 million exchanged messages; this article deliberately stays on bus and coach.<\/p>\n<figure class=\"bn-fig\"><img fetchpriority=\"high\" fetchpriority=\"high\" src=\"https:\/\/botnation.ai\/wp-content\/uploads\/2026\/10\/botnation-ai-chatbot-bus-in1.jpg\" alt=\"Hands in a cream sweater consult a blank transit network map on a light-wood table, a phone showing empty conversation bubbles and two blank bus tickets\" decoding=\"async\" width=\"1536\" height=\"1024\"><figcaption>Next departures, fare, journey: three questions that arrive on the morning of the trip, asked by the passenger from their phone.<\/figcaption><\/figure>\n<h2 id=\"opendata\"><span class=\"ez-toc-section\" id=\"Open_data_changes_the_equation_what_the_law_already_provides\"><\/span>Open data changes the equation: what the law already provides<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Here is the point commercial pages do not make: since the French mobility orientation law of 24 December 2019, connecting a chatbot to a network\u2019s data is no longer a commercial negotiation with the operator, it is a right set by the Transport Code. Article L. 1115-1 (created by article 25 of the law, version in force checked on 5 October 2026 against the consolidated text) requires organising authorities and their ecosystems to <a href=\"https:\/\/www.legifrance.gouv.fr\/codes\/article_lc\/LEGIARTI000051561120\" rel=\"nofollow noopener\" target=\"_blank\">make their data accessible<\/a>. The text is explicit: data holders must \u201cmettent \u00e0 jour et rendent accessibles et r\u00e9utilisables\u201d (update and make accessible and reusable) the \u201cdonn\u00e9es statiques et historiques observ\u00e9es ainsi que les donn\u00e9es dynamiques concernant les d\u00e9placements et la circulation\u201d (observed static and historical data as well as dynamic data on travel and traffic; published in French only, translation ours). And to remove any ambiguity about who supplies what, the text says: \u201cPour les services de transport qu\u2019elles organisent, les autorit\u00e9s mentionn\u00e9es au 1\u00b0 du pr\u00e9sent article sont responsables de la fourniture des donn\u00e9es\u201d (for the transport services they organise, the authorities mentioned in point 1 of this article are responsible for supplying the data), the task being delegable to transport operators or to operators of passenger information and operating aid systems.<\/p>\n<p>Concretely, this data lands on the <a href=\"https:\/\/transport.data.gouv.fr\/\" rel=\"nofollow noopener\" target=\"_blank\">National Access Point<\/a>, transport.data.gouv.fr, whose home page reminds producers in these words: \u201cvous \u00eates tenus de publier vos donn\u00e9es relatives \u00e0 l\u2019information voyageur sur le Point d\u2019Acc\u00e8s National\u201d (you are required to publish your passenger information data on the National Access Point; French only, translation ours). Its dashboard, checked on 5 October 2026, gives the real state of the reservoir:<\/p>\n<div class=\"bn-stats\">\n<div class=\"bn-stat\"><b>221<\/b><span>real-time datasets (GTFS-RT) for public transport<\/span><\/div>\n<div class=\"bn-stat\"><b>200<\/b><span>of them publish next departures, 77 publish traffic information<\/span><\/div>\n<div class=\"bn-stat\"><b>76.7%<\/b><span>of the population covered by open theoretical timetables<\/span><\/div>\n<\/div>\n<figure class=\"bn-fig\"><img src=\"https:\/\/botnation.ai\/wp-content\/uploads\/2026\/10\/botnation-ai-chatbot-bus-cap1-pan-gtfsrt.png\" alt=\"Screenshot of the National Access Point dashboard: 490 GTFS datasets, 168 NeTEx, 221 GTFS-RT including 200 next-departure feeds and 77 traffic feeds, 43 SIRI\" decoding=\"async\" width=\"1500\" height=\"1050\"><figcaption>The National Access Point dashboard on 5 October 2026, real-time feeds counted line by line (screenshot of transport.data.gouv.fr, statistics page; the dashboard is published in French only).<\/figcaption><\/figure>\n<p>The formats are not exotic: theoretical timetables arrive as GTFS or NeTEx, real time as GTFS-RT or SIRI. These feeds are exactly what a chatbot queries to answer \u201cwhen is the next bus\u201d without inventing: vehicle positions, next departures at the stop, traffic information messages. If the reader\u2019s network is among the 362 organising authorities whose theoretical timetables are published, the technical question is not obtaining the data, but consuming it properly: polling frequency, handling stops without a feed, an explicit fallback on the theoretical timetable.<\/p>\n<div class=\"bn-info\">\n<span class=\"bn-klabel\">Check before you promise<\/span>\n<p>The National Access Point counter counts datasets, not freshness commitments. Before writing \u201creal time\u201d on the network\u2019s page, check on the dashboard that your network actually publishes next departures in GTFS-RT or SIRI, and test the feed on a roadworks day: that is the day the answer matters.<\/p>\n<\/div>\n<h2 id=\"architecture\"><span class=\"ez-toc-section\" id=\"Four_bus_chatbot_architectures_and_a_router_to_choose\"><\/span>Four bus chatbot architectures, and a router to choose<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Every successful project stacks on the same ladder: start with what does not move (the network FAQ), plug in what moves (the real-time feed), add journey computation, and only then selling and booking. Each step justifies itself, and the router below tells you which one your project starts with.<\/p>\n<div class=\"bn-bus\" id=\"bn-bus\" data-r0=\"Urban bus: dense lines, many stops, questions spread across the day and concentrated at peak hours.\" data-r1=\"School and peri-urban: the new school year creates the annual spike, parents ask first, pupils follow, and catchment areas change from one year to the next.\" data-r2=\"Interurban coaches: long lines, fine-grained coverage, stable theoretical timetables, and more and more demand-responsive transport to book.\" data-d0=\"The next-departure and traffic-information feed (GTFS-RT or SIRI), plus the theoretical GTFS for fallback.\" data-d1=\"The same feeds, queried by a journey engine: often the one the network or the organising authority already exposes.\" data-d2=\"The network\u2019s ticketing through the sales system API: m-tickets, passes, answer sanity checks by the commercial team.\" data-d3=\"Everything above, behind a single passenger account holding tickets, bookings and history.\" data-c0=\"The network website: a widget on the home page and on the timetables page, where the question is born.\" data-c1=\"The website for the upstream, WhatsApp for travel day: the channel the passenger already has, with no app to install.\">\n<h3><span class=\"ez-toc-section\" id=\"Which_architecture_for_your_bus_chatbot\"><\/span>Which architecture for your bus chatbot?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Four answers, one verdict, the rule that wins. Or load a real case from the table below.<\/p>\n<div class=\"tri-q\">\n<p class=\"tri-qt\">1. Your network is mostly<\/p>\n<div class=\"cdc-chips\">\n<label class=\"cdc-chip\" for=\"bsf-r0\"><input type=\"radio\" name=\"busR\" id=\"bsf-r0\" data-p=\"0\" checked>Urban bus<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-r1\"><input type=\"radio\" name=\"busR\" id=\"bsf-r1\" data-p=\"1\">School, peri-urban<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-r2\"><input type=\"radio\" name=\"busR\" id=\"bsf-r2\" data-p=\"2\">Interurban coaches<\/label>\n<\/div>\n<\/div>\n<div class=\"tri-q\">\n<p class=\"tri-qt\">2. The passengers\u2019 dominant need<\/p>\n<div class=\"cdc-chips\">\n<label class=\"cdc-chip\" for=\"bsf-n0\"><input type=\"radio\" name=\"busN\" id=\"bsf-n0\" data-p=\"0\" checked>Timetables and disruptions<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-n1\"><input type=\"radio\" name=\"busN\" id=\"bsf-n1\" data-p=\"1\">Door-to-door journeys<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-n2\"><input type=\"radio\" name=\"busN\" id=\"bsf-n2\" data-p=\"2\">Tickets and passes<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-n3\"><input type=\"radio\" name=\"busN\" id=\"bsf-n3\" data-p=\"3\">Everything, selling included<\/label>\n<\/div>\n<\/div>\n<div class=\"tri-q\">\n<p class=\"tri-qt\">3. Questions per month<\/p>\n<div class=\"cdc-chips\">\n<label class=\"cdc-chip\" for=\"bsf-v0\"><input type=\"radio\" name=\"busV\" id=\"bsf-v0\" data-p=\"0\" checked>1,000 to 10,000<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-v1\"><input type=\"radio\" name=\"busV\" id=\"bsf-v1\" data-p=\"1\">Fewer than 1,000<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-v2\"><input type=\"radio\" name=\"busV\" id=\"bsf-v2\" data-p=\"2\">More than 10,000<\/label>\n<\/div>\n<\/div>\n<div class=\"tri-q\">\n<p class=\"tri-qt\">4. Target channels<\/p>\n<div class=\"cdc-chips\">\n<label class=\"cdc-chip\" for=\"bsf-c0\"><input type=\"radio\" name=\"busC\" id=\"bsf-c0\" data-p=\"0\" checked>Network website<\/label><br>\n<label class=\"cdc-chip\" for=\"bsf-c1\"><input type=\"radio\" name=\"busC\" id=\"bsf-c1\" data-p=\"1\">Website + WhatsApp<\/label>\n<\/div>\n<\/div>\n<div class=\"tri-out\">\n<div class=\"tri-lines\">\n<div class=\"tri-line\"><span>Network<\/span><b id=\"bus-reseau\">Urban bus: dense lines, many stops, questions spread across the day and concentrated at peak hours.<\/b><\/div>\n<div class=\"tri-line\"><span>Data to plug in<\/span><b id=\"bus-donnee\">The next-departure and traffic-information feed (GTFS-RT or SIRI), plus the theoretical GTFS for fallback.<\/b><\/div>\n<div class=\"tri-line\"><span>Recommended channel<\/span><b id=\"bus-canal\">The network website: a widget on the home page and on the timetables page, where the question is born.<\/b><\/div>\n<\/div>\n<div class=\"triv triv-2\" id=\"busv-2\">\n<em>Rule: timetables and disruptions live in real time<\/em><br>\n<b>Level 2: plug in the real-time feed<\/b>\n<p>The heart of a bus chatbot: the next departures at the requested stop, and the state of the line during roadworks. If the network publishes on the National Access Point, this level is mostly clean integration work: feed polling frequency, an explicit fallback on the theoretical timetable, and a fixed formula when the feed does not answer. This has been the level of AuxR\u2019M le bus since 28 May 2026.<\/p>\n<\/div>\n<div class=\"triv triv-1\" id=\"busv-1\">\n<em>Rule: small volume, stable questions<\/em><br>\n<b>Level 1: the editorial FAQ, kept by hand<\/b>\n<p>Fares, points of sale, accessibility, rules, how the network works: everything that changes twice a year, at holidays and at back-to-school. For a small network under a thousand questions a month, this level already delivers a measurable service, with no data connection at all. The condition: someone at the network re-reads the answers at every change of period.<\/p>\n<\/div>\n<div class=\"triv triv-3\" id=\"busv-3\">\n<em>Rule: journey planning requires an engine<\/em><br>\n<b>Level 3: door-to-door journeys<\/b>\n<p>\u201cHow do I get from home to the station\u201d is not answered by an FAQ: it takes an engine crossing timetables, connections and walking. The good news: most organising authorities already expose one. The chatbot then becomes a conversational front end over that engine, which is exactly what the Paris-region connector checked on 5 October 2026 does. The trap already observed in 2020: a journey that ignores ongoing disruptions makes the whole service lose credibility.<\/p>\n<\/div>\n<div class=\"triv triv-4\" id=\"busv-4\">\n<em>Rule: selling or booking touches the passenger account<\/em><br>\n<b>Level 4: tickets, passes, booking<\/b>\n<p>Selling a ticket, managing a pass, booking demand-responsive transport: the bot enters orders and personal data. This level requires the network\u2019s ticketing as an API, a passenger account, and the legal rules around selling: our article on the <a href=\"https:\/\/botnation.ai\/en\/ticketing-chatbot\/\">ticketing chatbot<\/a> details those rules, which apply to a bus ticket as much as to a show seat.<\/p>\n<\/div>\n<div class=\"triv triv-5\" id=\"busv-5\">\n<em>Rule: school transport lives by the calendar<\/em><br>\n<b>School network: the calendar before the technology<\/b>\n<p>On a school or peri-urban network with real volume, everything is decided in a few weeks: back-to-school registrations, catchment areas, whether the line serves the school, the first days of September. The winning architecture crosses the back-to-school FAQ, line alerts (roadworks, snow, strikes) and WhatsApp, where the parents are. That is the choice announced by the Auxerre network on 28 May 2026, which also routes to demand-responsive booking.<\/p>\n<\/div>\n<p class=\"tri-note\">The cascade applies in order: selling or booking first (level 4), then journeys (level 3), then real time (level 2), the FAQ holding the bottom of the ladder. The school case departs from it: when back-to-school makes the volume, the calendar picks the architecture. One network, one step: copy this table into your specifications.<\/p>\n<\/div>\n<div class=\"bn-tablewrap\">\n<table>\n<thead>\n<tr>\n<th>Real question<\/th>\n<th>Network<\/th>\n<th>Volume<\/th>\n<th>Verdict<\/th>\n<th>Load<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr data-r=\"0\" data-n=\"0\" data-v=\"0\" data-c=\"1\">\n<td>\u201cWhen is the next bus to the station?\u201d<\/td>\n<td>Urban<\/td>\n<td>1,000 to 10,000<\/td>\n<td>Level 2<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"0\" data-n=\"0\" data-v=\"2\" data-c=\"0\">\n<td>\u201cIs my line diverted because of roadworks?\u201d<\/td>\n<td>Urban<\/td>\n<td>More than 10,000<\/td>\n<td>Level 2<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"0\" data-n=\"2\" data-v=\"0\" data-c=\"0\">\n<td>\u201cWhich pass for a student?\u201d<\/td>\n<td>Urban<\/td>\n<td>1,000 to 10,000<\/td>\n<td>Level 4<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"2\" data-n=\"3\" data-v=\"1\" data-c=\"1\">\n<td>\u201cI cannot book my demand-responsive ride\u201d<\/td>\n<td>Interurban<\/td>\n<td>Fewer than 1,000<\/td>\n<td>Level 4<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"2\" data-n=\"2\" data-v=\"0\" data-c=\"0\">\n<td>\u201cWhere to buy a return ticket for line 40?\u201d<\/td>\n<td>Interurban<\/td>\n<td>1,000 to 10,000<\/td>\n<td>Level 4<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"1\" data-n=\"0\" data-v=\"0\" data-c=\"1\">\n<td>\u201cDoes the line serve the high school since September?\u201d<\/td>\n<td>School<\/td>\n<td>1,000 to 10,000<\/td>\n<td>School network<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"1\" data-n=\"0\" data-v=\"2\" data-c=\"0\">\n<td>\u201cSchool transport registration: which documents?\u201d<\/td>\n<td>School<\/td>\n<td>More than 10,000<\/td>\n<td>School network<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"0\" data-n=\"1\" data-v=\"1\" data-c=\"0\">\n<td>\u201cHow do I get from home to the shopping centre?\u201d<\/td>\n<td>Urban<\/td>\n<td>Fewer than 1,000<\/td>\n<td>Level 3<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"0\" data-n=\"0\" data-v=\"1\" data-c=\"0\">\n<td>\u201cIs the network wheelchair accessible?\u201d<\/td>\n<td>Urban<\/td>\n<td>Fewer than 1,000<\/td>\n<td>Level 1<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<tr data-r=\"2\" data-n=\"0\" data-v=\"1\" data-c=\"1\">\n<td>\u201cLine 40 timetables on Sunday?\u201d<\/td>\n<td>Interurban<\/td>\n<td>Fewer than 1,000<\/td>\n<td>Level 1<\/td>\n<td><button type=\"button\" class=\"tri-load\">Load<\/button><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For reference, the same ladder in one table, with what most often jams at each step:<\/p>\n<div class=\"bn-tablewrap\">\n<table>\n<thead>\n<tr>\n<th>Level<\/th>\n<th>What the passenger gets<\/th>\n<th>What needs connecting<\/th>\n<th>What often jams<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1. Editorial FAQ<\/td>\n<td>Fares, points of sale, rules, accessibility<\/td>\n<td>Nothing: content written and validated by the network<\/td>\n<td>Content ages at every holiday: schedule the re-read<\/td>\n<\/tr>\n<tr>\n<td>2. Real time<\/td>\n<td>Next departures at the stop, state of the line<\/td>\n<td>The network\u2019s or the authority\u2019s GTFS-RT or SIRI feed<\/td>\n<td>The fallback on the theoretical timetable must be stated, never hidden<\/td>\n<\/tr>\n<tr>\n<td>3. Journeys<\/td>\n<td>Door-to-door routes with connections<\/td>\n<td>The network\u2019s existing journey engine, queried by the bot<\/td>\n<td>A route ignoring ongoing disruptions serves the passenger poorly<\/td>\n<\/tr>\n<tr>\n<td>4. Selling and booking<\/td>\n<td>Buy a ticket, manage a pass, book demand-responsive transport<\/td>\n<td>Ticketing as an API, a passenger account<\/td>\n<td>Selling law and personal data, to frame in the specifications from day one<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<figure class=\"bn-fig\"><img src=\"https:\/\/botnation.ai\/wp-content\/uploads\/2026\/10\/botnation-ai-chatbot-bus-in2.jpg\" alt=\"Clay 3D model of a cream toy bus feeding a conveyor of blank cards towards three coral, blue and sage green tracks ending in a speech bubble, a clock and a stack of tickets\" decoding=\"async\" width=\"1536\" height=\"1024\"><figcaption>One conversation, four storeys: the static answer, real time, journey computation, selling. Each step justifies itself.<\/figcaption><\/figure>\n<h2 id=\"methode\"><span class=\"ez-toc-section\" id=\"The_method_in_six_steps_from_the_feed_to_the_first_announced_departure\"><\/span>The method in six steps, from the feed to the first announced departure<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol class=\"bn-steps\">\n<li><b>Collect the real questions.<\/b> Three months of requests to the network: email, phone, social media, counter. Keep them with their exact wording, typos on stop names included: they will serve as recognition tests later.<\/li>\n<li><b>Check what exists on the data side.<\/b> On the National Access Point, search for the network: theoretical timetables in GTFS or NeTEx, real-time feeds in GTFS-RT or SIRI. This ten-minute check decides whether the project starts at level 1 or level 2 of the ladder.<\/li>\n<li><b>Pick the starting step with the router.<\/b> Network, dominant need, volume, channels: the verdict above gives the starting architecture and its actual scope. Never promise more than the step holds, above all never \u201creal time\u201d without a feed.<\/li>\n<li><b>Write the answers with the network\u2019s teams.<\/b> Fares with the commercial team, rules with legal, accessibility with the department in charge. The bot assembles these validations, it does not replace them.<\/li>\n<li><b>Connect, and test on a roadworks day.<\/b> A real-time feed is judged when it is useful: polling at different hours, stops without a feed, a diverted line. Fallback behaviour is part of the requirements, on the same level as the nominal answer.<\/li>\n<li><b>Measure, and grow the ladder.<\/b> Questions resolved without human takeover, response time, top of misunderstood questions: these three numbers decide the move to the next step. <a href=\"https:\/\/botnation.ai\/en\/products\/client-support\/\">Human takeover<\/a> is settled before going live, not after.<\/li>\n<\/ol>\n<p>These six steps are the bus declination of a general method described in our article on the <a href=\"https:\/\/botnation.ai\/en\/transport-chatbot\/\">transport chatbot<\/a>, which covers the topic beyond bus alone: that is where you will find the mission panorama, the build-versus-outsource decision, and the rail-side evidence.<\/p>\n<h2 id=\"canaux\"><span class=\"ez-toc-section\" id=\"Web_WhatsApp_the_channel_follows_the_passenger_not_the_other_way_round\"><\/span>Web, WhatsApp: the channel follows the passenger, not the other way round<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The channel choice is not aesthetic, it is calendar-driven. Before the trip, the question is born on the network website, while checking timetables: the widget lives on the home page and on the timetables page. On travel day, the passenger is outside, on their phone, and will not install an application for a network they ride twice a week: that is where WhatsApp wins, and it is the explicit choice of the Auxerre network on 28 May 2026. One scenario lives on both channels, the history following the conversation.<\/p>\n<p>The argument is not new, but it has changed scale: back in 2017, the Paris Messenger chatbot showed you could reach the passenger without a dedicated app, with the limits of the time; in 2026, the same reasoning deploys on WhatsApp for a medium-sized urban network, on the website for a regional coach network, and even inside ChatGPT for the Paris multi-network service. Our pages on <a href=\"https:\/\/botnation.ai\/en\/channels\/\">deployment channels<\/a> detail these integrations, and the <a href=\"https:\/\/botnation.ai\/en\/shared-mobility-chatbot\/\">Hello Scoot testimony<\/a> shows another kind of mobility, shared this one, that automated its recurring questions on social media with the same platform.<\/p>\n<h2 id=\"droit\"><span class=\"ez-toc-section\" id=\"AI_and_personal_data_the_minimum_without_ghost_laws\"><\/span>AI and personal data: the minimum, without ghost laws<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Three rules frame a bus chatbot, and none of them is decorative. The first comes from the European AI regulation, in application since 2 August 2026: its article 50, paragraph 1, requires that AI systems intended to interact directly with people be designed so that the people concerned \u201care informed that they are interacting with an AI system\u201d, unless this is obvious from the point of view of a natural person who is reasonably well-informed, observant and circumspect (text of <a href=\"https:\/\/eur-lex.europa.eu\/legal-content\/EN\/TXT\/?uri=CELEX:32024R1689\" rel=\"nofollow noopener\" target=\"_blank\">regulation (EU) 2024\/1689 on EUR-Lex<\/a>). For a bus chatbot, the application is simple: the first message announces the automated agent, then the bot does its work.<\/p>\n<p>The second is the GDPR, as soon as the bot touches personal data: a lost-property claim, a school file, a passenger account at level 4 of the ladder. Stated purpose, retention period, legal basis: nothing specific to bus, but it gets written into the specifications. The third is a referral: selling tickets inside a conversation adds the rules specific to ticketing (withdrawal, resale, proof of purchase), which our article on the <a href=\"https:\/\/botnation.ai\/en\/ticketing-chatbot\/\">ticketing chatbot<\/a> documents rule by rule with the consolidated texts. Finally, the open-data obligation seen above is not a constraint on the chatbot, it is its fuel: it is what puts the feeds within reach.<\/p>\n<h2 id=\"prix\"><span class=\"ez-toc-section\" id=\"What_a_bus_chatbot_costs_three_lines_not_thirty\"><\/span>What a bus chatbot costs: three lines, not thirty<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The tally always comes down to the same three lines: the platform licence, the credits consumed by the AI, and the build. Botnation\u2019s public grid, checked on 5 October 2026, fixes the first two:<\/p>\n<div class=\"bn-tablewrap\">\n<table>\n<thead>\n<tr>\n<th>Cost line<\/th>\n<th>Checked on 5 October 2026<\/th>\n<th>What makes it vary<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Platform licence<\/td>\n<td>Free 0 \u20ac, Basic 39 \u20ac per month, Pro 59 \u20ac per month, Entreprise on demand (excluding VAT)<\/td>\n<td>The number of users to serve and the advanced features; the Entreprise offer literally includes \u201cChatbot creation management\u201d<\/td>\n<\/tr>\n<tr>\n<td>AI credits<\/td>\n<td>Packs of 1,000 credits at 25 \u20ac, 5,000 at 100 \u20ac, 15,000 at 250 \u20ac, 60,000 at 900 \u20ac; user outside a plan 0.05 \u20ac per month<\/td>\n<td>The volume of AI requests (answers on the network\u2019s connected data, like theoretical timetables, do not consume generative AI)<\/td>\n<\/tr>\n<tr>\n<td>Build<\/td>\n<td>On your own on the platform: your team\u2019s time; entrusted to the Botnation team: on quote<\/td>\n<td>The scope: amount of content to validate, feed connections, channels, human takeover to organise<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<figure class=\"bn-fig\"><img src=\"https:\/\/botnation.ai\/wp-content\/uploads\/2026\/10\/botnation-ai-chatbot-bus-cap2en-pricing.png\" alt=\"Screenshot of the botnation.ai pricing grid: Free 0 euro, Basic 39 euros per month, Pro 59 euros per month, Entreprise on demand with chatbot creation management\" decoding=\"async\" width=\"1250\" height=\"663\"><figcaption>The public grid of botnation.ai checked on 5 October 2026: the Entreprise line carries \u201cChatbot creation management\u201d, on demand.<\/figcaption><\/figure>\n<p>For a delegated build, the public FAQ of the grid itself gives the market order of magnitude: outside a SaaS subscription, \u201cit will generally cost between \u20ac5,000 and \u20ac30,000, or even more, depending on the features you need\u201d. That range is the market\u2019s, not a Botnation price: the quote is built on the actual scope, and nothing else. This is also where Botnation\u2019s dual positioning makes sense: the team that builds is the team that edits the platform, so there is no intermediary to take over, and the network keeps control of its account, its scenarios and its database in the no-code editor after delivery. A third-party agency remains legitimate when an integrator already knows the network\u2019s information system: what matters is that the choice is made with full knowledge.<\/p>\n<h2 id=\"faq\"><span class=\"ez-toc-section\" id=\"Frequently_asked_questions\"><\/span>Frequently asked questions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<details class=\"bn-faq\">\n<summary>What exactly is a bus chatbot?<\/summary>\n<div class=\"bn-faq-b\">\n<p>A conversational assistant deployed by a bus or coach network, reachable on the network\u2019s website, on WhatsApp or on messaging apps, answering passenger questions: next departures, disruptions, journeys, tickets and passes, how the network works. Its specificity, compared with a scripted bot, is that it can plug into the network\u2019s data, theoretical as well as real time.<\/p>\n<\/div>\n<\/details>\n<details class=\"bn-faq\">\n<summary>Can a small network afford to start?<\/summary>\n<div class=\"bn-faq-b\">\n<p>Yes, and it is actually where the return is most visible: a few hundred questions a month are enough to measure the service. Level 1 of the ladder (the editorial FAQ) requires no data connection, and the platform\u2019s free licence lets you build before paying. The real starting expense is the time spent writing the answers with the network\u2019s teams.<\/p>\n<\/div>\n<\/details>\n<details class=\"bn-faq\">\n<summary>Is real time mandatory to be useful?<\/summary>\n<div class=\"bn-faq-b\">\n<p>No, but you must not claim it without having it. A network without a real-time feed already delivers a service with theoretical timetables, provided it says so: \u201ctheoretical times, taken from the timetable in force\u201d. The worst is ambiguity: an answer presented as real time that comes from a theoretical file destroys the credibility of the whole service. Before promising, check what your network publishes on the National Access Point.<\/p>\n<\/div>\n<\/details>\n<details class=\"bn-faq\">\n<summary>How long does it take to deploy a bus chatbot?<\/summary>\n<div class=\"bn-faq-b\">\n<p>The first useful path, timetables FAQ and transfer to a human, is assembled in half a day on a no-code platform. The version that holds the road, with a real-time feed, content validated by the network\u2019s teams and organised human takeover, is counted in weeks. The calendar depends almost entirely on data availability and answer validation, not on technique.<\/p>\n<\/div>\n<\/details>\n<details class=\"bn-faq\">\n<summary>Does the chatbot replace the network\u2019s app?<\/summary>\n<div class=\"bn-faq-b\">\n<p>It does not replace it, it comes first. Many passengers do not download an app for occasional use: the chatbot serves them where they already are, on the web and in WhatsApp. For heavy uses (named ticketing, push notifications), the app keeps its advantages; for the question of the moment, the conversation wins. The two meet at level 4 of the ladder, behind a single passenger account.<\/p>\n<\/div>\n<\/details>\n<details class=\"bn-faq\">\n<summary>Who answers when the chatbot does not know?<\/summary>\n<div class=\"bn-faq-b\">\n<p>Human takeover is decided before going live: transfer to an agent with the full history, or opening a ticket routed to the relevant department. Three things get defined in writing: coverage hours, the response time announced to the passenger, and who checks that the file is complete. A bus chatbot that fails silently is worse than absent: it discourages the second question.<\/p>\n<\/div>\n<\/details>\n<div class=\"bn-cta\">\n<h3><span class=\"ez-toc-section\" id=\"Your_network_already_has_its_questions_start_with_the_first_twenty\"><\/span>Your network already has its questions: start with the first twenty<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Take the last three months of requests, sort them on the four-architecture ladder, and build the first scenario yourself on the platform; or entrust the build to the team that edits it, under the Entreprise offer, on quote.<\/p>\n<p><a class=\"bn-cta-btn\" href=\"https:\/\/botnation.ai\/en\/pricing\/\">See the pricing grid<\/a><\/p>\n<p><a href=\"https:\/\/botnation.ai\/en\/contact\/\" style=\"color:#f6c9c6\">Talk to our chatbot experts<\/a> or <a href=\"https:\/\/botnation.ai\/en\/contact\/\" style=\"color:#f6c9c6\">request a quote for your chatbot build<\/a>.<\/p>\n<\/div>\n<p class=\"bn-src\"><strong>Sources.<\/strong> French Transport Code, article <em>L1115-1<\/em> (created by article 25 of law no. 2019-1428 of 24 December 2019, the mobility orientation law, amended by law no. 2025-391 of 30 April 2025), version in force checked on 5 October 2026 against the consolidated text (published in French only; quotations translated by us); transport.data.gouv.fr, home page and open-data status page, checked on 5 October 2026; regulation (EU) 2024\/1689 of 13 June 2024, article 50 paragraph 1, official English text on EUR-Lex, in application since 2 August 2026; RATP and Minsday, Messenger chatbot launched in September 2017, tested by the consulting firm mc2i in May 2020 (page checked on 5 October 2026); Bonjour RATP, ChatGPT connector page checked on 5 October 2026; Nomad (NOMAD Car network, Normandy), announcement of the NomadCarBot chatbot and of the \u201cnext departures\u201d module, 3 November 2025; AuxR\u2019M le bus (Auxerre urban community), WhatsApp chatbot announcement, 28 May 2026; Botnation pricing grid and FAQ, checked on 5 October 2026.<\/p>\n<\/div>\n<p><script>(function(){var r=document.getElementById(\"bn-bus\");if(!r){return;}var G=[\"busR\",\"busN\",\"busV\",\"busC\"];function val(n){var e=r.querySelector(\"input[name='\"+n+\"']:checked\");return e?parseInt(e.getAttribute(\"data-p\"),10):0;}function setg(n,v){var els=r.querySelectorAll(\"input[name='\"+n+\"']\"),i;for(i=0;els.length>i;i++){els[i].checked=(els[i].getAttribute(\"data-p\")===v);}}function up(){var rr=val(G[0]),n=val(G[1]),vv=val(G[2]);var v=2;if(n===2||n===3){v=4;}else if(n===1){v=3;}else{if(rr===1){if(vv!==1){v=5;}}else if(vv===1){v=1;}}var k;for(k=1;6>k;k++){var pn=document.getElementById(\"busv-\"+k);if(pn){pn.style.display=(k===v?\"block\":\"none\");}}var re=document.getElementById(\"bus-reseau\");if(re){re.textContent=r.getAttribute(\"data-r\"+rr);}var de=document.getElementById(\"bus-donnee\");if(de){de.textContent=r.getAttribute(\"data-d\"+n);}var ce=document.getElementById(\"bus-canal\");if(ce){ce.textContent=r.getAttribute(\"data-c\"+val(G[3]));}}r.addEventListener(\"change\",up);r.addEventListener(\"click\",function(e){var t=e.target;if(!t){return;}if(!t.className){return;}if(String(t.className).indexOf(\"tri-load\")===-1){return;}var tr=t.closest(\"tr\");if(!tr){return;}setg(G[0],tr.getAttribute(\"data-r\"));setg(G[1],tr.getAttribute(\"data-n\"));setg(G[2],tr.getAttribute(\"data-v\"));setg(G[3],tr.getAttribute(\"data-c\"));up();});up();})();<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A bus chatbot answers passengers where they ask: next departures, disruptions, journeys, tickets. Dated French evidence, regulatory open data, four architectures, a router, and today&#8217;s public prices.<\/p>\n","protected":false},"author":8,"featured_media":31814,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[362],"tags":[],"class_list":["post-31834","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chatbot-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/posts\/31834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/comments?post=31834"}],"version-history":[{"count":2,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/posts\/31834\/revisions"}],"predecessor-version":[{"id":31891,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/posts\/31834\/revisions\/31891"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/media\/31814"}],"wp:attachment":[{"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/media?parent=31834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/categories?post=31834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/botnation.ai\/en\/wp-json\/wp\/v2\/tags?post=31834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}