# Overture POI Search - Austin Places (`praise-most-high/local-poi-open`) Actor

Overture Maps Search that returns name, category, address, coordinates, phone and website. 79,119 places, Austin / Travis County. Search a bounding box or a radius. Export to JSON, CSV or Excel, run it on a schedule, or call it from the Apify API.

- **URL**: https://apify.com/praise-most-high/local-poi-open.md
- **Developed by:** [angel nguyen](https://apify.com/praise-most-high) (community)
- **Categories:** Business, Other, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 place returned by a bounded-area searches

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What this Actor does

Overture Maps open data for Austin and Travis County, Texas: get name, category, address, coordinates, phone and website for the local businesses you search for, inside a bounding box or a radius around a point. The index holds 79,119 places and every record carries its own provenance, so you can see which upstream source each field came from.

![Actor icon](https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/0ezaunoiVKF5LFUup-actor-WME7pdCGlZTbdjBA1-4WnFZgkT3g-icon-local-poi-open.png)

This is an open-data product, not a scraper. It queries a bundled extract of the Overture Maps places theme — release `2026-08-19.0` — which means no API key, no rate limit, no terms that change under you, and a licence that lets you actually use the output.

### Key features

- **Two query shapes.** `search` over a bounded area (a bounding box, or a centre point plus a radius), and `details` to fetch specific places by id.
- **79,119 places** in the index, covering longitude -98.158 to -97.388 and latitude 30.025 to 30.618 — Austin and Travis County, Texas.
- **Per-record provenance.** Every record carries a `sources` array naming the upstream dataset, its licence, its record id and its update time, plus Overture's own `confidence` score.
- **Distance-ranked radius search.** A centre-point search returns results nearest-first and attaches `distance_m` to each one.
- **Real filters.** Substring match on name, Overture category slug, and a floor on `confidence`.
- **Nothing is silently missing.** A `details` query returns an explicit `not_found` list for ids that matched nothing, and those ids are not billed.
- **No network at run time.** The extract ships inside the Actor image, so queries do not depend on an upstream API being up.

### How it works

1. You choose a query shape: `search` for a bounded area, or `details` for specific place ids.
2. For `search`, you give either all four bounding-box values, or a centre point plus `radiusMeters`. If both are given, the bounding box wins.
3. The bounded set is narrowed by any filters you set — `searchText` on the name, `category` on the Overture slug, `minConfidence` on the confidence score.
4. A bounding-box search is ordered by confidence then name; a radius search is ordered nearest-first and each record gets a `distance_m`.
5. `maxResults` and `offset` page through the matches.
6. Each match is emitted as one place record carrying its category tree, address, coordinates, contact fields, confidence and full source provenance.

There is no unbounded whole-county dump shape, on purpose. A search must be bounded, and a search that matches nothing costs nothing beyond the run start.

### Input

`queryShape` is required. A `search` needs a bounded area; a `details` query needs at least one place id.

#### Input fields

| Field | Type | Default | What it does |
|---|---|---|---|

#### Example input

A bounding box over central Austin, filtered to the `restaurant` category, capped at 20 results.

```json
{
  "queryShape": "search",
  "minLon": -97.76,
  "minLat": 30.26,
  "maxLon": -97.73,
  "maxLat": 30.28,
  "category": "restaurant",
  "maxResults": 20
}
```

### Output

One dataset item per place. The record below is real — it is the first result of exactly the query shown above, run against the same bundled extract this Actor ships.

#### Example output

```json
{
  "id": "cd3875f4-7ecc-4d10-b53e-6a3c8e766948",
  "name": "Hopdoddy Burger Bar",
  "category": {
    "primary": "burger_restaurant",
    "alternate": [
      "american_restaurant",
      "bar_and_grill_restaurant"
    ],
    "basic": "restaurant",
    "taxonomy": "burger_restaurant",
    "hierarchy": [
      "food_and_drink",
      "restaurant",
      "meat_restaurant",
      "burger_restaurant"
    ]
  },
  "address": {
    "freeform": "1011 E 5th St. Ste 180",
    "locality": "Austin",
    "postcode": "78702",
    "region": "TX",
    "country": "US"
  },
  "coordinates": {
    "lon": -97.73240549,
    "lat": 30.263873
  },
  "website": "https://www.hopdoddy.com/locations/plazasaltillo",
  "phone": "+15128287855",
  "brand": {
    "name": "Hopdoddy Burger Bar"
  },
  "confidence": 0.9999791900455952,
  "sources": [
    {
      "property": "",
      "dataset": "meta",
      "license": "CDLA-Permissive-2.0",
      "record_id": "102542538216786",
      "update_time": "2026-08-10T00:00:00.000Z",
      "confidence": 0.99698406457901,
      "between": null,
      "provider": "meta",
      "resource": "meta",
      "version": "2026-08-10"
    },
    {
      "property": "/properties/confidence",
      "dataset": "Overture",
      "license": "CDLA-Permissive-2.0",
      "record_id": null,
      "update_time": "2026-08-14T19:46:07Z",
      "confidence": null,
      "between": null,
      "provider": "overture",
      "resource": "confidence_calculation",
      "version": "2026-08-14"
    }
  ],
  "overture_version": 11
}
```

#### Output fields

Every field below is taken from that same real record. Values are truncated for width, never invented.

| Field | Type | Value from a real run |
|---|---|---|
| `id` | string | `cd3875f4-7ecc-4d10-b53e-6a3c8e766948` |
| `name` | string | `Hopdoddy Burger Bar` |
| `category` | object | `{"primary":"burger_restaurant","alternate":["american_restauran…` |
| `address` | object | `{"freeform":"1011 E 5th St. Ste 180","locality":"Austin","postc…` |
| `coordinates` | object | `{"lon":-97.73240549,"lat":30.263873}` |
| `website` | string | `https://www.hopdoddy.com/locations/plazasaltillo` |
| `phone` | string | `+15128287855` |
| `brand` | object | `{"name":"Hopdoddy Burger Bar"}` |
| `confidence` | number | `0.9999791900455952` |
| `sources` | array | `[{"property":"","dataset":"meta","license":"CDLA-Permissive-2.0…` |
| `overture_version` | number | `11` |

**Three field groups are deliberately absent, and it is better that you know now:**

| Field | Status | Why |
|---|---|---|
| Opening hours | **Unavailable** | The Overture places schema at release `2026-08-19.0` carries no opening-hours column. It is not synthesised and not sourced from anywhere else. |
| E-mail addresses | **Excluded** | Present upstream, deliberately not indexed. This is not a lead-generation e-mail extractor. |
| Social profiles | **Excluded** | Same reason. |

Optional fields appear only when the source has them: `website`, `phone`, `brand` and `operating_status` are absent from a record rather than present-and-empty. `websites` and `phones` (plural) appear only when a place has more than one.

### Pricing

Pay-per-event. You are charged per place record delivered, so a query that matches nothing is free beyond the run start.

| Event | Price | Charged when |
|---|---|---|
| Place returned by a bounded-area search | $0.004 | Charged once per place record delivered to the dataset by the bounded-area search shape. A search that matches nothing is free. |
| Place details resolved by id | $0.004 | Charged once per place record delivered to the dataset by the details-by-id shape. An id that resolves to nothing is reported in not\_found and is not charged. |

#### What a run actually costs

Worked from the prices in the table above:

- **A 20-result neighbourhood search.** 20 records x $0.004 = **$0.08**.
- **A 500-result sweep of a district.** 500 x $0.004 = **$2.00**.
- **A `details` lookup of 10 known ids.** 10 x $0.004 = **$0.04** — and any id that matches nothing appears in `not_found` and is not charged.
- **A search that matches nothing.** The run start only.

You are billed for records delivered, never for records scanned.

### FAQ

**What area does this cover?**

Austin and Travis County, Texas — longitude -98.158 to -97.388, latitude 30.025 to 30.618. 79,119 places. It does not cover anywhere else, and it will not pretend to.

**Where does the data come from, and can I use it commercially?**

Overture Maps Foundation open data, release 2026-08-19.0. The place records travel under CDLA-Permissive-2.0, Apache-2.0 and CC0-1.0. The attribution notice ships inside the Actor image and is written to the key-value store as `NOTICE` at the start of every run, so the licence text travels with the data.

**Why are there no opening hours?**

Because the Overture places schema at this release has no opening-hours column. Rather than synthesise them or quietly source them elsewhere, the Actor tells you the field is unavailable.

**Why no e-mail addresses?**

They exist upstream and are deliberately not indexed. This is a places dataset, not a lead-generation e-mail extractor.

**What is `confidence`, and should I filter on it?**

It is Overture's own per-record confidence score between 0 and 1. It is worth filtering on: confidence is measurably lower inside the upstream geocode-fallback cluster (mean 0.729) than elsewhere (mean 0.810).

**How accurate are the coordinates?**

They are point locations at address or building granularity, taken from the source unchanged — not verified rooftop coordinates. 23.17% of records share an exact coordinate with at least one other record.

**Can I get the whole county in one run?**

No. Every search must be bounded by a box or a radius. Page through a large area with `maxResults` and `offset`.

**Some places have no category. Why?**

4,378 of the 79,119 places carry no primary category upstream, so they match no category slug. They are still returned by an unfiltered bounded search.

### Limits and error handling

- `maxResults` caps at 1,000 records per run; page beyond that with `offset`.
- `radiusMeters` caps at 50,000 and applies only to centre-point searches.
- A search must be bounded — there is no unbounded whole-county shape.
- `category` is an exact match against the primary, alternate and basic category slugs, not a fuzzy search. `searchText` is a case-insensitive substring match on the name, not a ranked relevance search.
- The index is a pinned snapshot of Overture release 2026-08-19.0. It is not live: a business that opened yesterday is not in it.

### Integrations and API

Everything below works on any Apify account, including the free tier.

#### Run it from the Apify API

Start a run and wait for the dataset in one call. Replace `<YOUR_TOKEN>` with your own Apify API token.

```bash
curl -X POST "https://api.apify.com/v2/acts/praise-most-high~local-poi-open/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"queryShape":"search","minLon":-97.76,"minLat":30.26,"maxLon":-97.73,"maxLat":30.28,"category":"restaurant","maxResults":20}'
```

#### Use it from JavaScript or Python

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('praise-most-high/local-poi-open').call({"queryShape":"search","minLon":-97.76,"minLat":30.26,"maxLon":-97.73,"maxLat":30.28,"category":"restaurant","maxResults":20});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Schedules, webhooks and integrations

Run it on a [schedule](https://docs.apify.com/platform/schedules) — hourly, daily, or a cron expression — and have the output pushed where you already work. Apify ships first-party [integrations](https://docs.apify.com/platform/integrations) for Zapier, Make, n8n, Slack, Google Drive, GitHub and generic webhooks, and any run can fire a webhook on success or failure. The dataset is also readable directly as JSON, CSV, XLSX, XML or RSS from its own URL, so a spreadsheet or a BI tool can point straight at it.

### Where the data comes from

**[Overture Maps Foundation](https://overturemaps.org) open data**, `places` theme, release `2026-08-19.0`, clipped to Austin / Travis County and bundled inside the Actor image.

The Actor reads **nothing over the network at run time** — the extract travels with it. That is a measured design decision, not a preference: a single small bounded query against the public Overture bucket costs about as much as rebuilding the whole county extract, because Parquet row-group pruning still has to read the footer of every file in the partition before it can prune anything.

**Licensing.** The place records travel under CDLA-Permissive-2.0, Apache-2.0 and CC0-1.0. The full attribution notice ships in the image as `NOTICE-overture.md` and is written to the run's key-value store as `NOTICE` at the start of every run, so the licence text travels with the data rather than being left on a web page you have to remember. The ODbL OpenStreetMap polygon used to clip the extract is deliberately **not** included — only the place records and the numeric bounding box travel.

### Legal and responsible use

**Open data, not a scrape.** This Actor queries a bundled extract of Overture Maps open data. It does not scrape Google Maps or any other operator's product, and it is not affiliated with, endorsed by or sponsored by the Overture Maps Foundation or any of its members.

**No personal data.** Business and point-of-interest records: names, categories, addresses, coordinates and published business contact details. No individuals, no reviews, no e-mail addresses, no social profiles.

**Your obligations.** The licences above are permissive but they are not nothing — CDLA-Permissive-2.0 and Apache-2.0 both require attribution. The `NOTICE` written to every run's key-value store is there so you can carry it forward. Coordinates are source granularity, not surveyed positions; do not use them where a wrong point costs someone something.

### Support and feedback

Found a bug, a wrong field, or a source that changed shape? Open an issue on the [Issues tab](https://apify.com/praise-most-high/local-poi-open/issues) of this Actor and it goes straight to the maintainer. Feature requests are welcome on the same tab. If a run failed, include the run ID — the log is what makes it fixable.

# Actor input Schema

## `queryShape` (type: `string`):

Which of the two shapes to run. 'search' needs a bounded area (bounding box, or centre point plus radius). 'details' needs one or more place ids. There is no unbounded whole-county dump shape.

## `minLon` (type: `number`):

West edge of the search box. Give all four bounding-box values together, or leave them all blank and use the centre-point fields instead. The index covers longitude -98.158 to -97.388.

## `minLat` (type: `number`):

South edge of the search box. The index covers latitude 30.025 to 30.618.

## `maxLon` (type: `number`):

East edge of the search box.

## `maxLat` (type: `number`):

North edge of the search box.

## `nearLon` (type: `number`):

Longitude of the centre point, used with the radius below. Ignored when a complete bounding box is supplied. Results from a centre-point search are ordered nearest first and each carries a distance\_m field.

## `nearLat` (type: `number`):

Latitude of the centre point, used with the radius below.

## `radiusMeters` (type: `integer`):

Search radius around the centre point, in metres. Only used with the centre-point fields.

## `searchText` (type: `string`):

Optional case-insensitive substring match on the place name. This filters within the bounded area; it is not a ranked relevance search.

## `category` (type: `string`):

Optional Overture category slug, matched against the primary, alternate and basic category of each place. Real slugs in this index include restaurant, real\_estate\_agent, health\_and\_medical, professional\_services, home\_service, personal\_or\_beauty\_service, landmark\_and\_historical\_building. 4,378 of 79,119 places carry no primary category and will not match any slug.

## `minConfidence` (type: `number`):

Optional floor on Overture's own per-record confidence score, 0 to 1. Useful because confidence is measurably lower inside the upstream geocode-fallback cluster (mean 0.729) than elsewhere (mean 0.810). Leave blank for no floor.

## `maxResults` (type: `integer`):

Maximum number of place records to return. Each record delivered is one billable event; a search that matches nothing is free.

## `offset` (type: `integer`):

Skip this many matches before returning results, for paging through a bounded area.

## `placeIds` (type: `array`):

One or more Overture place ids (GERS UUIDs), as returned in the id field of any search result. Only used when the query shape is 'details'. Ids that match nothing are returned explicitly in the OUTPUT not\_found list and are not charged.

## Actor input object example

```json
{
  "queryShape": "search",
  "minLon": -97.76,
  "minLat": 30.26,
  "maxLon": -97.73,
  "maxLat": 30.28,
  "radiusMeters": 1000,
  "category": "restaurant",
  "maxResults": 20,
  "offset": 0,
  "placeIds": [
    "e04507b8-f066-447b-8dec-5211d2b449a5",
    "e5f09a20-7b27-4a88-91c6-9b1b3d6dfa67"
  ]
}
```

# Actor output Schema

## `places` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `runEnvelope` (type: `string`):

No description

## `notice` (type: `string`):

No description

## `datasetView` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queryShape": "search",
    "minLon": -97.76,
    "minLat": 30.26,
    "maxLon": -97.73,
    "maxLat": 30.28,
    "radiusMeters": 1000,
    "category": "restaurant",
    "maxResults": 20,
    "offset": 0,
    "placeIds": [
        "e04507b8-f066-447b-8dec-5211d2b449a5",
        "e5f09a20-7b27-4a88-91c6-9b1b3d6dfa67"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("praise-most-high/local-poi-open").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queryShape": "search",
    "minLon": -97.76,
    "minLat": 30.26,
    "maxLon": -97.73,
    "maxLat": 30.28,
    "radiusMeters": 1000,
    "category": "restaurant",
    "maxResults": 20,
    "offset": 0,
    "placeIds": [
        "e04507b8-f066-447b-8dec-5211d2b449a5",
        "e5f09a20-7b27-4a88-91c6-9b1b3d6dfa67",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("praise-most-high/local-poi-open").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queryShape": "search",
  "minLon": -97.76,
  "minLat": 30.26,
  "maxLon": -97.73,
  "maxLat": 30.28,
  "radiusMeters": 1000,
  "category": "restaurant",
  "maxResults": 20,
  "offset": 0,
  "placeIds": [
    "e04507b8-f066-447b-8dec-5211d2b449a5",
    "e5f09a20-7b27-4a88-91c6-9b1b3d6dfa67"
  ]
}' |
apify call praise-most-high/local-poi-open --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,praise-most-high/local-poi-open"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WME7pdCGlZTbdjBA1/builds/34e5uZ9tMgSQrT672/openapi.json
