Skip to main content

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).

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)

Source distribution for symone 1.0.0
File Size Uploaded Provenance Actions
symone-1.0.0.tar.gz 20.5 kB Without provenance Details for symone-1.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for symone 1.0.0
File Interpreter ABI Platform Actions
symone-1.0.0-py3-none-any.whl Python 3 none any Details for symone-1.0.0-py3-none-any.whl

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.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page