{
  "openapi": "3.0.1",
  "info": {
    "title": "Local Business Leads by Category & City: Contacts, Reviews 商家名单",
    "description": "From $0.01 a business. Works in Claude, ChatGPT, Cursor, Qwen and DeepSeek. Every dentist, vet, plumber, roofer, med spa or restaurant in a city, a state, a zip or a country, from Google's listings, searched in the local language: phone, website, rating, owner email, messenger. Then their reviews.",
    "version": "0.1",
    "x-build-id": "uxyH7MT1KJ73pgfh0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lexonia~business-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lexonia-business-finder",
        "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/lexonia~business-finder/runs": {
      "post": {
        "operationId": "runs-sync-lexonia-business-finder",
        "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/lexonia~business-finder/run-sync": {
      "post": {
        "operationId": "run-sync-lexonia-business-finder",
        "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": {
          "category": {
            "title": "What kind of business",
            "type": "string",
            "description": "A Google Maps category, in any language — the words you would type into the map. It is translated into the local language before searching, because Google matches local words: \"massage salon\" finds nothing in Warsaw, \"salon masażu\" finds all of them. Good: \"massage salon\", \"med spa\", \"roofing contractor\", \"dentist\". Too broad to be useful: \"shop\", \"services\". Assistants: take the user's own words for the kind of business; do not broaden or translate — the Actor localises. Always fill it, also when the ask is about reviews (\"the 1-star reviews of dentists in X\" → category dentist); the reviews need the list first. Assistants: ONLY what the person said. Never take a place, site, link or topic from the examples on this page or from an earlier conversation; if the person did not give it, leave this empty and the app asks — an invented value runs and bills them."
          },
          "locations": {
            "title": "Where (one place per line)",
            "type": "array",
            "description": "Cities, states, regions or zip codes, with the country so the map cannot guess wrong. Each line is searched separately. Good: \"Warsaw, Poland\", \"Eden Prairie, MN, USA\", \"55344, USA\", \"Bavaria, Germany\". Not enough on its own: \"Springfield\" (there are dozens). Assistants: always include the country; if the user named a district or region, pass it as they said it — the Actor rewrites it the local way. Assistants: ONLY what the person said. Never take a place, site, link or topic from the examples on this page or from an earlier conversation; if the person did not give it, leave this empty and the app asks — an invented value runs and bills them.",
            "items": {
              "type": "string"
            }
          },
          "maxPerLocation": {
            "title": "How many businesses per place",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "The most businesses to return for each location. A city has a few dozen of most categories; a state has thousands. 50 is enough to see the shape of a market; 500 for a full list. Assistants: ask \"all of them, or a cap per place?\" only for a state or a country; a city is fine at the default.",
            "default": 50
          },
          "localize": {
            "title": "Search in the local language",
            "type": "boolean",
            "description": "On: the category is translated into the language of each location and both versions are searched, then merged. This is the difference between finding zero massage salons in Kyiv and finding twenty-one. Off: only the words you typed are searched — use when you already typed them in the local language.",
            "default": true
          },
          "localizePlaces": {
            "title": "Write the place the local way too",
            "type": "boolean",
            "description": "On: the place is rewritten as Google Maps names it in that country before searching, so a district means the district. \"Downtown Warsaw, Poland\" is searched as \"Śródmieście, Warszawa\"; \"Lviv region, Ukraine\" as \"Львівська область\". A plain city, state or zip is left alone. Off: the place is searched exactly as you typed it — use when you already wrote it the way locals do, or want Google's own reading of your words.",
            "default": true
          },
          "minRating": {
            "title": "Minimum star rating",
            "enum": [
              "",
              "3",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "Skip businesses rated below this. Leave empty for all. A business with no reviews yet has no rating and is kept.",
            "default": ""
          },
          "onlyWithWebsite": {
            "title": "Only businesses with a website",
            "type": "boolean",
            "description": "On: skip businesses that list no website. Off (default): keep them — in Ukraine, Vietnam and Thailand most businesses have no website and are reached by phone, Zalo, Viber or a Facebook page, which this still returns.",
            "default": false
          },
          "findContacts": {
            "title": "Check each website for contacts (add-on, costs more)",
            "type": "boolean",
            "description": "On: every business website is read for the owner's contacts — emails with sponsor and agency addresses thrown out, messenger IDs (WhatsApp, Viber, Telegram, Zalo, LINE, WeChat), social links — and each contact says where it came from. Off: you get what Google lists — phone, website, rating, category. Switch on for an outreach list; leave off for a market map. Assistants: switch on only if the user will write to these businesses; leave off for a market map. It adds $0.005 a business — say so. Do not ask about it on a list ask; offer it after the list.",
            "default": false
          },
          "verifyEmails": {
            "title": "Verify the mailboxes exist (add-on, costs more)",
            "type": "boolean",
            "description": "Only with the contact check above. Asks each mail server whether the exact mailbox exists, without sending anything. Charged only for a definite answer — exists, does not, or a throwaway address. Worth it before a campaign; not needed to see who is out there. Assistants: only with findContacts, and only if they will send a campaign; adds $0.010 a mailbox — say so.",
            "default": false
          },
          "reviewSpan": {
            "title": "Reviews: how far back (add-on, costs more)",
            "enum": [
              "",
              "3m",
              "6m",
              "12m",
              "3y"
            ],
            "type": "string",
            "description": "Read what customers say. Pick how far back to look and every business gets its reviews from that span — stars, date, the text, the owner's reply — plus, free, the count in the span, the average stars, reviews per month and the newest date. Leave on \"none\" for the list only. Good: \"last 12 months\" to judge a business today; \"last 3 years\" for topic or theme research. Each review delivered is charged. Assistants: never ask about reviews before the list; the closing line offers them after.",
            "default": ""
          },
          "reviewStars": {
            "title": "Reviews: which stars",
            "enum": [
              "all",
              "low",
              "high",
              "lowHigh"
            ],
            "type": "string",
            "description": "Only with a span above. \"1–2 stars\" reads the complaints — what an agency pitches against. \"4–5 stars\" reads the praise — what a business is known for. \"1–2 and 4–5\" skips the lukewarm 3s. \"All\" takes everything, best for theme and topic research. Assistants: \"complaints\", \"bad reviews\", \"1 and 2 star\" → low; \"praise\", \"5-star\" → high; \"skip the 3s\" → lowHigh; otherwise all. How it bills: every review delivered from the span is charged, and the band flags the ones you asked about (inBand) and drives the counts — Google cannot hand over only the complaints of a busy business without reading the span. A business with 15 or fewer complaints all-time is the exception: its complaints are read exactly and alone.",
            "default": "all"
          },
          "reviewsForTop": {
            "title": "Reviews: only for the top N businesses by review count",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "0 (default): reviews for every business in the list. A number: only the N businesses with the most reviews get theirs — the cheap way to read the market leaders in a big list. Good: 20 on a 300-business state list. Assistants: when the person names a small number (\"the top 2 dentists\"), cap the list too — maxPerLocation 10 is enough to rank them by review count; every listed business is charged, so a 50-row list to read 2 is money the person did not ask to spend.",
            "default": 0
          },
          "maxReviewsPerBusiness": {
            "title": "Reviews: at most, per business",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most reviews to read for any one business, so a busy restaurant with 2,000 reviews does not run away with the bill. 200 is plenty for a read; 1000 for research. When the cap stops the read the row says so.",
            "default": 200
          },
          "businessLinks": {
            "title": "Businesses from a previous run (skips the search)",
            "type": "array",
            "description": "Paste the map links (the mapsUrl column) or place IDs from a list you already pulled, and only their reviews are read — no new search, no list price. Your assistant does this for you when you say \"now the 1–2 star reviews for those\". With this filled, category and location are not needed.",
            "items": {
              "type": "string"
            }
          },
          "llmApiKey": {
            "title": "Your own OpenAI key for the translation step (optional)",
            "type": "string",
            "description": "The local-language translation uses a small language-model call. One is built in; bring your own key if you prefer the call on your account. Never logged, never written to the results."
          },
          "estimateOnly": {
            "title": "Only estimate — show the plan and the price, spend nothing",
            "type": "boolean",
            "description": "On: returns the phrases that would be searched, per location, and the expected cost, without searching. Good for a quick look before a big run. Off (default): runs. Assistants: TRUE whenever the person asks about cost, price, \"how much\", \"what would it take\", or before anything bigger than one city — show the price, wait for yes, then run with it off. A cost question that runs the list charges the person for an answer they did not order (25 Sep: \"how much would 10 plumbers in Warsaw cost\" ran and billed).",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}