# Yelp API for agents

> API for Agents · https://apiforagents.dev/platforms/yelp · HTML twin: https://apiforagents.dev/platforms/yelp

Businesses, search and reviews from Yelp.

Endpoint: `POST https://apiforagents.dev/v1/yelp`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| reviews | $0.000225 |
| business | $0.00045 |

## Operations

### businesses

Full profiles for up to ten businesses by URL or slug. Address, phone, website, rating and star breakdown, review insights by topic, popular dishes, attributes, hours, health inspections.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | yelp.com/biz/ URLs or their slugs. |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| businessSlug | string |
| businessName | string |
| businessUrl | string |
| address | any |
| city | string |
| state | string |
| neighborhoods | list of string |
| latitude | number |
| longitude | number |
| phone | string |
| website | string |
| menuUrl | string |
| rating | number |
| totalReviews | integer |
| starBreakdown | any |
| reviewInsights | any |
| reviewHighlights | any |
| popularDishes | any |
| attributes | any |
| specialties | string |
| summary | string |
| yearEstablished | integer |
| history | string |
| photos | list of string |
| healthInspections | any |
| hoursToday | list of string |
| qaCount | integer |
| qaContent | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/yelp \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"businesses","subjects":["katzs-delicatessen-new-york"]}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "businessName": "Brewlab Coffee",
    "address": "210 Congress Ave",
    "city": "Austin",
    "state": "TX",
    "phone": "(512) 555-0142",
    "rating": 4.6,
    "totalReviews": 812,
    "yearEstablished": 2018,
    "hoursToday": "7:00 AM - 6:00 PM",
    "businessSlug": "brewlab-coffee",
    "businessUrl": "https://www.yelp.com/brewlab-coffee-1000",
    "menuUrl": "https://www.yelp.com/brewlab-coffee-1000",
    "photos": [
      "https://img.yelp.com/brewlab-coffee.jpg"
    ],
    "details": {}
  },
  {
    "businessName": "Casa Lumen Tacos",
    "address": "88 Harbor Dr",
    "city": "San Diego",
    "state": "CA",
    "phone": "(619) 555-0190",
    "rating": 4.4,
    "totalReviews": 1290,
    "yearEstablished": 2011,
    "hoursToday": "11:00 AM - 10:00 PM",
    "businessSlug": "casa-lumen-tacos",
    "businessUrl": "https://www.yelp.com/casa-lumen-tacos-1001",
    "menuUrl": "https://www.yelp.com/casa-lumen-tacos-1001",
    "photos": [
      "https://img.yelp.com/casa-lumen-tacos.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=yelp&op=businesses (sign in first).

### search

Businesses for a place and keyword, with Yelp's own sort, price levels and feature filters. Every hit a full profile.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) |  |
| location | yes | string (≤120 chars) |  |
| sort | no | enum |  Values: relevance, rating_high, most_reviewed. |
| priceLevels | no | list of enum | Yelp's dollar-sign tiers, "1" ($) to "4" ($$$$). Any listed tier matches; empty = every price level. Values: 1, 2, 3, 4. |
| features | no | list of string (each ≤40 chars) | Yelp's own feature slugs, e.g. "outdoor_seating", "delivery". |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| businessSlug | string |
| businessName | string |
| businessUrl | string |
| address | any |
| city | string |
| state | string |
| neighborhoods | list of string |
| latitude | number |
| longitude | number |
| phone | string |
| website | string |
| menuUrl | string |
| rating | number |
| totalReviews | integer |
| starBreakdown | any |
| reviewInsights | any |
| reviewHighlights | any |
| popularDishes | any |
| attributes | any |
| specialties | string |
| summary | string |
| yearEstablished | integer |
| history | string |
| photos | list of string |
| healthInspections | any |
| hoursToday | list of string |
| qaCount | integer |
| qaContent | any |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/yelp \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"search","query":"ramen","location":"San Francisco, CA","sort":"rating_high","priceLevels":["1","2"],"limit":20}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "businessName": "Taqueria Sol",
    "address": "402 Market St",
    "city": "San Diego",
    "state": "CA",
    "phone": "(619) 555-0133",
    "rating": 4.7,
    "totalReviews": 2210,
    "yearEstablished": 2009,
    "hoursToday": "10:00 AM - 11:00 PM",
    "businessSlug": "taqueria-sol",
    "businessUrl": "https://www.yelp.com/taqueria-sol-1000",
    "menuUrl": "https://www.yelp.com/taqueria-sol-1000",
    "photos": [
      "https://img.yelp.com/taqueria-sol.jpg"
    ],
    "details": {}
  },
  {
    "businessName": "Casa Lumen Tacos",
    "address": "88 Harbor Dr",
    "city": "San Diego",
    "state": "CA",
    "phone": "(619) 555-0190",
    "rating": 4.4,
    "totalReviews": 1290,
    "yearEstablished": 2011,
    "hoursToday": "11:00 AM - 10:00 PM",
    "businessSlug": "casa-lumen-tacos",
    "businessUrl": "https://www.yelp.com/casa-lumen-tacos-1001",
    "menuUrl": "https://www.yelp.com/casa-lumen-tacos-1001",
    "photos": [
      "https://img.yelp.com/casa-lumen-tacos.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=yelp&op=search (sign in first).

### reviews

Reviews for up to ten businesses. Text, rating, date, reactions, reviewer profile, owner reply.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | yelp.com/biz/ URLs or their slugs. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| reviewId | string |
| rating | number |
| reviewText | string |
| reviewDate | string |
| reviewUrl | string |
| language | string |
| translatedText | string |
| publicReply | string |
| photos | list of string |
| photoCaption | any |
| videos | list of string |
| totalReactions | integer |
| reactions | any |
| firstReviewer | boolean |
| reviewer | any |
| reviewerName | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/yelp \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"reviews","subjects":["katzs-delicatessen-new-york"],"limit":25}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "reviewerName": "Jess T.",
    "rating": 5,
    "reviewText": "Best cortado in town and the staff remember your name.",
    "reviewDate": "2026-10-11",
    "totalReactions": 14,
    "firstReviewer": false,
    "publicReply": null,
    "reviewId": "3697697196",
    "reviewUrl": "https://www.yelp.com/jess-t-1000",
    "photos": [
      "https://img.yelp.com/jess-t.jpg"
    ],
    "details": {}
  },
  {
    "reviewerName": "Mike R.",
    "rating": 4,
    "reviewText": "Great coffee, seating fills up fast.",
    "reviewDate": "2026-10-04",
    "totalReactions": 6,
    "firstReviewer": false,
    "publicReply": null,
    "reviewId": "4115864571",
    "reviewUrl": "https://www.yelp.com/mike-r-1001",
    "photos": [
      "https://img.yelp.com/mike-r.jpg"
    ],
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=yelp&op=reviews (sign in first).

### history (free)

Stored rating/review-count series of businesses already held. Free.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| metric | no | enum |  Values: rating, total_reviews. |
| days | no | integer (1-730) |  |

Request shape:

```json
{
  "op": "history",
  "subjects": [
    "example"
  ]
}
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=yelp&op=history (sign in first).

## Notes for the agent

Measured Yelp data, one operation per call. Businesses are named by their yelp.com/biz/ URL or its slug. Every fetch adds rating and review count to the business's history. ops: businesses (full profiles for up to ten businesses. Address and coordinates, phone, website, menu, rating with star breakdown, review insights by topic with sentiment, review highlights, popular dishes, attributes, hours today, health inspections, Q&A), search (a query and location with sort, price levels and Yelp feature filters; every hit a full profile), reviews (reviews for up to ten businesses. Text, rating, date, reactions, reviewer profile, owner reply), history (stored rating/review-count series for businesses already held, free). Ops are independent. Issue several as PARALLEL tool calls. Fresh fetches are charged per record; your own answer is free while fresh.
