Voi APIvoi.com ↗
Access Voi e-scooter and e-bike data across all operating cities and countries. Get pricing, vehicle models, help articles, and blog posts via 12 endpoints.
What is the Voi API?
The Voi API covers 12 endpoints that expose city and country coverage, per-city pricing plans, vehicle model details, blog content, and a full help center — all for Voi's e-scooter and e-bike network. Starting with get_countries and drilling into get_city_pricing, you can retrieve unlock fees, per-minute rates, and minute bundle options for any city where Voi operates, keyed by city slug.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/ddb5768b-9984-437b-870b-d02cd2112c4d/get_countries' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace voi-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Voi SDK — bounded, re-runnable; every call capped."""
from parse_apis.voi_scooters_api import Voi, HelpCategorySlug, LocationNotFound
voi = Voi()
# List all countries where Voi operates
for country in voi.countries.list(limit=5):
print(country.country, country.country_code)
# List cities in Sweden
for city in voi.cities.list_by_country(country="Sweden", limit=3):
print(city.name, city.slug, city.country_code)
# Get full details for Stockholm
stockholm = voi.cities.get(slug="stockholm")
print(stockholm.name, stockholm.slug)
# Get pricing for a city via sub-resource (constructible)
pricing = voi.city("stockholm").pricing.get()
print(pricing.currency, pricing.minute_bundle_minutes)
# Get general pricing overview
overview = voi.pricingoverviews.get()
print(overview.slug, overview.locale)
# Get vehicle models info
vehicles = voi.vehicleinfos.get()
print(vehicles.slug, vehicles.locale)
# Browse blog posts and drill into one
post = voi.blogposts.list(limit=1).first()
if post:
full_post = voi.blogposts.get(slug=post.slug)
print(full_post.title, full_post.published_date, full_post.intro)
# Get help articles using constructible HelpCategory + enum
category = voi.helpcategory(slug=HelpCategorySlug.PARKING_GUIDELINES)
for article in category.articles.list(limit=3):
print(article.question, article.slug)
# Search help articles
for result in voi.helparticles.search(query="payment", limit=3):
print(result.question, result.category)
# Typed error handling
try:
voi.cities.get(slug="nonexistent-city-xyz")
except LocationNotFound as exc:
print(f"Location not found: {exc}")
print("exercised: countries.list / cities.list_by_country / cities.get / city.pricing.get / pricingoverviews.get / vehicleinfos.get / blogposts.list / blogposts.get / helpcategory.articles.list / helparticles.search")
Returns the list of all countries where Voi operates, including country name and ISO country code. Use country names from this endpoint as input for get_cities_by_country.
No input parameters required.
{
"type": "object",
"fields": {
"items": "array of country objects with country name and ISO code"
},
"sample": {
"data": {
"items": [
{
"country": "Austria",
"countryCode": "AT"
},
{
"country": "Sweden",
"countryCode": "SE"
},
{
"country": "United Kingdom",
"countryCode": "UK"
}
]
},
"status": "success"
}
}About the Voi API
Coverage and Location Data
get_countries returns every country where Voi operates with ISO country codes. get_cities_by_country accepts a country name exactly as returned by get_countries (e.g. 'United Kingdom', not 'UK') and returns city objects with id, name, slug, countryCode, and defaultLocale. get_all_locations returns the same city list but flattened across all countries in one call, which is useful when you need a full slug inventory without iterating country by country.
Pricing and City Details
get_city_pricing accepts a slug and returns the full pricing structure for that city: currency, payAsYouGo with min/max fee details, payAsYouGoV2 broken down by vehicle type, and minute bundle options. get_city_details goes further, adding supportedVehicles, operating hours, parking rules, and CMS content blocks for a given city. Both endpoints key off the same slug field returned by the location endpoints.
Vehicles and Content
get_vehicles returns vehicle model descriptions and feature lists as CMS content blocks — useful for building a vehicle comparison view. get_blog_posts lists recent posts with title, slug, locale, and image metadata; get_blog_post fetches full content including the body as a RichText AST and publishedDate. The help center is exposed through get_help_categories, get_help_category_articles (covering categories like getting-started, accounts-and-payments, parking-guidelines), and search_help, which accepts single-keyword queries and returns matching FAQ articles with their category and slug.
Practical Notes
City slugs are the primary join key across location, pricing, and detail endpoints — always source them from get_cities_by_country or get_all_locations rather than constructing them manually. search_help returns best results with single keywords; multi-word queries may return an empty result set. Help article and blog post bodies are returned as RichText AST objects, so your client needs to render or serialize that format rather than treating the body as a plain string.
The Voi API is a managed, monitored endpoint for voi.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when voi.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official voi.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a city selector that lists all Voi operating cities and displays per-city unlock fees and per-minute rates from
get_city_pricing. - Aggregate pricing across all cities using
get_all_locationsplusget_city_pricingto compare ride costs by country or currency. - Display supported vehicle types and parking rules for a specific city using the
supportedVehiclesand parking fields fromget_city_details. - Embed Voi's help center articles in a third-party app by fetching categories from
get_help_categoriesand articles fromget_help_category_articles. - Power a keyword-based support search UI using
search_help, returning FAQ slugs and categories for matched queries. - Sync Voi blog posts to an internal CMS by polling
get_blog_postsfor slugs, then fetching full body content viaget_blog_post. - Map Voi service coverage by iterating
get_countriesandget_cities_by_countryto build a structured country-to-city hierarchy with ISO codes.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Voi have an official public developer API?+
What does `get_city_pricing` return and how does it differ from `get_pricing_plans_overview`?+
get_city_pricing returns city-specific pricing: the local currency, payAsYouGo fee structure, payAsYouGoV2 rates broken down by vehicle type, and minute bundle options for a single city identified by its slug. get_pricing_plans_overview returns general CMS content blocks describing Voi's plan types (subscriptions, bundles, pay-as-you-go) without city-level fee figures.Does the API return real-time scooter or bike locations on a map?+
Are there any quirks with the city lookup endpoints I should know about?+
get_cities_by_country requires the country name to match exactly the casing returned by get_countries — for example 'United Kingdom' works but 'UK' or 'united kingdom' will not. Always use the country field from get_countries as the input rather than constructing country names independently.