U.S. Ghost Kitchen Market Intelligence
Under maintenancePricing
$100.00 / 1,000 analyzed locations
U.S. Ghost Kitchen Market Intelligence
Under maintenanceReview directional public-source intelligence for one U.S. market or a bounded batch. Compare reachability-based coverage grades, shared-address candidate dossiers, qualitative scorecards, and an HTML report, or use a fictional no-charge demo. Results are not official or legal determinations.
Pricing
$100.00 / 1,000 analyzed locations
Rating
0.0
(0)
Developer
Critical Distinction
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
11 days ago
Last modified
Categories
Share
Turn public delivery-listing evidence into a directional market brief for one U.S. market or a bounded batch. The Actor combines reachability-based source coverage, shared-address candidate dossiers, qualitative scorecards, and a standalone HTML report without presenting the result as an official or legal determination.
Product scope: Ghost 0.4.0 includes deterministic fictional demo mode, v2 summaries, and a standalone HTML report. Store pricing, rendered presentation, support, and ongoing operations remain separate evidence surfaces.
What You Get
Every successful run produces a linked product bundle:
- Directional positioning β candidate language and explicit evidence limits instead of an official-detector claim.
- A simpler input experience β choose fictional demo or live execution, then follow separate live market, scan-control, and optional Yelp sections. Existing single-market and batch keys remain compatible.
- A deterministic fictional demo β three versioned scenarios exercise the real v2 product without delivery-source, geocoder, proxy, Yelp, reservation, idempotency-key, or charge activity.
marketScorecardβ a qualitative, coverage-gated signal with observable counts; it is not a probability, accuracy score, demand estimate, or market size.addressClustersβ bounded dossiers for emitted brands sharing an exact location and normalized-address identity. A shared address does not establish ownership, legal status, demand, or official verification.sourceCoverageβ a reachability-based grade that distinguishes reached, partial, failed, and not-started source observations instead of using result count as a coverage proxy.OUTPUT.htmlβ a self-contained, script-free HTML view of the same typedOUTPUTsummary, stored withtext/html; charset=utf-8.
The default dataset remains the restaurant-level evidence surface. The JSON
OUTPUT record is the machine-readable run summary, and OUTPUT.html is the
buyer-readable view. Live charge eligibility begins only after all three
artifacts are durable.
Quick Start
Inspect the product without live collection or billing
{"demoMode": true,"demoScenario": "shared_kitchen_cluster"}
Demo mode ignores submitted live locations, scan controls, concurrency, and
the Yelp secret. It still writes fictional dataset rows, OUTPUT, and
OUTPUT.html to the run's platform storage. Every demo row is visibly marked
with runMode: "demo" and evidenceMode: "synthetic_demo"; billing and
idempotency fields remain ineligible or null.
The following table is checked against the real demo-v1 fixtures and the
same execution path used by the Actor:
demoScenario | Dataset rows | sourceCoverage.grade | Notable address clusters | marketScorecard.signal |
|---|---|---|---|---|
shared_kitchen_cluster | 4 | complete | 1 | concentrated_candidates |
quiet_market | 0 | complete | 0 | quiet_or_inconclusive |
partial_coverage | 2 | partial | 1 | concentrated_candidates |
The default scenario also generates this plain-English preview through the same versioned route; the values are not copied from a marketing example:
Fictional default-demo brief: Candidate activity at shared addresses. Coverage: Complete declared source reachability (3 of 3 declared observations reached). Observable evidence: 4 classified rows, 3 confirmed-or-likely candidate rows, and 1 notable shared-address cluster with 3 fictional brands at 100 Fictional Foundry Way, Exampleville, ZZ 00000. This is deterministic synthetic demo evidence, not live-source, ownership, legal-status, or official-verification proof.
All names, addresses, locations, timestamps, and observations in those scenarios are fictional. Demo output proves deterministic product behavior; it does not prove live source availability or accuracy.
Run the recommended live path
{"demoMode": false,"demoScenario": "shared_kitchen_cluster","location": "Austin, TX","radiusMiles": 3,"maxRestaurants": 25,"confidenceThreshold": 0.5,"includeTraditionalRestaurants": false,"batchConcurrency": 1}
This is the canonical live smoke input. A legacy input that omits both demo
fields still follows the live route, and demoScenario receives the additive
default without changing live behavior.
Inspect A Finished Run
Open HTML Market Report first when you want the plain-English market brief. It leads with the directional signal, declared source reachability, observable counts, notable shared-address dossiers, and the limitations that constrain interpretation. Then use the remaining output links for the evidence or operational detail you need:
- Results opens the default dataset and its restaurant-level evidence.
- Run Summary opens JSON
OUTPUT, the machine-readable source-coverage, scorecard, dossier, artifact, and per-location contract. - Batch Charge Checkpoint opens
BATCH_STATE; Location Charge States lists theLOCATION-####records. These are operational retry and charge-state evidence with output-safe identifiers, not market evidence and not settled platform charge-counter proof.
The checkpoint links help an operator or agent decide whether a retry is safe.
They do not replace OUTPUT, prove that Apify settled an event counter, or turn
retry metadata into broader market evidence or settled billing proof.
How It Works
- Resolve one
locationor plan a boundedlocations[]batch. Do not provide both. - Attempt public-source collection from DoorDash, Uber Eats, and Grubhub for each unique market fingerprint. Optional Yelp Fusion enrichment can add storefront context.
- Standardize emitted addresses, preserve source-health facts, and classify each listing from the evidence available to that row.
- Derive reachability-based coverage, exact shared-address dossiers, and a qualitative market scorecard from the emitted evidence.
- Publish dataset rows, JSON
OUTPUT, and rawOUTPUT.htmlin that order. - For live work only, attempt the
location-analyzedevent after the complete artifact bundle is durable and eligible.
The Actor preserves partial, quiet, failed, skipped, duplicate, spend-limited, and post-output charge-failure states. A low result count is never used as a shortcut for source coverage.
Input Parameters
The Console form presents four ordered sections: demo/live choice, live market selection, live scan controls, and optional live Yelp context.
| Field | Default | What it does |
|---|---|---|
demoMode | false | Runs a deterministic fictional scenario when true. Live controls are ignored; platform storage remains enabled; no source or charge activity occurs. |
demoScenario | shared_kitchen_cluster | Selects shared_kitchen_cluster, quiet_market, or partial_coverage. Used only in demo mode. |
location | none | Recommended live path: one U.S. city/state, ZIP code, or street address. Leave empty when using locations[]. |
locations | none | Advanced live batch: up to 50 requested rows and at most 25 unique location/scan-control fingerprints. Exact duplicates remain visible but are not separate charge candidates. |
radiusMiles | 5 | Live search radius from 1 to 25 miles. Filtering remains best effort when a source omits distance. |
cuisineFilter | none | Optional live cuisine/category filter such as pizza or wings. |
maxRestaurants | 200 | Maximum deduplicated candidates reviewed in depth, from 10 to 1000. |
confidenceThreshold | 0.5 | Minimum evidence-strength score from 0.0 to 1.0. It is not a verified accuracy probability. |
includeTraditionalRestaurants | false | Includes traditional and unknown rows as well as candidate classifications. |
batchConcurrency | 1 | Runs at most 1 to 3 unique live market scans concurrently while output and charge operations remain deterministic and serialized. |
yelpApiKey | none | Optional global secret for unofficial Yelp Fusion storefront context. Per-location secret overrides are not supported. |
Each locations[] row may override radius, cuisine, maximum restaurant count,
confidence threshold, and traditional-restaurant inclusion. It may not override
the global Yelp secret.
For a first live run, use one location with the prefilled smoke controls. For a
first batch, start with two or three markets and keep batchConcurrency at 1
until you have inspected the output and source-coverage shape.
Output Format
Dataset results
The default dataset contains one row per emitted business. V2 adds runMode
and evidenceMode while preserving the names, JSON types, and meanings of the
legacy row fields.
Important fields include:
| Field | Meaning |
|---|---|
schemaVersion | ghost-kitchen-batch-output-v2 for current rows. |
runMode, evidenceMode | Distinguish observed live evidence from visibly fictional demo evidence. |
requestIndex, locationIndex, locationId | Trace the row to its requested and unique market identity. |
requestLocation, resolvedLocation | Preserve request identity and resolved live context. |
locationStatus, chargeStatus | Show the per-location publication and billing state. |
name, address, sources, platformUrl | Preserve the listed business and source context when available. |
classification, confidenceScore, evidenceSummary | Record the evidence tier, evidence-strength score, and plain-English basis. |
addressClusterId, brandsAtThisAddress | Link the row to an emitted address group; these fields do not establish ownership. |
Pair dataset rows with OUTPUT.sourceCoverage before interpreting a missing
source, quiet market, or unknown classification.
JSON OUTPUT summary
The structured summary uses
schemaVersion: "ghost-kitchen-batch-output-v2"runModeβliveordemo.sourceCoverageβ aggregate grade, reachability counts, explanation, limitations, and deterministic per-source/per-location rows.addressClustersβ basis, limitation, total/embedded/omitted counts, bounded dossiers, classification counts, strongest existing evidence, and exact dataset trace identity.marketScorecardβ qualitative signal, coverage context, observable counts, explanation, and limitations.
OUTPUT.locations[] carries the same three intelligence products for each
request row. Duplicate, spend-limit, timeout, queued, and pre-output rows remain
not_started / insufficient_coverage; they do not borrow another market's
evidence. A charge failure after complete output preserves valid collection
evidence while keeping the billing failure explicit.
Deadline-safe nonchargeable finalization
Once whole-location source work starts, the Actor derives its remaining budget
from the platform deadline and preserves a separate 45-second finalization
reserve. If that source-work budget is exhausted, the incomplete location uses
the existing zero_event_pre_output_failure /
ineligible_pre_output_failure contract, releases its reserved charge slot,
and attempts the complete dataset, JSON OUTPUT, OUTPUT.html, and checkpoint
finalization path. After those artifacts are durable, the Actor reports durable
nonchargeable deadline output; it does not attach a charged event name or make a
charge attempt.
A deadline-exhausted location carries no completed direct source observation,
stays not_started / insufficient_coverage, and does not borrow evidence from
a completed sibling. If HTML or another required artifact cannot be finalized,
the incomplete bundle remains nonchargeable. This cooperative async deadline
protects reserved finalization time when source work yields to the runtime; it
does not guarantee source availability, artifact storage, or every-run success.
Source coverage grades
Coverage is based on declared source-location reachability, not restaurant count:
| Grade | Meaning |
|---|---|
complete | Every declared source-location observation was reached, including reached-empty sources. |
partial | Usable observations exist, but the declared scope is incomplete without falling into the stricter limited case. |
limited | A strict minority of declared observations supplied usable reachability. The scorecard is forced to insufficient_coverage. |
unavailable | No usable observation exists and at least one source failed. The scorecard is forced to insufficient_coverage. |
not_started | No source observation began for the location. The scorecard is forced to insufficient_coverage. |
A reached-empty market can be complete; that means the declared sources were
reached, not that no ghost kitchens exist. An all-source blackout is
unavailable, writes diagnostics when storage permits, fails the run, and is
not charge eligible.
Market scorecard signals
| Signal | Meaning |
|---|---|
concentrated_candidates | Complete or partial coverage plus at least one confirmed/likely candidate in an embedded notable shared-address dossier. |
candidate_presence | Complete or partial coverage plus candidate rows, but no candidate-bearing embedded notable dossier. |
quiet_or_inconclusive | Complete or partial coverage with no confirmed/likely candidate row. This is not proof of absence. |
insufficient_coverage | Limited, unavailable, or not-started coverage overrides attractive row or cluster counts. |
The scorecard deliberately has no 0β100 score, probability, accuracy claim, demand estimate, or official-status field.
Address-cluster dossiers
A notable dossier requires at least two distinct emitted brand identities that share the exact location, emitted cluster id, and emitted normalized address. The product embeds at most 25 dossiers and reports omitted count plus truncation state. Exact duplicate row copies do not inflate distinct-brand or classification counts.
Every dossier includes an exact dataset trace tuple. It remains observational public-source evidence and does not establish common ownership, shared operations, legal ghost-kitchen status, commercial demand, or exhaustive market coverage.
HTML market report
OUTPUT.html is stored in the default key-value store under the exact key
OUTPUT.html with content type text/html; charset=utf-8. The Actor output
link points directly to that record.
The report renders the same typed summary as JSON OUTPUT. It is self-contained,
script-free, remote-resource-free, contextually escaped, and capped at 512 KiB.
If rendering exceeds the bound, it fails closed instead of publishing a
truncated report.
Billing and artifact states
OUTPUT.locations[] is the quickest place to audit live billing semantics:
| Status | Meaning |
|---|---|
demo_no_charge | Fictional demo output; no live source or charge work occurred. |
charged | The complete product bundle was durable and the location-analyzed charge completed. |
duplicate_skipped | Exact duplicate alias; no separate charge candidate. |
skipped_spend_limit | Source work did not start because the remaining run cap could not cover another possible event. |
zero_event_blackout | Every source failed before trustworthy listings were collected; no charge attempt. |
zero_event_pre_output_failure | The location failed before durable useful output; no charge attempt. |
charge_failed_after_output | Useful output exists, but the later charge call failed. Inspect before rerunning. |
charge_limit_reached | Apify charge-limit feedback stopped further eligible charge attempts. |
If a dataset, JSON, or HTML write fails, no charge is attempted for that incomplete bundle. Successful earlier writes remain inspectable, and the Actor attempts a truthful non-chargeable checkpoint and corrected views when the remaining storage surfaces permit it.
How To Read Classifications
| Classification | Directional interpretation |
|---|---|
confirmed_ghost_kitchen | Strongest local evidence tier. Despite the legacy name, it is not an official or legal confirmation. |
likely_ghost_kitchen | Meaningful candidate indicators exist, but the evidence is weaker than the strongest tier. |
virtual_brand | The name matches a known virtual-brand family without enough address/operating evidence for a ghost-kitchen candidate tier. |
traditional | Affirmative storefront context supports a traditional-restaurant interpretation. |
unknown | Available signals are too limited or contradictory for a responsible directional call. |
confidenceScore measures strength of the local heuristic evidence. It is not
verified accuracy and should not be interpreted as a probability.
Agent And API Use
Read the Actor output links for all three surfaces:
- dataset rows for business-level evidence;
runSummaryfor JSONOUTPUT; andhtmlReportforOUTPUT.html.
Before chaining a result, inspect runMode, sourceCoverage,
marketScorecard, addressClusters, locations[], sourceHealth,
partialData, and charge status. For live API work, use Apify's
maxTotalChargeUsd run option when a hard budget is required.
Limitations
- The Actor currently attempts public-source collection from DoorDash, Uber Eats, and Grubhub. Those sources can return partial data, rate limits, blocked requests, schema drift, or no usable listing data.
- Optional Yelp Fusion enrichment can add storefront context, but missing Yelp evidence stays unknown rather than false.
- Address normalization and shared-address grouping are heuristic and depend on source formatting.
- The product supports U.S. locations only.
- Batch mode admits at most 50 requested rows and 25 unique market fingerprints.
- Radius filtering is best effort when a source omits usable distance data.
- The embedded dossier list is bounded; omitted dossiers remain counted but do not support candidate-bearing cluster claims.
- Demo output proves deterministic local behavior only. It does not prove live source coverage, Store propagation, production scale, support readiness, or paid-event behavior.
Disclaimer
This is an unofficial market-research Actor. It is not an official business registry and does not make legal, regulatory, ownership, health, licensing, or exhaustive-coverage determinations. It is not affiliated with, endorsed by, or associated with DoorDash, Uber Eats, Grubhub, or Yelp. Product names and trademarks belong to their respective owners.
Use the output to prioritize manual research, not as the sole basis for legal, credit, investment, leasing, employment, enforcement, or other high-impact decisions.
Permissions
This Actor is designed to run with limited permissions. It uses its own default dataset and key-value store plus outbound HTTP requests to delivery platforms, Nominatim geocoding, and optional Yelp Fusion. It does not require access to your other Apify storages or account resources.
Memory posture
Ghost 0.4.0 declares a 128 MiB minimum and default with a 1024 MiB maximum. The fixed Actor default is 128 MiB, while callers can still override a run within those bounds. This smaller default was selected from bounded local benchmark and live smoke evidence.
That evidence supports the observed default and smoke workload class. It does not prove every future workload, guarantee production-scale headroom, or establish realized cost savings.
Pricing
Live execution uses Pay Per Event pricing at $0.10 per eligible
location-analyzed event. The unchanged event boundary is one unique requested
location and scan-control fingerprint that reaches a complete durable artifact
bundle and remains charge eligible.
The following are not separate charge units:
- demo scenarios;
- exact duplicate aliases;
- spend-limit skips;
- all-source blackouts;
- deadline-exhausted locations;
- pre-output failures; and
- incomplete dataset/JSON/HTML publication bundles.
An honestly reached empty market may still be eligible because reached-empty coverage is useful evidence. A partial-source success may also be eligible when the product bundle is durable and the missing coverage remains explicit.
Apify may display the same rate as $100.00 / 1,000 analyzed locations. There
are no separate pass-through compute or platform-usage charges added on top of
the event price by this Actor.
For batch and agent/API runs, set maxTotalChargeUsd to the maximum number of
full events you are willing to allow. Rows skipped by local spend-limit
accounting remain visible in OUTPUT.locations[].
Release History
See ./CHANGELOG.md for version-by-version notes. The leading 0.4.0 entry describes the current product contract. Release evidence is tracked separately from version notes, so a changelog entry does not by itself prove GitHub, Apify build/run/storage, Store, or rendered propagation.

