Dish Photo Matcher (No API Key): Food Photos to Menu Items
Pricing
from $0.10 / 1,000 photo matcheds
Dish Photo Matcher (No API Key): Food Photos to Menu Items
$0.2/1K photos | Match restaurant food and drink photos to your menu items with AI vision. Send photo URLs or a Google Maps place URL plus your menu; unmatched photos return null. No Gemini or Outscraper key. Not affiliated with Google.
Pricing
from $0.10 / 1,000 photo matcheds
Rating
0.0
(0)
Developer
Travel Eat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Share
$0.2/1K photos | Match restaurant food and drink photos to your menu items with AI vision. Send photo URLs or a Google Maps place URL plus your menu; unmatched photos return null. No Gemini or Outscraper key. Not affiliated with Google.
Restaurant Dish Photo Matcher, Managed AI
Our matcher takes your menu and a set of restaurant food or drink photos, and uses AI vision to say which menu item, if any, each photo shows. You get one record per photo with the exact menu item name, or null when nothing is a clear match. No Gemini or Outscraper key is needed: the AI and the photo fetching run on our keys and their cost is included in the per-photo price. It is ideal for enriching menus with real dish photos, labelling unlabeled Google Maps photos and shortlisting guest uploads for review.
- Prefer to pay Google and Outscraper directly? Dish Photo Matcher (No AI Markup): Food Photos to Menu Items costs $0.10 per 1,000 photos plus your own provider usage.
- Need the menu first? AI Restaurant Menu Parser (No API Key) + Allergens turns menu photos into dish records this Actor accepts.
- Browse all our scrapers: https://apify.com/traveleat
Key Benefits
- No API key: no Google AI Studio or Outscraper signup, the AI and photo fetching are included.
- Low pricing: $0.20 per 1,000 photos, plus a $0.00005 start fee per run.
- Free to try: Start on the prefilled form returns a clearly marked DEMO row at no charge.
- Honest nulls: photos that are not clearly on your menu come back as
null(and are billed like any analysed photo). - Your menu is the label set: results join straight back onto your own menu items.
How It Works
- Provide your menu in
menuItems: objects with at least aname(originalName,categoryanddescriptionimprove matching), or plain strings. - Provide the photos: upload JPEG, PNG or WebP files, pass direct
photoUrls, or setplaceUrlto a Google Maps place and the Actor matches its "Food & drink" guest photos. WhenphotoUrlsis set it wins overplaceUrl. - Run the Actor. Photos are matched in batches of 9. In our test, one pizza photo against a two-item menu finished in about 21 seconds.
More settings:
maxPhotos- cap on photos matched, 1 to 100. Default is 9, which is one AI batch.
The prefilled form (Katz's Delicatessen and a two-item menu) is a deterministic preview: it returns one DEMO row, scrapes nothing, calls no model and bills nothing. Pass your own photoUrls or place for a live run.
Limits: AI matching can be wrong, so verify matches before publishing. We have not run a live Google Maps place lookup for this listing, so tell us on the Issues tab if a place returns fewer photos than expected.
AI matching can be wrong. Verify matches before publishing or using them in ordering workflows, and never treat a visual match as evidence of ingredients, allergens or dietary suitability.
Data You'll Receive
- Match:
photoUrl(orphotoReffor uploaded images),dishName(the exact menu item name, ornull) andmatched(true or false). - Place: the Google Maps place URL used for the run.
- Record type:
MATCHfor live results;DEMOfor the free preview andDIAGNOSTICfor an explained empty run.
Sample output data
Here is an example row from a live run of this Actor (one pizza photo against a two-item menu):
{"recordType": "MATCH","photoUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg","photoRef": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg","dishName": "Margherita Pizza","matched": true,"place": "https://www.google.com/maps/place/Katz's+Delicatessen,+205+E+Houston+St,+New+York"}
Dish Photo Matcher API
Results are stored in a dataset that you can export as CSV, JSON or Excel, or read on demand through the Apify API.
Support and Feedback
We improve these Actors from your feedback. If something breaks or you need a field:
- Open an issue on the Actor's Issues tab
- If this Actor saved you time, a short review on the Store helps other users find it.
Run evidence
Start with one input and output
An Apify account is required. Use your Apify API token when calling the API; Console runs do not need that token pasted into the input. No user API-key field is required by this input schema. none; provider calls managed by Actor.
Free-tier event rates checked 2026-10-04: actor-start $0.00005; result $0.0002.
Cost: Total = Actor event charges + platform usage if separately billed + any BYO-provider charges. See “Current costs” for your event rates, plan tiers and a calculation. A sample does not promise future billable volume.
Input and output below were read from the same successful run haAr6sUAAZszrvzWT (2026-09-07, immutable build j969njljdL483cTlX). This is an observed example, not a guarantee that repeating it returns this row.
Input JSON
{"menuItems": [{"name": "Margherita Pizza","category": "Pizza"}],"photoUrls": ["https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg"],"maxPhotos": 1}
Matching output excerpt
Long strings and arrays are shortened for display; this is not a complete dataset fixture.
{"recordType": "MATCH","photoUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg","photoRef": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg","dishName": "Margherita Pizza","matched": true}
Use AI vision to predict which supplied menu item, if any, appears in each
restaurant food or drink photo — no API key input or setup. Unmatched or
uncertain photos remain null. This actor joins menus and otherwise unlabeled
guest photos:
- Input: your menu (JSON array of items) + uploaded food/drink photos,
direct
photoUrls, or a Google MapsplaceUrlwhose "Food & drink" guest photos are fetched automatically. - Output: one record per photo —
{photoUrl, dishName, matched}, withdishNamethe exact menu item name ornullwhen nothing matches.
More than a plain Google Maps photos scraper: instead of dumping raw
guest-photo URLs, AI vision proposes a menu-item match for each photo and
returns null when no supplied item is a clear match.
Photos are matched in batches of 9 by visual appearance; hallucinated names
(not on your menu) are filtered to null automatically. Ported from the
production photo-matching pipeline of a dietary-restrictions travel app.
What you can build with it
- Menu enrichment — propose guest-photo matches for dishes on a parsed menu (delivery apps, restaurant sites, food discovery apps).
- Google Maps photo labeling — turn an unlabeled pile of place photos
into structured
photo → dishdata. - Menu photo review — shortlist which menu items may appear in guest uploads for human verification.
- Food image classification against a known label set — unlike generic image-classification APIs, the label space is your menu, so results are directly usable.
No API keys needed
Photo fetching and AI matching both run on our managed keys, and their cost is already included in the per-photo price. No Google AI Studio signup, no Outscraper account, or API key input is needed.
Input example
{"placeUrl": "https://www.google.com/maps/place/Katz's+Delicatessen,+205+E+Houston+St,+New+York","menuItems": [{"name": "Pastrami on Rye", "category": "Sandwiches"},{"name": "Matzo Ball Soup", "category": "Soups"}]}
menuItems accepts plain strings too: ["Pastrami on Rye", "Matzo Ball Soup"].
Fields originalName, category and description improve match quality.
The untouched Console form is prefilled with Katz's Delicatessen as the
photo source. Running that exact default returns a deterministic row labelled
recordType: "DEMO" / isDemo: true; it performs no live photo lookup or AI
call and has no Actor event charge. Customize the input to start a live run.
The Console accepts local JPEG, PNG, or WebP uploads in photoUrls; API
callers may also provide URLs, base64 data URIs, or raw base64.
photoUrl remains a real sanitized HTTP(S) URL when one exists; inline images
use photoUrl: null plus a non-sensitive photoRef fingerprint.
Output example
| photoUrl | dishName | matched |
|---|---|---|
https://lh3.googleusercontent.com/p/AF1… | Pastrami on Rye | true |
https://lh3.googleusercontent.com/p/AF2… | Matzo Ball Soup | true |
https://lh3.googleusercontent.com/p/AF3… | null | false |
Unmatched photos (interiors, receipts, dishes not on your menu) come back
with dishName: null — they are analyzed and billed like any other photo,
since confirming a non-match costs the same AI work as a match.
Chain it: scrape menu → match photos
The Google Maps Menu Scraper and AI Menu Parser actors produce menu records this actor accepts directly:
- Run Google Maps Menu Scraper on a place → structured
menuItems. - Feed those items plus the same
placeUrlinto this actor. - Join rows with non-null
dishName; unmatched dishes may still have no photo.
Pricing — what does a run cost?
Check this Actor’s Pricing tab for the current charges for your Apify plan. Actor-start and per-photo events apply to successful live output. AI and photo-fetching usage are included. Diagnostic-only runs incur neither event charge.
Prefer to pay Google and Outscraper directly and control your own quota?
The Restaurant Dish Photo Matcher (BYO keys)
Actor lets you supply geminiApiKey / outscraperApiKey and manage provider usage directly. Its per-photo fee is lower than this Actor's, but your providers bill you on top for the AI and photo lookups. Compare both Pricing tabs.
FAQ
Why do some photos come back unmatched?
Google Maps "Food & drink" galleries include drinks, interiors and dishes
that aren't on the menu you supplied. matched: false is a real answer, not
an error — filter on it.
photoUrls vs placeUrl — which should I use?
photoUrls if you have local photos or image URLs (from your own scrape or dataset).
placeUrl to let the actor fetch the place's guest food photos for you.
When both are set, photoUrls wins.
Full Google Maps URLs and maps.app.goo.gl short links are accepted; short
links are resolved only to trusted Google Maps destinations.
How many photos can one run match?
Up to 100 (maxPhotos, default 9). Values above 100 are clamped, not
rejected.
What AI model does the matching? Gemini Flash-Lite vision — fast and accurate for appearance matching, and its cost is included in the per-photo price.
Can I run it on non-restaurant photos? It works on any photo-vs-item-list matching where appearance decides — but it's tuned for food and drink.
Can I rely on every match? No. AI photo matching can be wrong. Verify matches before publishing or using them in ordering workflows, and never treat a visual match as evidence of ingredients, allergens, or dietary suitability.
Support & links
- Questions, bug reports and FAQ: github.com/Exdenta/traveleat-support
- This actor runs the same menu pipeline as Travel Eat — scan a menu, get allergens, ingredients and dietary filters in 36 languages.
Product guides and related tools
- Product overview and public links
- Public setup guide
- Travel Eat menu API guide
- Menu API documentation and support
- Google Maps Menu Scraper — Allergens, Nutrition, No API Key
- AI Restaurant Menu Parser — Dishes & Allergens, No API Key
Current costs
Current Actor event rates, checked 2026-10-04. USD; use the Pricing tab for your plan and later changes.
| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
Actor start (actor-start) | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
Photo matched (result) | $0.0002 | $0.0002 | $0.0002 | $0.0002 | $0.0002 | $0.0002 |
For example, 1 × actor-start, 100 × result totals $0.02005 in Actor event charges on Free. This is an arithmetic example, before any waiver; actual charged events depend on the run and selected options. It is not a promise of output or a charge for simply setting an item cap.
Your total is the charged Actor events, plus platform usage only if this Actor’s Pricing tab bills it separately, plus any external provider you use with your own key. Do not add platform usage twice when it is included. Apify credits and plan discounts affect your invoice. Set a run cost limit in Console before starting.
Agent setup skill
Use the maintained SKILL.md to configure the documented inputs, select latest, record the immutable build and distinguish source results from preview or diagnostic rows. Check the current Pricing tab before starting a run.
Independent tool. We built and run this Actor ourselves. Google does not operate, sponsor or endorse it, and its name is used only to say which service the data is processed with. We are not affiliated with Google.