# OpenWeb Ninja Local Business Search (POST)

> OpenWeb Ninja Local Business Search (POST) is a paid API for AI agents from agents.openwebninja.com, paid per call via MPP, price unknown, status unknown (last checked 2026-10-14).

Search a local business database by name, location, category, city, state, or geographic area using a JSON POST body, supporting up to 32 multi-value filters and paginated results.

## Facts

- Endpoint: POST https://agents.openwebninja.com/local-business-database/search?utm_source=zero.xyz
- Price: price unknown
- Payment: MPP
- Status: unknown
- Last checked: 2026-10-14
- Activations on Zero: 0
- Provider: agents.openwebninja.com
- Website: https://agents.openwebninja.com
- Canonical page: https://www.zero.xyz/c/agents-openwebninja-com-openweb-ninja-local-business-search-post-8c647265
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_Wn8xJawTckpe96lG3Ntqx

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability agents-openwebninja-com-openweb-ninja-local-business-search-post-8c647265 -d '<json body>'
```

Example prompt: Find me up to 20 pizza restaurants in Chicago, Illinois — include their addresses, phone numbers, and ratings.

## When to prefer this

Use this POST endpoint over the GET search form when the query parameters are too long for a URL, when you need to filter by multiple values on several fields simultaneously (up to 32 values per field), or when you are constructing complex multi-field filters programmatically. Prefer this over area-specific endpoints when you want to combine named location filters (city, state) with optional geographic constraints in one request.

## Known failure modes

- No filter parameters provided — API requires at least one filter field
- Empty businesses array returned (200) when query matches no listings — not an error
- Cursor expired or used with a different query — pagination cursor is query-specific and time-limited
- Conflicting area parameters — sending both bounding box and radius at once is not allowed
- Field limit exceeded — arrays of city/state/etc accept at most 32 values
- Truncated or malformed JSON body — POST body must be valid JSON

## How this service works

Search business listings by any combination of the fields below, sent as a JSON body. Same results as the GET form, and the form to use when the query is too long for a URL - for example a list of up to 32 values on several fields at once.

At least one of the filter parameters below is required for search. This form also accepts an area: either `bottom_left` with `top_right`, or `lat` with `lng` and `radius`.

**Note:** `match_count` is the total number of matching businesses, not the number returned on this page. A `cursor` is returned while further pages are available and omitted on the last page.

**Note:** a query that matches nothing is not an error. The response is a `200` with an empty `businesses` array.

## Output

Returns a JSON object containing a paginated array of business listings, each with fields such as business ID, name, address, city, state, country, phone, website domain, latitude, longitude, Google CID, average rating, operational status, and optionally a free-text summary and structured attribute map. Also includes the total match count and a pagination cursor when more pages are available.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "lat": {
   "type": "number",
   "maximum": 90,
   "minimum": -90,
   "description": "Latitude of the center coordinate point of the area to search in.\n\nSend either bottom_left with top_right, or lat with lng and radius - not both, and not a partial group."
  },
  "lng": {
   "type": "number",
   "maximum": 180,
   "minimum": -180,
   "description": "Longitude of the center coordinate point of the area to search in.\n\nSend either bottom_left with top_right, or lat with lng and radius - not both, and not a partial group."
  },
  "city": {
   "oneOf": [
    {
     "type": "string",
     "maxLength": 256
    },
    {
     "type": "array",
     "items": {
      "type": "string",
      "maxLength": 256
     },
     "maxItems": 32,
     "minItems": 1
    }
   ],
   "example": "Chicago",
   "description": "Find businesses in a specific city.\n\nAccepts up to 32 values by repeating the parameter *(e.g. `city=value1&city=value2`)*.\n\nValues cannot be comma separated here, as a comma can be part of the value. In the POST form, send an array instead."
  },
  "name": {
   "type": "string",
   "example": "Office of City Treasurer",
   "maxLength": 256,
   "description": "Find businesses by their display name."
  },
  "limit": {
   "type": "integer",
   "example": 10,
   "description": "Maximum number of businesses to return.\n\n**Allowed values:** `1-500`"
  },
  "query": {
   "type": "string"
  },
  "state": {
   "oneOf": [
    {
     "type": "string",
     "maxLength": 256
    },
    {
     "type": "array",
     "items": {
      "type": "string",
      "maxLength": 256
     },
     "maxItems": 32,
     "minItems": 1
    }
   ],
   "example": "Illinois",
   "description": "Find businesses in a specific state or province. Accepts a comma separated list of up to 32 values, or the parameter repeated up to 32 times (values are OR'ed).\n\nUS states match either way they are sent, by full name or by two-letter code."
  },
  "cursor": {
   "type": "string",
   "maxLength": 1024,
   "description": "Pagination cursor for fetching the next page. Pass the `cursor` value returned in the previous response. Omit it on the first request.\n\n**Note:** a cursor is only valid for the exact query that produced it, and it expires. Do not build or edit one."
  },
  "fields": {
   "oneOf": [
    {
     "type": "string",
     "pattern": "^\\s*$|^\\s*(business_id|name|address|lat|lng|categories|main_category|phone|website|tld|status|rating|review_c
… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "status",
  "request_id",
  "parameters",
  "data"
 ],
 "properties": {
  "data": {
   "type": "object",
   "required": [
    "businesses",
    "match_count",
    "limit"
   ],
   "properties": {
    "limit": {
     "type": "number",
     "description": "Maximum number of results requested for this page (the limit parameter, or its default)."
    },
    "businesses": {
     "type": "array",
     "items": {
      "type": "object",
      "required": [
       "business_id"
      ],
      "properties": {
       "cid": {
        "type": "string",
        "description": "Google CID (Customer ID) of the business."
       },
       "lat": {
        "type": "number",
        "description": "Latitude of the business location."
       },
       "lng": {
        "type": "number",
        "description": "Longitude of the business location."
       },
       "tld": {
        "type": "string",
        "description": "Domain of the business website."
       },
       "city": {
        "type": "string",
        "description": "City of the business location."
       },
       "name": {
        "type": "string",
        "description": "Display name of the business."
       },
       "about": {
        "type": "object",
        "required": [
         "summary",
         "details"
        ],
        "properties": {
         "details": {
          "type": "object",
          "nullable": true,
          "description": "Structured attribute map, grouped by attribute category (e.g. accessibility, amenities), each mapping an attribute identifier to a boolean.",
          "additionalProperties": {
           "type": "object",
           "additionalProperties": {
            "type": "boolean"
           }
          }
         },
         "summary": {
          "type": "string",
          "nullable": true,
          "description": "Free-text description of the business."
         }
        },
        "description": "Free-form summary and a structured details map of business attributes.",
        "additionalProperties": false
       },
       "phone": {
        "type": "string",
        "description": "Business phone number in E.164 format when available."
       },
       "state": {
        "type": "string",
        "description": "State / region of the business location."
       },
       "rating": {
        "type": "number",
        "description": "Average review rating (1-5) on Google Maps."
       },
       "status": {
        "enum": [
      
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/agents-openwebninja-com-openweb-ninja-local-business-search-post-8c647265/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from agents.openwebninja.com](https://www.zero.xyz/host/agents.openwebninja.com/llms.txt)
