{
  "openapi": "3.0.1",
  "info": {
    "title": "Ghost Kitchen & Virtual Brand Research",
    "description": "Make sense of overlapping restaurant listings. Compare shared locations and conflicting details, then get a clear list of what to investigate next. Bring your own listings.",
    "version": "0.14",
    "x-build-id": "ZoXRcqZgt5Uk9CZHE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/critd~ghost-kitchen-detector/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-critd-ghost-kitchen-detector",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/critd~ghost-kitchen-detector/runs": {
      "post": {
        "operationId": "runs-sync-critd-ghost-kitchen-detector",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/critd~ghost-kitchen-detector/run-sync": {
      "post": {
        "operationId": "run-sync-critd-ghost-kitchen-detector",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "inputSource": {
            "title": "Input source",
            "enum": [
              "example",
              "records",
              "source"
            ],
            "type": "string",
            "description": "Choose the fictional example or your data. Fill only the matching data field; clear any previously entered data when switching. This selection has no API default. The example runs the normal priced workflow; check the displayed maximum cost before starting."
          },
          "mode": {
            "title": "Analysis mode (fixed)",
            "enum": [
              "analyze_supplied"
            ],
            "type": "string",
            "description": "Fixed at analyze_supplied; there is no alternate production mode. Retained for saved/API inputs. Retired location-scanning inputs only receive migration guidance, with no bundle charge."
          },
          "market": {
            "title": "Market context",
            "required": [
              "label",
              "countryCode"
            ],
            "type": "object",
            "description": "Tell us which market your listings concern. This label provides context; it does not establish coverage of that market.",
            "properties": {
              "label": {
                "title": "Market label",
                "type": "string",
                "description": "A buyer-readable market label such as Chicago, IL.",
                "editor": "textfield",
                "minLength": 1,
                "maxLength": 200
              },
              "countryCode": {
                "title": "Country code",
                "type": "string",
                "description": "Two-letter country context. This value does not establish cohort coverage.",
                "editor": "textfield",
                "pattern": "^[A-Za-z]{2}$"
              }
            },
            "additionalProperties": false
          },
          "rightsBasis": {
            "title": "Your permission to use this data",
            "enum": [
              "first_party",
              "licensed_for_analysis",
              "otherwise_authorized"
            ],
            "type": "string",
            "description": "For your data, explicitly choose your authority to submit these business observations for analysis. Uploading data is not blanket permission for another use. Leave unset for the fictional example."
          },
          "freshnessHorizonDays": {
            "title": "Flag observations older than (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Choose the observation-age threshold (1 to 3,650 days) for your research. Older facts are flagged as outdated; missing dates stay unknown. The run date never replaces a source observation date. Leave unset for the fictional example; its long threshold is not a recommendation."
          },
          "sourceLabelDefault": {
            "title": "Default source label (optional)",
            "minLength": 1,
            "maxLength": 120,
            "type": "string",
            "description": "Used only when a row has no sourceLabel. Use the actual source identity; relabeling copies does not make them independent sources."
          },
          "records": {
            "title": "Your supplied records",
            "minItems": 0,
            "maxItems": 250,
            "type": "array",
            "description": "Enter 1 to 250 permitted, non-sensitive business observations. When Capture changes is selected, this is the later capture and may be empty if the earlier capture has rows; the combined limit is 250. Remove Source when using records. Missing, null and blank selected facts remain distinct in comparisons. The fictional example is never added to your data.",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "name",
                "address"
              ],
              "properties": {
                "name": {
                  "title": "Business Name",
                  "type": "string",
                  "description": "Selected business or brand name.",
                  "editor": "textfield",
                  "minLength": 1,
                  "maxLength": 300
                },
                "address": {
                  "title": "Business Address",
                  "type": "string",
                  "description": "Selected business-location address.",
                  "editor": "textfield",
                  "minLength": 1,
                  "maxLength": 600
                },
                "sourceLabel": {
                  "title": "Source Label",
                  "type": "string",
                  "description": "Exact source identity for this observation. Required unless sourceLabelDefault is provided.",
                  "editor": "textfield",
                  "minLength": 1,
                  "maxLength": 120,
                  "nullable": true
                },
                "sourceRecordId": {
                  "title": "Source Record ID",
                  "type": "string",
                  "description": "Optional source-local row identifier retained for traceability.",
                  "editor": "textfield",
                  "maxLength": 240,
                  "nullable": true
                },
                "observedAt": {
                  "title": "Source observation date",
                  "type": "string",
                  "description": "When the source fact was observed, in RFC 3339 format (for example, 2026-09-01T12:00:00Z). Leave missing dates unknown; do not substitute the run date. Future dates are rejected.",
                  "editor": "textfield",
                  "nullable": true
                },
                "website": {
                  "title": "Business Website",
                  "type": "string",
                  "description": "Optional absolute HTTP(S) business URL without credentials, query, or fragment.",
                  "editor": "textfield",
                  "maxLength": 500,
                  "nullable": true
                },
                "phone": {
                  "title": "Business Phone",
                  "type": "string",
                  "description": "Optional business phone used only as a supplied comparison fact.",
                  "editor": "textfield",
                  "maxLength": 500,
                  "nullable": true
                },
                "category": {
                  "title": "Observed Category",
                  "type": "string",
                  "description": "Optional supplied business category.",
                  "editor": "textfield",
                  "maxLength": 500,
                  "nullable": true
                },
                "declaredBrand": {
                  "title": "Declared Brand",
                  "type": "string",
                  "description": "Optional supplied brand relationship; it is not independent ownership verification.",
                  "editor": "textfield",
                  "maxLength": 500,
                  "nullable": true
                },
                "operatingObservation": {
                  "title": "Observed operating model",
                  "type": "string",
                  "description": "Optional explicit observation from this source row.",
                  "editor": "select",
                  "enum": [
                    "delivery_only",
                    "dine_in"
                  ],
                  "enumTitles": [
                    "Delivery-only observed",
                    "Dine-in observed"
                  ],
                  "nullable": true
                },
                "observationKey": {
                  "title": "Observation key",
                  "type": "string",
                  "editor": "textfield",
                  "minLength": 1,
                  "maxLength": 128,
                  "description": "Required only for marketCount. Unique literal receipt key; leading zeros, case and surrounding spaces are preserved. It does not change exact-observation deduplication.",
                  "nullable": true
                }
              }
            }
          },
          "source": {
            "title": "Source",
            "required": [
              "type"
            ],
            "type": "object",
            "description": "For My stored data / file, select one uploaded CSV/JSONL/JSON array, Apify Dataset, or key-value store record. Up to 250 observations; file bodies are limited to 8,000,000 bytes. Only mapped facts enter analysis and output. Remove Your supplied records when using this route.",
            "properties": {
              "type": {
                "title": "Source Type",
                "type": "string",
                "description": "Select exactly one supported Apify storage route.",
                "editor": "select",
                "enum": [
                  "file",
                  "dataset",
                  "keyValueStore"
                ],
                "enumTitles": [
                  "File upload",
                  "Dataset",
                  "Key-value store record"
                ]
              },
              "fileUrl": {
                "title": "Uploaded File",
                "type": "string",
                "description": "For type=file, select a credential-free https://api.apify.com KVS record URL. Arbitrary URLs and query tokens are rejected.",
                "editor": "fileupload"
              },
              "datasetId": {
                "title": "Dataset ID or Name",
                "type": "string",
                "description": "For type=dataset, select a Dataset with READ access.",
                "editor": "resourcePicker",
                "resourceType": "dataset",
                "resourcePermissions": [
                  "READ"
                ],
                "maxLength": 256
              },
              "storeId": {
                "title": "Key-value Store ID or Name",
                "type": "string",
                "description": "For type=keyValueStore, select a KVS with READ access.",
                "editor": "resourcePicker",
                "resourceType": "keyValueStore",
                "resourcePermissions": [
                  "READ"
                ],
                "maxLength": 256
              },
              "recordKey": {
                "title": "Record Key",
                "type": "string",
                "description": "For type=keyValueStore, the record containing CSV, JSONL, or one JSON array.",
                "editor": "textfield",
                "maxLength": 256
              },
              "format": {
                "title": "Text Format",
                "type": "string",
                "description": "Optional declared file/KVS format. When omitted, content type, key suffix, and bounded body shape are used conservatively.",
                "editor": "select",
                "enum": [
                  "csv",
                  "jsonl",
                  "json"
                ],
                "enumTitles": [
                  "CSV",
                  "JSON Lines",
                  "JSON array"
                ]
              },
              "fieldMap": {
                "title": "Match your source columns (optional)",
                "type": "object",
                "description": "Map supported facts to distinct source columns. marketCount additionally selects a literal observation key; without marketCount the key column is not requested or analyzed.",
                "editor": "json",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "title": "Name field",
                    "type": "string",
                    "description": "Source field containing the business name. Runtime uses name when omitted.",
                    "editor": "textfield"
                  },
                  "address": {
                    "title": "Address field",
                    "type": "string",
                    "description": "Source field containing the business address. Runtime uses address when omitted.",
                    "editor": "textfield"
                  },
                  "sourceLabel": {
                    "title": "Source-label field",
                    "type": "string",
                    "description": "Source field containing per-row source identity. Runtime uses sourceLabel when omitted.",
                    "editor": "textfield"
                  },
                  "sourceRecordId": {
                    "title": "Source-record-id field",
                    "type": "string",
                    "description": "Source field containing the optional source record id. Runtime uses sourceRecordId when omitted.",
                    "editor": "textfield"
                  },
                  "observedAt": {
                    "title": "Observed-at field",
                    "type": "string",
                    "description": "Source field containing the optional RFC 3339 observation clock. Runtime uses observedAt when omitted.",
                    "editor": "textfield"
                  },
                  "website": {
                    "title": "Website field",
                    "type": "string",
                    "description": "Source field containing the optional business URL. Runtime uses website when omitted.",
                    "editor": "textfield"
                  },
                  "phone": {
                    "title": "Phone field",
                    "type": "string",
                    "description": "Source field containing the optional business phone. Runtime uses phone when omitted.",
                    "editor": "textfield"
                  },
                  "category": {
                    "title": "Category field",
                    "type": "string",
                    "description": "Source field containing the optional category. Runtime uses category when omitted.",
                    "editor": "textfield"
                  },
                  "declaredBrand": {
                    "title": "Declared-brand field",
                    "type": "string",
                    "description": "Source field containing the optional declared brand. Runtime uses declaredBrand when omitted.",
                    "editor": "textfield"
                  },
                  "operatingObservation": {
                    "title": "Operating-observation field",
                    "type": "string",
                    "description": "Source field containing delivery_only or dine_in when observed. Runtime uses operatingObservation when omitted.",
                    "editor": "textfield"
                  },
                  "observationKey": {
                    "title": "Observation-key field",
                    "type": "string",
                    "editor": "textfield",
                    "minLength": 1,
                    "maxLength": 128,
                    "description": "Only with marketCount. Runtime selects observationKey when omitted; retain exact string values without trimming."
                  }
                }
              }
            },
            "additionalProperties": false
          },
          "demoMode": {
            "title": "Retired Demo Mode (inactive)",
            "type": "boolean",
            "description": "Recognized only for saved-input compatibility. It cannot activate a demo, collector, provider, billing unit, or the new analysis mode."
          },
          "demoScenario": {
            "title": "Retired Demo Scenario (inactive)",
            "type": "string",
            "description": "Recognized but never executed."
          },
          "location": {
            "title": "Retired Location (inactive)",
            "type": "string",
            "description": "Recognized but never collected."
          },
          "locations": {
            "title": "Retired Locations (inactive)",
            "type": "array",
            "description": "Recognized but never collected.",
            "items": {
              "type": "object"
            }
          },
          "batchConcurrency": {
            "title": "Retired Batch Concurrency (inactive)",
            "type": "integer",
            "description": "Recognized but never executed."
          },
          "radiusMiles": {
            "title": "Retired Radius (inactive)",
            "type": "integer",
            "description": "Recognized but never executed."
          },
          "cuisineFilter": {
            "title": "Retired Cuisine Filter (inactive)",
            "type": "string",
            "description": "Recognized but never executed."
          },
          "maxRestaurants": {
            "title": "Retired Maximum Restaurants (inactive)",
            "type": "integer",
            "description": "Recognized but never executed."
          },
          "confidenceThreshold": {
            "title": "Retired Confidence Threshold (inactive)",
            "type": "number",
            "description": "Recognized but never executed."
          },
          "includeTraditionalRestaurants": {
            "title": "Retired Inclusion Control (inactive)",
            "type": "boolean",
            "description": "Recognized but never executed."
          },
          "yelpApiKey": {
            "title": "Retired Yelp Key (inactive)",
            "type": "string",
            "description": "Recognized as an encrypted compatibility field but never read, transmitted, or emitted."
          },
          "marketCount": {
            "title": "Count the opportunity, not just the listings.",
            "required": [
              "windowStart",
              "windowEnd",
              "hypotheses"
            ],
            "type": "object",
            "description": "Optional supplied-cohort count brief. Compare1–3 explicit grouping hypotheses in one observation window; no verified premises, ownership, market census or statistical forecast. No extra group/scenario charge. JSON and HTML each<=512KiB.",
            "properties": {
              "windowStart": {
                "title": "Window start",
                "type": "string",
                "editor": "textfield",
                "description": "Inclusive RFC3339 observation instant."
              },
              "windowEnd": {
                "title": "Window end",
                "type": "string",
                "editor": "textfield",
                "description": "Exclusive RFC3339 observation instant, after start."
              },
              "hypotheses": {
                "title": "Hypotheses",
                "type": "array",
                "editor": "json",
                "minItems": 1,
                "maxItems": 3,
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "hypothesisId",
                    "groups"
                  ],
                  "properties": {
                    "hypothesisId": {
                      "title": "Hypothesis ID",
                      "type": "string",
                      "editor": "textfield",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Unique literal label for one caller-declared partition."
                    },
                    "groups": {
                      "type": "array",
                      "title": "Declared groups",
                      "editor": "json",
                      "maxItems": 250,
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "groupId",
                          "observationKeys"
                        ],
                        "properties": {
                          "groupId": {
                            "title": "Group ID",
                            "type": "string",
                            "editor": "textfield",
                            "minLength": 1,
                            "maxLength": 128,
                            "description": "A literal label for this declared group, not a verified premises identity."
                          },
                          "observationKeys": {
                            "type": "array",
                            "title": "Observation keys",
                            "editor": "json",
                            "maxItems": 750,
                            "items": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 128
                            },
                            "description": "Exact keys of observations assigned to this group. Duplicate aliases count once within a group; multiple group assignment is unresolved."
                          }
                        }
                      },
                      "description": "At most250 groups and750 total references per hypothesis; empty or duplicate groups are unresolved."
                    }
                  }
                },
                "description": "Explicit site/grouping assumptions over exact supplied observation keys."
              },
              "relationships": {
                "title": "Declared relationships",
                "type": "array",
                "editor": "json",
                "maxItems": 500,
                "description": "Optional caller constraints. They are not independently verified identity. Unmapped or contradictory constraints keep the hypothesis unresolved.",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "left",
                    "right",
                    "relation"
                  ],
                  "properties": {
                    "left": {
                      "title": "Left key",
                      "type": "string",
                      "editor": "textfield",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Exact observation key."
                    },
                    "right": {
                      "title": "Right key",
                      "type": "string",
                      "editor": "textfield",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "Exact observation key."
                    },
                    "relation": {
                      "title": "Relationship",
                      "type": "string",
                      "editor": "select",
                      "enum": [
                        "same_site",
                        "separate_sites"
                      ],
                      "description": "Your explicit site constraint; not verified ownership."
                    }
                  }
                }
              }
            },
            "additionalProperties": false
          },
          "captureChanges": {
            "title": "Compare two captures (optional)",
            "required": [
              "earlier",
              "later"
            ],
            "type": "object",
            "description": "Add an earlier capture to see what differs from the later one. Your main records/source and market above are the later capture. Leave this object absent for ordinary single-capture review. Up to 250 observations combined and 8,000,000 total input/control bytes; no second-capture or per-change fee.",
            "properties": {
              "earlier": {
                "title": "Earlier capture",
                "type": "object",
                "editor": "json",
                "additionalProperties": false,
                "required": [
                  "market",
                  "context"
                ],
                "description": "Supply earlier observations using exactly one of records or source; an empty records array represents an empty capture, not a failed read. Rights and freshness settings above apply to both captures.",
                "properties": {
                  "market": {
                    "title": "Market context",
                    "type": "object",
                    "description": "Tell us which market your listings concern. This label provides context; it does not establish coverage of that market.",
                    "editor": "json",
                    "additionalProperties": false,
                    "required": [
                      "label",
                      "countryCode"
                    ],
                    "properties": {
                      "label": {
                        "title": "Market label",
                        "type": "string",
                        "description": "A buyer-readable market label such as Chicago, IL.",
                        "editor": "textfield",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "countryCode": {
                        "title": "Country code",
                        "type": "string",
                        "description": "Two-letter country context. This value does not establish cohort coverage.",
                        "editor": "textfield",
                        "pattern": "^[A-Za-z]{2}$"
                      }
                    }
                  },
                  "context": {
                    "title": "Capture scope and coverage",
                    "type": "object",
                    "editor": "json",
                    "additionalProperties": false,
                    "description": "Declare what was collected, when known, and whether coverage is complete, partial, failed or unknown. Upload time is not capture time.",
                    "required": [
                      "geographicScope",
                      "filterScope",
                      "sourceNamespaces",
                      "coverage"
                    ],
                    "properties": {
                      "geographicScope": {
                        "title": "Geographic scope",
                        "type": "string",
                        "editor": "textfield",
                        "description": "Exact collection geography, including any radius/boundaries. Use the same declaration for comparable captures.",
                        "minLength": 1,
                        "maxLength": 1000
                      },
                      "filterScope": {
                        "title": "Collection filters",
                        "type": "string",
                        "editor": "textfield",
                        "description": "Exact collection filters and coverage universe, or an explicit no-filters declaration. A narrowed capture is not market contraction.",
                        "minLength": 1,
                        "maxLength": 1000
                      },
                      "sourceNamespaces": {
                        "title": "Stable listing identity",
                        "type": "object",
                        "editor": "json",
                        "description": "Map each exact sourceLabel to a declared stable namespace string (1 to 240 characters). Non-text, blank and control-containing namespaces are refused before publication; undeclared labels remain unmatched.",
                        "additionalProperties": true
                      },
                      "coverage": {
                        "title": "Capture coverage",
                        "type": "string",
                        "editor": "select",
                        "enum": [
                          "declared_complete",
                          "partial",
                          "failed",
                          "unknown"
                        ],
                        "enumTitles": [
                          "Declared complete (not verified)",
                          "Partial",
                          "Failed",
                          "Unknown"
                        ],
                        "description": "Your declaration for this capture scope, not independently verified completeness."
                      },
                      "capturedAt": {
                        "title": "Capture date, if known",
                        "type": "string",
                        "editor": "textfield",
                        "description": "Optional RFC 3339 capture timestamp, with at most nine fractional-second digits. Greater precision is refused without rounding. Future and reversed known clocks are rejected; missing or equal clocks do not establish order.",
                        "nullable": true
                      }
                    }
                  },
                  "records": {
                    "title": "Your supplied records",
                    "type": "array",
                    "description": "Choose My supplied records under Input source and enter 1 to 250 permitted, non-sensitive business observations here. Several observations can describe one venue. Remove Source when using this route; empty or null still counts as supplied. The fictional example is never added to your data. Existing API inputs may omit inputSource and use exactly one data route.",
                    "editor": "json",
                    "minItems": 0,
                    "maxItems": 250,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "address"
                      ],
                      "properties": {
                        "name": {
                          "title": "Business Name",
                          "type": "string",
                          "description": "Selected business or brand name.",
                          "editor": "textfield",
                          "minLength": 1,
                          "maxLength": 300
                        },
                        "address": {
                          "title": "Business Address",
                          "type": "string",
                          "description": "Selected business-location address.",
                          "editor": "textfield",
                          "minLength": 1,
                          "maxLength": 600
                        },
                        "sourceLabel": {
                          "title": "Source Label",
                          "type": "string",
                          "description": "Exact source identity for this observation. Required unless sourceLabelDefault is provided.",
                          "editor": "textfield",
                          "minLength": 1,
                          "maxLength": 120,
                          "nullable": true
                        },
                        "sourceRecordId": {
                          "title": "Source Record ID",
                          "type": "string",
                          "description": "Optional source-local row identifier retained for traceability.",
                          "editor": "textfield",
                          "maxLength": 240,
                          "nullable": true
                        },
                        "observedAt": {
                          "title": "Source observation date",
                          "type": "string",
                          "description": "When the source fact was observed, in RFC 3339 format (for example, 2026-09-01T12:00:00Z). Leave missing dates unknown; do not substitute the run date. Future dates are rejected.",
                          "editor": "textfield",
                          "nullable": true
                        },
                        "website": {
                          "title": "Business Website",
                          "type": "string",
                          "description": "Optional absolute HTTP(S) business URL without credentials, query, or fragment.",
                          "editor": "textfield",
                          "maxLength": 500,
                          "nullable": true
                        },
                        "phone": {
                          "title": "Business Phone",
                          "type": "string",
                          "description": "Optional business phone used only as a supplied comparison fact.",
                          "editor": "textfield",
                          "maxLength": 500,
                          "nullable": true
                        },
                        "category": {
                          "title": "Observed Category",
                          "type": "string",
                          "description": "Optional supplied business category.",
                          "editor": "textfield",
                          "maxLength": 500,
                          "nullable": true
                        },
                        "declaredBrand": {
                          "title": "Declared Brand",
                          "type": "string",
                          "description": "Optional supplied brand relationship; it is not independent ownership verification.",
                          "editor": "textfield",
                          "maxLength": 500,
                          "nullable": true
                        },
                        "operatingObservation": {
                          "title": "Observed operating model",
                          "type": "string",
                          "description": "Optional explicit observation from this source row.",
                          "editor": "select",
                          "enum": [
                            "delivery_only",
                            "dine_in"
                          ],
                          "enumTitles": [
                            "Delivery-only observed",
                            "Dine-in observed"
                          ],
                          "nullable": true
                        },
                        "observationKey": {
                          "title": "Observation key",
                          "type": "string",
                          "editor": "textfield",
                          "minLength": 1,
                          "maxLength": 128,
                          "description": "Required only for marketCount. Unique literal receipt key; leading zeros, case and surrounding spaces are preserved. It does not change exact-observation deduplication.",
                          "nullable": true
                        }
                      }
                    }
                  },
                  "source": {
                    "title": "Source",
                    "type": "object",
                    "description": "For My stored data / file, select one uploaded CSV/JSONL/JSON array, Apify Dataset, or key-value store record. Up to 250 observations; file bodies are limited to 8,000,000 bytes. Only mapped facts enter analysis and output. Remove Your supplied records when using this route.",
                    "editor": "json",
                    "additionalProperties": false,
                    "required": [
                      "type"
                    ],
                    "properties": {
                      "type": {
                        "title": "Source Type",
                        "type": "string",
                        "description": "Select exactly one supported Apify storage route.",
                        "editor": "select",
                        "enum": [
                          "file",
                          "dataset",
                          "keyValueStore"
                        ],
                        "enumTitles": [
                          "File upload",
                          "Dataset",
                          "Key-value store record"
                        ]
                      },
                      "fileUrl": {
                        "title": "Uploaded File",
                        "type": "string",
                        "description": "For type=file, select a credential-free https://api.apify.com KVS record URL. Arbitrary URLs and query tokens are rejected.",
                        "editor": "fileupload"
                      },
                      "datasetId": {
                        "title": "Dataset ID or Name",
                        "type": "string",
                        "description": "For type=dataset, select a Dataset with READ access.",
                        "editor": "resourcePicker",
                        "resourceType": "dataset",
                        "resourcePermissions": [
                          "READ"
                        ],
                        "maxLength": 256
                      },
                      "storeId": {
                        "title": "Key-value Store ID or Name",
                        "type": "string",
                        "description": "For type=keyValueStore, select a KVS with READ access.",
                        "editor": "resourcePicker",
                        "resourceType": "keyValueStore",
                        "resourcePermissions": [
                          "READ"
                        ],
                        "maxLength": 256
                      },
                      "recordKey": {
                        "title": "Record Key",
                        "type": "string",
                        "description": "For type=keyValueStore, the record containing CSV, JSONL, or one JSON array.",
                        "editor": "textfield",
                        "maxLength": 256
                      },
                      "format": {
                        "title": "Text Format",
                        "type": "string",
                        "description": "Optional declared file/KVS format. When omitted, content type, key suffix, and bounded body shape are used conservatively.",
                        "editor": "select",
                        "enum": [
                          "csv",
                          "jsonl",
                          "json"
                        ],
                        "enumTitles": [
                          "CSV",
                          "JSON Lines",
                          "JSON array"
                        ]
                      },
                      "fieldMap": {
                        "title": "Match your source columns (optional)",
                        "type": "object",
                        "description": "Map supported facts to distinct source columns. marketCount additionally selects a literal observation key; without marketCount the key column is not requested or analyzed.",
                        "editor": "json",
                        "additionalProperties": false,
                        "properties": {
                          "name": {
                            "title": "Name field",
                            "type": "string",
                            "description": "Source field containing the business name. Runtime uses name when omitted.",
                            "editor": "textfield"
                          },
                          "address": {
                            "title": "Address field",
                            "type": "string",
                            "description": "Source field containing the business address. Runtime uses address when omitted.",
                            "editor": "textfield"
                          },
                          "sourceLabel": {
                            "title": "Source-label field",
                            "type": "string",
                            "description": "Source field containing per-row source identity. Runtime uses sourceLabel when omitted.",
                            "editor": "textfield"
                          },
                          "sourceRecordId": {
                            "title": "Source-record-id field",
                            "type": "string",
                            "description": "Source field containing the optional source record id. Runtime uses sourceRecordId when omitted.",
                            "editor": "textfield"
                          },
                          "observedAt": {
                            "title": "Observed-at field",
                            "type": "string",
                            "description": "Source field containing the optional RFC 3339 observation clock. Runtime uses observedAt when omitted.",
                            "editor": "textfield"
                          },
                          "website": {
                            "title": "Website field",
                            "type": "string",
                            "description": "Source field containing the optional business URL. Runtime uses website when omitted.",
                            "editor": "textfield"
                          },
                          "phone": {
                            "title": "Phone field",
                            "type": "string",
                            "description": "Source field containing the optional business phone. Runtime uses phone when omitted.",
                            "editor": "textfield"
                          },
                          "category": {
                            "title": "Category field",
                            "type": "string",
                            "description": "Source field containing the optional category. Runtime uses category when omitted.",
                            "editor": "textfield"
                          },
                          "declaredBrand": {
                            "title": "Declared-brand field",
                            "type": "string",
                            "description": "Source field containing the optional declared brand. Runtime uses declaredBrand when omitted.",
                            "editor": "textfield"
                          },
                          "operatingObservation": {
                            "title": "Operating-observation field",
                            "type": "string",
                            "description": "Source field containing delivery_only or dine_in when observed. Runtime uses operatingObservation when omitted.",
                            "editor": "textfield"
                          },
                          "observationKey": {
                            "title": "Observation-key field",
                            "type": "string",
                            "editor": "textfield",
                            "minLength": 1,
                            "maxLength": 128,
                            "description": "Only with marketCount. Runtime selects observationKey when omitted; retain exact string values without trimming."
                          }
                        }
                      }
                    }
                  },
                  "sourceLabelDefault": {
                    "title": "Default source label (optional)",
                    "type": "string",
                    "description": "Used only when a row has no sourceLabel. Use the actual source identity; relabeling copies does not make them independent sources.",
                    "editor": "textfield",
                    "minLength": 1,
                    "maxLength": 120
                  }
                }
              },
              "later": {
                "title": "Later capture scope and coverage",
                "type": "object",
                "editor": "json",
                "additionalProperties": false,
                "description": "Declare what was collected, when known, and whether coverage is complete, partial, failed or unknown. Upload time is not capture time.",
                "required": [
                  "geographicScope",
                  "filterScope",
                  "sourceNamespaces",
                  "coverage"
                ],
                "properties": {
                  "geographicScope": {
                    "title": "Geographic scope",
                    "type": "string",
                    "editor": "textfield",
                    "description": "Exact collection geography, including any radius/boundaries. Use the same declaration for comparable captures.",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  "filterScope": {
                    "title": "Collection filters",
                    "type": "string",
                    "editor": "textfield",
                    "description": "Exact collection filters and coverage universe, or an explicit no-filters declaration. A narrowed capture is not market contraction.",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  "sourceNamespaces": {
                    "title": "Stable listing identity",
                    "type": "object",
                    "editor": "json",
                    "description": "Map each exact sourceLabel to a declared stable namespace string (1 to 240 characters). Non-text, blank and control-containing namespaces are refused before publication; undeclared labels remain unmatched.",
                    "additionalProperties": true
                  },
                  "coverage": {
                    "title": "Capture coverage",
                    "type": "string",
                    "editor": "select",
                    "enum": [
                      "declared_complete",
                      "partial",
                      "failed",
                      "unknown"
                    ],
                    "enumTitles": [
                      "Declared complete (not verified)",
                      "Partial",
                      "Failed",
                      "Unknown"
                    ],
                    "description": "Your declaration for this capture scope, not independently verified completeness."
                  },
                  "capturedAt": {
                    "title": "Capture date, if known",
                    "type": "string",
                    "editor": "textfield",
                    "description": "Optional RFC 3339 capture timestamp, with at most nine fractional-second digits. Greater precision is refused without rounding. Future and reversed known clocks are rejected; missing or equal clocks do not establish order.",
                    "nullable": true
                  }
                }
              }
            },
            "additionalProperties": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}