symone
Official Python SDK for SYMONE, long-distance motorcycle transport on French highways: your motorcycle rides on a trailer while you travel in the van. Main line Paris ⇄ Marseille, from 299 €.
- No account, no API key.
- Standard library only (
urllib), Python 3.9+, typed dataclasses. - Read-only: the API cannot book or pay. People book on symone.fr/moto, or ask for a quote for other routes and dates on symone.fr/moto?tab=tab-devis.
Developer portal: https://symone.fr/developers · OpenAPI: https://symone.fr/openapi.json
Install
pip install symone
Quick start
from symone import SymoneClient
client = SymoneClient() # production: https://symone.fr/api-proxy/v1
page = client.search_routes(depart="Paris", arrival="Marseille", date_from="2026-11-01", date_to="2026-11-30")
for route in page.routes:
print(route.date, route.depart, "->", route.arrival, route.layovers, route.price_label, route.slots, route.times)
print("Book on", page.book_url)
Route fields: id, date (YYYY-MM-DD), depart, arrival, layovers, price_min / price_max (EUR, None means on quote), slots (free motorcycle places for each leg), times. City filters are case-insensitive substrings and also match stopovers.
Sandbox first
client = SymoneClient(sandbox=True) # https://symone.fr/api-proxy/v1/sandbox
page = client.search_routes(depart="Paris")
assert page.sandbox # fixed sample trips dated 2030, never production data
Pagination
# Every trip, following next_cursor with the same filters
for route in client.iter_routes(depart="Marseille", page_size=100):
...
# Or page by page
page = client.search_routes(depart="Paris", limit=20)
if page.has_next:
page = client.search_routes(depart="Paris", limit=20, cursor=page.next_cursor)
Other endpoints
client.cities_near("Paris, Île-de-France, France").cities
result = client.batch_search([ # 1 to 10 queries, Idempotency-Key generated
{"depart": "Paris", "arrival": "Marseille", "date_from": "2026-11-01"},
{"depart": "Marseille", "arrival": "Paris"},
])
for item in result.results:
print(item.index, item.total)
job = client.create_search_job(depart="Paris", arrival="Marseille")
done = client.wait_for_job(job, timeout=60) # jobs expire after 10 minutes
print(done.routes)
answer = client.ask("Paris Marseille in November") # NLWeb /ask, schema.org Trip objects
print(answer.answer, answer.results)
info = client.booking_info() # links and contacts, no network call
print(info.book_url, info.quote_url, info.email, info.phone_international)
Dates accept datetime.date objects or "YYYY-MM-DD" strings.
Errors and rate limits
Limits are per client per minute: 180 reads, 30 actions (cities-near, batch, jobs, ask), 60 MCP calls. On HTTP 429 the client waits for Retry-After and retries once (SymoneClient(retry_on_rate_limit=False) disables it).
from symone import SymoneError, APIError, NotFoundError, RateLimitError, TransportError
try:
client.search_routes(depart="Paris")
except RateLimitError as error:
print("retry in", error.retry_after, "s")
except APIError as error: # JSON {"error": "..."} from the API
print(error.status, error.message)
except TransportError as error: # network failure or timeout
print(error)
Hierarchy: SymoneError > APIError (> NotFoundError, RateLimitError), TransportError, JobFailedError, JobTimeoutError. Invalid arguments raise ValueError before any request.
Command line
The package installs symone-py:
symone-py search --from Paris --to Marseille --date-from 2026-11-01
symone-py --sandbox search --from Paris --json
symone-py search --from Marseille --all
symone-py cities-near "Lyon"
symone-py batch queries.json
symone-py ask "Paris Marseille in November"
symone-py booking
Exit codes: 0 ok, 1 API error, 2 invalid usage, 3 rate limited, 4 network error. A Node.js CLI with more commands is available with npx symone-cli.
MCP servers
For AI agents, SYMONE also runs two public MCP servers (Streamable HTTP, no auth): https://symone.fr/mcp (trip search) and https://symone.fr/docs/mcp (documentation).
Links
- Developer portal: https://symone.fr/developers
- API reference: https://symone.fr/api/index.md · OpenAPI: https://symone.fr/openapi.json
- Versioning policy: https://symone.fr/api/versioning.md
- Book: https://symone.fr/moto · reservation@symone.fr · +33 1 71 32 35 05
Development
python -m unittest # no network: urllib is mocked
License
MIT © SYMONE SAS
Metadata
Release files for symone 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| symone-1.0.0.tar.gz | 20.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| symone-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.8 kB
Release files / symone-1.0.0.tar.gz
| Download URL | symone-1.0.0.tar.gz |
|---|---|
| Size | 20.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
615aa9d7c74c910a656367e4b4247a1b6d0b5d13815c5ff584531dcd3733c6b3
|
|
BLAKE2b-256 checksum How to use checksums |
7a351c324528cad08d45f153a026593459015672d7ffbe7c5a6c153d12115749
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.5
|
Release files / symone-1.0.0-py3-none-any.whl
| Download URL | symone-1.0.0-py3-none-any.whl |
|---|---|
| Size | 18.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4def980b33643d2f66988e30d933afa9c600cc6f74d23301ff8342ce930519cd
|
|
BLAKE2b-256 checksum How to use checksums |
ad8e3e66123aa2f064ab53d3db37eeb4289b0c992a121ce3d8019fae15367c82
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.5
|
Security for symone 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.