Every restaurant
as structured data.
One URL in — full restaurant snapshot out. Menu items, prices, photos, allergens, nutrition, translations across all available languages. No more scraping, no anti-bot games, no missing fields.
Wolt — fully supported, 23 countries verified
Most complete Wolt scraper available. We extract full menu items with
prices in any currency (including ISK/JPY/HUF/KZT formatted correctly),
all available translations (up to 5 per restaurant), allergens and
nutrition data from the hidden prodinfo endpoint, GTIN
barcodes for packaged goods, photos archived locally, combo items
with nested variant trees, RTL languages (Hebrew/Arabic) preserved.
Tested end-to-end across 23 markets: Estonia, Latvia, Lithuania, Finland, Sweden, Denmark, Iceland, Germany, Austria, Slovakia, Slovenia, Croatia, Hungary, Greece, Albania, Serbia, Kosovo, North Macedonia, Georgia, Armenia, Azerbaijan, Israel, Kazakhstan. Every currency edge case handled, every multilingual case verified.
Read full article →{
"platform": "wolt",
"countries": 23,
"languages": "all available, up to 5/restaurant",
"allergens": true,
"nutrition": true,
"gtin": true,
"combos": "nested tree with per-variant prodinfo",
"rtl_support": true,
"price": "$0.03 – $0.15 per restaurant"
}
Google Maps — restaurant card + reviews + photos
Full restaurant card extraction from any Google Maps URL — name, address, phone, hours per day, coordinates, amenities, popular times graph, order-provider deep links. Up to 2000 reviews scrolled with full text (we expand "see more" automatically), per-review photos, owner replies. Photos categorised: cover, place, menu strip, review photos — all archived locally with hash de-duplication.
The Google Places API gives you 5 reviews and 10 photos. We give you everything you can see in a browser. Better data, no quota dance.
Read full article →{
"platform": "googlemaps",
"reviews_max": 2000,
"photos_modes": ["full", "menu_only", "skip"],
"popular_times": true,
"rating_breakdown": "1★ to 5★ histogram",
"amenities": "full list",
"order_providers": "deep links to Uber Eats / Just Eat etc",
"price": "$0.03 – $0.15 per restaurant"
}
UberEats — coming next
UberEats support is in active development. We already have an UberEats parser in beta with the same canonical output shape as Wolt — menu items, photos, allergens (where exposed), translations, delivery options. Coverage will start with US/UK/EU markets and expand from there.
ETA: v1.1 release (Q3 2026). If you want early access for a specific integration, write to support@restoapi.org — early adopters get a free batch of test exports.
Request early access →# UberEats status status: "beta — parser ready, launching v1.1" canonical_compat: true # same output shape as wolt photos: "all dish + venue" batch_ready: true eta: "Q3 2026" early_access: "by email"
Bolt Food — coming next
Bolt Food parser is in our test pipeline. Same canonical Restaurant + Dish model as the rest. Strong markets in Eastern Europe (Estonia, Latvia, Lithuania, Romania, Slovakia, Czech) and Africa (Kenya, South Africa, Nigeria) — places where Wolt isn't the dominant player. Useful for cross-platform price comparison in mixed markets.
Request early access →# Bolt Food markets: "strong in EE / EU / Africa" canonical: "Restaurant + Dish compatible" cross_compare: true status: "queued for v1.1"
DoorDash — coming next
DoorDash is the largest US food delivery platform. Our parser is ready in beta — restaurant card, menu items, prices, photos, hours, ratings, reviews. Launching with major US metros first (NYC, SF Bay, LA, Chicago, Boston, Seattle, Austin, Miami).
Request early access →# DoorDash market: "US — largest by volume" metros: "NYC, SF, LA, Chicago, Boston ..." reviews: true ratings: true status: "beta, v1.1"
Yelp — coming next
Yelp is a different beast — light on structured menu data but very strong on reviews and photos. Our parser focuses on what Yelp is unique for: 100+ reviews with attached photos, business attributes (vegan-friendly, accepts crypto, has wheelchair access), hours per day, popular dishes (mentioned-in-reviews aggregation), and 30+ business photos archived. Great complement to our existing Wolt + Google Maps coverage.
Request early access →# Yelp strength: "reviews + business attributes" reviews_max: 100 + popular_dishes: "aggregated from reviews" attributes: "vegan, wheelchair, crypto-payments, ..." status: "in queue"
By the numbers — what we're processing right now
Inside every archive — photos this crisp
Every dish, every venue shot — downloaded at maximum resolution, archived locally, de-duplicated by content hash. No expiring URLs.





One data source. Endless applications.
With every restaurant fully extracted — menu, allergens, nutrition, photos, translations — you can build practically any food-related product without ever touching a scraper yourself.
Food delivery clones
Launch your own Wolt-clone for a region they don't cover. Inventory ready on day one — restaurants, menus, photos, prices, allergens. No need to convince 100 restaurants to upload their data — it's already there.
Restaurant aggregator sites
“Best burgers in Vienna”, “All vegan restaurants in Berlin”, “Late-night food in Reykjavík” — these directory sites usually take 6 months of manual data entry. With us: 6 hours.
Train food classification models
Labelled photo datasets paired with allergen tags, nutrition values, and category labels. Train dish classifiers, allergen detectors, nutrition estimators, image embedding models. Already labelled.
Food search engines
Drop our computed.searchable_text into Postgres tsvector,
Meilisearch, or Elasticsearch. Instant multilingual full-text search across
dish names, descriptions, ingredients — every language a restaurant exposes.
Personalised dish recommendations
Match user dietary profile (vegan / gluten-free / low-carb) against normalised allergens and nutrition. Build “you should try this” engines for delivery apps, fitness apps, hotel concierge bots.
Allergen-aware diet apps
“No peanuts, no shellfish, low gluten” → restaurants where every menu item
passes the filter. Our allergens_normalized field is already
translated to English keywords — works across any source language.
Tourism & travel platforms
Show menu in the visitor's language. Aroma Coffee in Tbilisi serves 5 languages — Russian tourist sees ru, German sees de. All five translations come from one API call.
Market intel & competitor tracking
Daily snapshots of competitor restaurants in your area. Track price changes, new menu launches, photo refreshes, popular badge churn. Your sales team wakes up to a digest.
Restaurant chat & voice bots
Telegram / WhatsApp / Siri Shortcuts bots that take orders, suggest dishes, check opening hours, list allergens. The data structure is bot-ready: JSON in, natural language out.
Built on two clean concepts: Restaurant + Dish
Whatever you're building — food app, ML pipeline, search engine, analytics dashboard — the underlying data is the same: a restaurant with attributes, and menu items (dishes) belonging to it. Our canonical JSON reflects this cleanly so you can plug it into any backend.
Restaurant — the venue object
One restaurant.json per scraped URL. Has:
name, slug, venue_id (stable), country, city, currency, primary_language,
phone, full address, coordinates, slogan, tags, delivery methods + hours
per day, min order, share URL, breadcrumbs.
Plus our computed.flat namespace — 47 scalars ready
for direct SQL/CSV ingestion: items_count,
items_popular, price_min/max/avg/median,
top_cuisines[], top_allergens[],
logo_local_url, etc.
Dish — the menu item
Every menu item has the same structure: local_id (stable),
name, description, category, pricing (amount + currency + formatted),
photo (URL + local archived path), popularity flag, age-restricted flag,
discount fields, available-times window.
Plus enriched data: translations.{lang} for every available
language, allergens + nutrition + gtin
from prodinfo, options_groups for combos, and our computed
fields derived.allergens_normalized,
derived.food_category, derived.searchable_text.
Restaurant + Dish in one request
That's the whole API. One POST /v1/jobs with a URL → one ZIP
containing one Restaurant + N Dishes, all photos, all translations. No need
to combine endpoints, no pagination headaches, no missing fields. The data
model fits cleanly into Restaurant.belongsTo(Dishes) in any ORM.
Need test data for your food app? You're in the right place.
Building a food-related product is famously held back by data scarcity. Free public datasets are stale, incomplete, or single-cuisine. Our $0.50 free trial gives you real, fresh, full restaurants as a fixture for your development & QA environments.
Realistic fixtures, not synthetic data
Generate restaurants on signup ($0.50 = ~3 Basic exports = ~50 dishes
across 3 cities). Use them as test/fixtures/ in your CI.
Real names, real prices, real photos, real allergens — your code tests
on the same shape of data you'll see in production.
Seed your database in 10 minutes
Pick 30 restaurants in a city → batch them → import the ZIP into your Postgres / MongoDB. Your dev environment now has a fully-populated catalog: 30 restaurants × 15 dishes avg = 450 items with full multilingual + allergen data.
Train tiny models cheaply
$30 covers 200 full_media exports = 3000+ labelled photos across
dozens of cuisines, allergen profiles, dietary preferences. Enough for
fine-tuning vision models, building search indices, or benchmarking your
recommendation engine.
Test multilingual / RTL / edge cases
Build a tourism app and need to test RTL display? Try an Israel restaurant (Hebrew). Need to test 5-language switching? Try Aroma Coffee Tbilisi (ka+en+ru+de+tr). Currency rendering bugs? ISK / KZT / JPY / HUF all covered. Realistic edge cases on day one.
No card · No commitment · Restaurant + Dish data in one ZIP
Data so complete, there's no aftercare needed
Other scrapers give you name + price + address. We give you the whole thing — including the things nobody else extracts.
Every translation, not just one
When a restaurant offers menu in en + sk + de + uk + ru — you get all
five. Including auto-translated machine quirks (Wolt's
Brownie → Lutin) mirrored 1:1.
Per-item allergens, GTIN, nutrition
We fetch prodinfo endpoints for every packaged-goods item:
full allergens list, ingredients, nutritional table, barcode (GTIN),
unit price, country of origin. Most scrapers don't even know this exists.
Combo meals with nested variants
A combo of Burger + Side + Drink isn't one row — it's a tree. We unfold it: each variant has its own allergens, calories, price delta, translation.
ISK / JPY / HUF / KZT formatted right
Wolt stores everything in minor units. For ISK that's still ISK (no öre).
We auto-detect and render kr3,450 instead of kr34.50.
16 currencies handled by ISO 4217 spec.
Photos archived locally, not just linked
Every dish photo, restaurant cover, logo — all downloaded into the ZIP. Restaurant deletes the photo tomorrow? Doesn't matter, your archive still has it. De-duplicated by content hash.
Instant job ID + full pricing receipt
POST returns in <100ms with job_id + estimated time +
complete billing breakdown (price, discount, charged, balance before/after,
transaction ID). Log it on your side, reconcile easily.
This is what one archive contains
Real data from a Wolt restaurant in Iceland — Centrum Kitchen Bar, Akureyri. Total ZIP: 11.3 MB. Parse time: 28 seconds.
📁 ZIP contents (11.3 MB)
result.json— full canonical (78 KB)restaurant.json— card only (2 KB)menu.json— items+categories (70 KB)computed.json— flat catalog (3 KB)summary.json— at-a-glancephotos/menu_photos/— 15 dish photosphotos/venue_photos/— 2 hero shotsmetadata/manifest.json
Download is one signed URL, valid for 48 hours. ZIP is also accessible per-file
via individual signed URLs if you only need menu.json.
// 1 of 15 items, full Wolt format { "name": "Kjúklinga takkó", "description": "Mexican chicken taco...", "pricing": { "amount": 3450, "currency": "ISK", "formatted": "kr3450" }, "category": { "name": "Mexican" }, "photo": { "url": "https://imageproxy.wolt...", "local_url": "photos/menu_photos/3fb776fbc34f.jpg" }, "translations": { "is": { "name": "Kjúklinga takkó" }, "en": { "name": "Chicken taco" }, "pl": { "name": "Taco z kurczakiem" } }, "computed": { "flags": { "is_popular": true, "has_photo": true }, "derived": { "food_category": "taco", "searchable_text": "Kjúklinga takkó | Mexican..." } } }
From URL to archive in four steps
Send URL
POST to /v1/jobs with a restaurant link. Returns job_id instantly + your full billing receipt.
We crawl
Playwright + prodinfo + multi-language fetch. 3 minutes for basic, up to 12 for full_media.
You check
Poll /v1/jobs/{id}/status. When status=completed, signed download URLs appear in the response.
Download ZIP
One archive with everything inside. Valid 48 hours. Failed? Automatic refund, no questions asked.
# 1. Create a job curl https://restoapi.org/v1/jobs \ -H "Authorization: Bearer rk_live_..." \ -H "Content-Type: application/json" \ -d '{ "source_url": "https://wolt.com/en/aut/wien/restaurant/foo", "platform": "wolt", "export_type": "full_media" }' # Response (instant) { "job_id": "a46372ae04215404d1480d495026b906", "status": "queued", "billing": { "charged_cents": 15, "balance_after": 532, "transaction_id": 25 }, "timing": { "estimated_seconds": 600 } } # 2. Poll until ready curl https://restoapi.org/v1/jobs/a463...906/status \ -H "Authorization: Bearer rk_live_..." # When status=completed → grab downloads.full_export_zip.url
What people build with restoapi data
01
Food-tech aggregators
Compare prices across Wolt / UberEats / Glovo for the same restaurant.
Our computed.flat namespace gives you 47 scalars per restaurant
ready for SQL/CSV/dashboards. Match restaurants by phone, address or coords.
02
ML training datasets
15+ photos per restaurant with category labels (menu / venue / cover). Full allergen tags + nutrition per item — labelled training data for dietary classification, recommendation systems, food image recognition.
03
Franchise monitoring
Set up nightly batch jobs to track a chain across 50 locations. Detect price changes, new dish launches, hours updates, photo refreshes. Webhook-trigger your alerts (coming in v2).
04
Delivery integrators & bots
Build a Telegram bot that ranks restaurants by allergen-friendly options. Or a voice-assistant that orders from a menu. Our translations support every language Wolt exposes — Hebrew, Arabic (RTL), Georgian, all there.
Also available on Apify Marketplace
Already using Apify Actors? restoapi is publishing a thin actor that proxies to our API — same data, same pricing, billed via Apify's Pay-Per-Event. Buy your API key here, paste into the actor, go.
Apify Actor
Thin wrapper around our API. Input: {api_key, platform, url, export_type}. Output: archive URL ready in Apify Dataset. Pay-Per-Event billing.
Direct API
Native REST. Use from Python / Node / Go / cURL. Auth via session cookie or rk_live_* Bearer. Cheapest option — full margin to you.
What you get here that you don't get elsewhere
| Feature | restoapi.org | Generic Wolt scrapers | DIY scraping |
|---|---|---|---|
| Restaurant card (name, address, phone, hours) | ✓ | ✓ | ✓ |
| Menu items + prices | ✓ | ✓ | ✓ (with work) |
| Multi-language menu translations (all available) | ✓ All 5 langs | UI lang only | Hard to do |
| Allergens per item (from prodinfo endpoint) | ✓ | No | Undocumented API |
| Nutrition table + GTIN + unit price | ✓ | No | No |
| Combos with nested variant allergens | ✓ Full tree | Flat or skipped | No |
| Photos archived locally (de-duplicated) | ✓ in ZIP | URLs only | URLs only |
| Zero-decimal currency formatting (ISK/JPY/KZT) | ✓ Correct | Broken (10× off) | Easy bug |
| Full billing receipt in response | ✓ price+txn+balance | Just charged | N/A |
| Auto-refund on failed jobs | ✓ | Pay anyway | N/A |
| 48-hour archive + signed download URLs | ✓ HMAC | Public URLs | N/A |
| Batch (1-200 URLs per call) | ✓ | Sometimes | DIY |
The unfair advantage
We've been polishing this parser for months. It's been verified across
23 countries: Iceland, Israel (RTL!), Georgia (5 languages), Kazakhstan
(KZT), Albania, Estonia, Latvia, Slovenia… Currency edge-cases, RTL scripts,
machine-translated names, missing fields, prodinfo retries — all handled.
You don't have to deal with any of that. You get the clean JSON.
Pay only for what you ship
Pay-per-task. No subscription, no commitment. $0.50 free trial on signup. Failed jobs are auto-refunded.
Basic
- Restaurant card
- Name, address, phone, hours
- Coordinates
- Cover image (1 photo)
- No menu
- No reviews
Full data
- Everything in Basic
- Full menu (categories + items)
- All translations
- Allergens + nutrition
- Reviews (googlemaps)
- No photos archived
Full media
- Everything in Full data
- All photos in ZIP
- Menu photos (15-50)
- Venue photos (3-10)
- Cover + logo locally
- computed.flat catalog
include_media=false for −30% off any tier. Discounts auto-applied,
breakdown returned in the billing block. Full pricing details →
Things you might be wondering
How do I sign up?
Enter your email on /login, we send a 6-digit code, you enter it. No password, no card. $0.50 credit on first signup — enough for 3+ Basic tasks.
What if a job fails?
Automatic refund. Your transaction history shows the original charge AND the refund transaction with reason="job_failed". You never pay for broken data.
How fresh is the data?
Real-time. Every job hits Wolt/Google Maps live. We don't cache or pre-scrape — the moment you call, that's the snapshot you get.
Can I use this for many restaurants at once?
Yes — POST to /v1/jobs/batch with up to 200 URLs. Each becomes a separate job_id under one batch_id. Use /v1/batches/{id} for aggregate progress.
How long is the archive available?
48 hours from the moment the job completes. Signed download URLs include the expires timestamp. After that, re-run the task.
Which platforms are supported?
Today: Wolt (60+ countries, full multilingual) and Google Maps (any restaurant page). UberEats, Bolt Food, DoorDash coming next.
How do I top up?
Minimum top-up: $5. For now via bank transfer — write to support@restoapi.org. Stripe (cards) coming in v2.
What's an API key vs cookie session?
Cookie session = browser, 90-day sliding refresh. API key (rk_live_*) = for scripts/CI/Apify. Same permissions, same balance. Create as many keys as you want.
What about GDPR / privacy?
We store your email, session, and transaction history. No tracking pixels, no third-party analytics. Logout = session revoked. More on /about.
Is this legal?
Publicly accessible restaurant data, same as any browser request. We respect rate limits, don't bypass authentication, and process responsibly. Use the data responsibly on your end.