A wrapper around the DB Website API for querying train connections.
Project description
🚆 weiche
This is an unofficial library wrapper around the API of the Deutsche Bahn (DB) website for identifying connections. It returns realtime, live data. If you do not need this in your project I strongly recommend not to use this API as it might break any moment if DB changes the API for getting station and train connections.
It has a API compatibility layer to the
schiene package for
easy drop-in replacement as
schiene no longer
works.
Requirements
- Python 3.10 and above
- requests package for the synchronous API and Schiene wrapper
- aiohttp for the asynchronous API
Features
- Get connections between two stations
- Search stations by name
- Get station information
Setup
$ python -m venv /path/to/venv $ /path/to/venv/bin/python -m pip install weiche[sync,async,schiene]
Usage
Use the synchronous API
from datetime import datetime
from weiche import SynchronousApi
api = SynchronousApi()
amsterdam_query = api.search_locations('Amsterdam', limit=1)
amsterdam = amsterdam_query[0]
munich_query = api.search_locations('München Hbf', limit=1)
munich = munich_query[0]
api.search_connections(
at=datetime(2025,5,10,18,0,0),
from_location=munich.id,
to_location=amsterdam.id,
limit=10,
)
You can also add an HTTP proxy to connect via as Bahn tends to block server ip addresses.
from weiche import SynchronousApi
api = SynchronousApi(proxy="192.168.0.1:8888")
Response from Synchronous API
The return format is an object which can also be found in the objects.py file.
Look for the Connection class
and see the API definition there.
Use the asynchronous API
import asyncio
from datetime import datetime
from weiche import AsynchronousApi
async def search():
api = AsynchronousApi()
amsterdam_query = await api.search_locations('Amsterdam', limit=1)
amsterdam = amsterdam_query[0]
munich_query = await api.search_locations('München Hbf', limit=1)
munich = munich_query[0]
return await api.search_connections(
at=datetime(2025,5,10,18,0,0),
from_location=munich.id,
to_location=amsterdam.id,
limit=10,
)
asyncio.get_event_loop().run_until_complete(search())
You can also add an HTTP proxy to connect via as Bahn tends to block server ip addresses.
from weiche import AsynchronousApi
api = AsynchronousApi(proxy="192.168.0.1:8888")
Response from Asynchronous API
The return format is an object which can also be found in the objects.py file.
Look for the Connection
class and see the API definition there.
Use the schiene compatibility layer
from weiche import Schiene
Schiene().connections('Mannheim HbF', 'Stuttgart HbF')
You can also add an HTTP proxy to connect via as Bahn tends to block server ip addresses.
from weiche import Schiene
api = Schiene(proxy="192.168.0.1:8888")
Response from Schiene Layer
[{'arrival': '15:47',
'canceled': False,
'departure': '14:30',
'details': '',
'price': 55.0,
'products': ['ICE'],
'time': '01:16',
'transfers': 0,
'ontime': True,
'delay': None},
{'arrival': '16:21',
'canceled': False,
'departure': '14:38',
'details': '',
'price': 50.99,
'products': ['SBAHN', 'ICE'],
'time': '01:42',
'transfers': 1,
'ontime': True,
'delay': None},
{'arrival': '16:25',
'canceled': False,
'departure': '14:46',
'details': '',
'price': 50.99,
'products': ['ICE', 'REGIONAL'],
'time': '01:23',
'transfers': 1,
'ontime': True,
'delay': None},
{'arrival': '16:45',
'canceled': False,
'departure': '15:31',
'details': '',
'price': 55.0,
'products': ['ICE'],
'time': '01:14',
'transfers': 0,
'ontime': True,
'delay': None},
{'arrival': '17:27',
'canceled': False,
'departure': '15:34',
'details': '',
'price': 55.0,
'products': ['ICE', 'REGIONAL'],
'time': '01:53',
'transfers': 1,
'ontime': True,
'delay': None},
{'arrival': '17:15',
'canceled': False,
'departure': '15:35',
'details': '',
'price': 21.8,
'products': ['REGIONAL', 'REGIONAL'],
'time': '01:40',
'transfers': 1,
'ontime': True,
'delay': None},
{'arrival': '17:44',
'canceled': False,
'departure': '15:35',
'details': '',
'price': 21.8,
'products': ['REGIONAL', 'REGIONAL'],
'time': '02:09',
'transfers': 1,
'ontime': True,
'delay': None},
{'arrival': '17:33',
'canceled': False,
'departure': '15:36',
'details': '',
'price': 24.99,
'products': ['SBAHN', 'ICE'],
'time': '02:06',
'transfers': 1,
'ontime': False,
'delay': {'delay_departure': 0, 'delay_arrival': 9}},
{'arrival': '18:20',
'canceled': False,
'departure': '16:38',
'details': '',
'price': 47.99,
'products': ['SBAHN', 'ICE'],
'time': '01:42',
'transfers': 1,
'ontime': True,
'delay': None},
{'arrival': '18:24',
'canceled': False,
'departure': '16:46',
'details': '',
'price': 50.99,
'products': ['ICE', 'REGIONAL'],
'time': '01:38',
'transfers': 1,
'ontime': True,
'delay': None}]
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file weiche-0.10.0.tar.gz.
File metadata
- Download URL: weiche-0.10.0.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8183b167fc7b86607b7b5f1be9f2d6b48c9589c28dcaed2d485f2a5b1b5812b5
|
|
| MD5 |
2f629efcb276b36cecb2e8357d08faf7
|
|
| BLAKE2b-256 |
2509a15f2c56eef8a1b124fa3e063369afd11dcf3e73116b5a9f2a3cc7867dd3
|
File details
Details for the file weiche-0.10.0-py3-none-any.whl.
File metadata
- Download URL: weiche-0.10.0-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e87d4de4c664d4552bc0dc024f788b62fed91f07f1cae6f84f26cd332e19dea0
|
|
| MD5 |
124cda256bf9c31da217a43752515465
|
|
| BLAKE2b-256 |
069269b9de85c5baa0693867ab5c00eec5dcb66be09b69280c8350cca965385a
|