Extract LocalBusiness data from a public website without guessing
Last updated:
Extract only the LocalBusiness facts a public page actually establishes, and keep a pointer and snippet beside every returned value. Structured Data to JSON returns a fixed name, category, city and openingHours object; a missing field stays null, and version 1 returns no phone, email, street address or profile field.
Facts and examples on this page were checked against the Actor source, saved fixtures, and Google's current LocalBusiness documentation on October 4, 2026.
What “without guessing” means
Google's LocalBusiness guidance recommends the most specific applicable subtype and documents business name, address and opening hours among the structured properties a publisher can declare (Google Search Central). That guidance tells publishers how to mark up their own pages; it does not make an extractor's unsupported inferences true.
This Actor therefore uses a smaller version-1 contract:
| Field | Meaning | Evidence sources |
|---|---|---|
name | Grounded business name | JSON-LD, microdata, page title, then heading |
category | Declared subtype or a restrained supported service phrase | Supported page text, JSON-LD type, then microdata |
city | Locality named by the page | JSON-LD addressLocality, microdata, then a bounded city/state text pattern |
openingHours | Declared or visibly printed hours | JSON-LD, microdata, then a bounded visible-hours pattern |
It does not geocode, infer an owner, enrich a lead, or convert a vague description into a plausible address.
Input and tested output
{
"urls": ["https://example.com/bright-paws"],
"schemaType": "localBusiness"
}The saved fixture declares the name, city and hours in microdata and says “Independent pet grooming in Austin, TX” in its description. Its tested result is:
{
"schemaType": "localBusiness",
"data": {
"name": "Bright Paws",
"category": "pet grooming",
"city": "Austin",
"openingHours": "Monday-Friday 9:00 am-5:00 pm"
},
"evidence": {
"name": {
"method": "microdata",
"pointer": "[itemprop=\"name\"]",
"snippet": "Bright Paws"
},
"category": {
"method": "page-text",
"pointer": "category-keyphrase",
"snippet": "pet grooming"
},
"city": {
"method": "microdata",
"pointer": "[itemprop=\"addressLocality\"]",
"snippet": "Austin"
},
"openingHours": {
"method": "microdata",
"pointer": "[itemprop=\"openingHours\"]",
"snippet": "Monday-Friday 9:00 am-5:00 pm"
}
},
"absentFields": []
}Every field gets evidence, including missing fields. The result also records the requested URL, the safety-checked final URL, content type, byte count and a SHA-256 hash of the fetched body.
What happens when the page is incomplete
The business name is the identity field. Without a grounded name, the page is refused instead of producing a paid empty item. With a name but no hours, the result stays usable and honest:
{
"data": { "name": "Bright Paws", "category": null, "city": "Austin", "openingHours": null },
"evidence": {
"openingHours": { "method": "absent", "pointer": null, "snippet": null }
},
"absentFields": ["category", "openingHours"]
}Do not replace those nulls with an agent's best guess. An absent record is the evidence that the fetched page did not establish the value under this contract.
Contact boundary
Version 1 has no telephone, email, street-address, contact-person or social-profile output field, even though Schema.org and Google's publisher guidance define some of those properties. Emails, phone-like numbers and obvious personal/profile URLs found inside any copied field or evidence snippet are replaced with [redacted contact]; the evidence gets "redactedContact": true. Business contacts are redacted too because this contract permits no contact data.
That makes this an evidence-backed page extractor, not a prospecting or identity-enrichment tool.
Access and billing boundary
- Public HTML only; no accounts, cookies, form submission, CAPTCHA solving or challenge bypass.
robots.txtis respected. Private and reserved IP destinations are refused before connection and after every redirect.- Password forms and common login/challenge markers produce a non-billable skipped result.
- JavaScript is not rendered, so client-only business facts remain absent.
- A page is charged $0.009 only after a schema-valid item with a grounded business name is written; Apify's documented platform start event also applies.
FAQ
Does it return a business phone number or email address?
No. Version 1 has no contact fields. Contact fragments inside otherwise supported text or evidence are replaced with [redacted contact] and marked as redacted.
Does it find a street address?
No. The LocalBusiness contract returns city, not a street address. The other fields are name, category and opening hours.
Will it guess the business category from any description?
No. Its page-text fallback recognizes a small, documented set of service phrases; otherwise category is taken from declared markup or returned as null.
Can an agent treat the output as verified truth about the business?
No. Evidence shows where the publisher page stated a value. It does not independently verify that the business claim is accurate or still current.