Datasets API endpoint
Searches the BBB (Better Business Bureau) businesses index (dataset id enum value `bbb-businesses`) — business profiles crawled from bbb.org's own search/category-browse pages: computed A+-F letter-grade rating, paid-accreditation status, category, contact info, business details, operating hours, and products/services. Complaints, full reviews, and the full "reasons for rating"/service-area detail are NOT embedded here; each record instead carries complaints_url/reviews_url/more_info_url pointing at the live bbb-business-complaints/bbb-business-reviews/bbb-business-more-info endpoints for on-demand lookup. rating enum: `A+`, `A`, `A-`, `B+`, `B`, `B-`, `C+`, `C`, `C-`, `D+`, `D`, `D-`, `F`. Each record also stores BBB's complaint and review counts (total_complaints and related fields) and the BBB alerts on the profile (has_alerts, alert_titles, alerts[] with full text), so businesses with complaints or with a given alert can be listed without calling the live endpoints; these fields are filled as records are re-crawled and are absent on a record not refreshed since they were added. `country` is parsed from the profile URL; `address_country` is derived separately from the business address. Both enums are `us`, `ca`. sort enum: `relevance`, `rating_desc`, `rating_asc`, `accredited_first`, `name_asc`, `years_in_business_desc`, `complaints_desc`. A query returns at most 10,000 records; to read more, split it with the values and counts from the facets endpoint (for example one request per state, then per city) so each part stays under that limit. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100); the item and facets endpoints cost 1.
/datasets/bbb-businesses/searchDataset id enum:
bbb-businessesQuery parameters:
q: optional full-text match on the business name/category, max 256 characters.category: optional exact category filter, e.g. Plumber (case-sensitive). Use the values returned by facets?facet=category.country: optional country filter parsed from the profile URL (case-insensitive). Allowed values: us, ca.address_country: optional country filter derived from the business address, separate from country (case-insensitive). Allowed values: us, ca.state: optional exact 2-letter state or province code as in the profile URL, e.g. tx (case-insensitive). Use the values returned by facets?facet=state.city: optional exact city slug as in the profile URL, e.g. san-diego (case-insensitive). Use the values returned by facets?facet=city&state=<state>. The same slug exists in several states, so send state with it.rating: optional exact letter-grade rating filter. Allowed values: A+, A, A-, B+, B, B-, C+, C, C-, D+, D, D-, F.min_rating_rank: optional numeric floor against the numeric rating rank (A+=12 down to F=0), e.g. 10 for "A- and above".accredited: optional accreditation filter; true keeps only accredited businesses, false only the others.has_alerts: optional BBB-alert filter; true keeps businesses whose profile carries at least one BBB alert, false keeps refreshed records with none.alert_title: optional exact BBB alert title filter, e.g. Pattern of Complaint. Use the values returned by facets?facet=alert_title.min_complaints: optional floor against total_complaints (BBB's three-year complaint count), 0 or greater, e.g. 1 for businesses with at least one complaint.entity_type: optional exact entity-type filter, e.g. Limited Liability Company (LLC) (case-sensitive). Use the values returned by facets?facet=entity_type.run_id: optional exact crawl run id filter, e.g. bbb-20260906. Use the values returned by facets?facet=run_id.sort: optional sort order. Allowed values: relevance, rating_desc, rating_asc, accredited_first, name_asc, years_in_business_desc, complaints_desc. Defaults to relevance with q, otherwise accredited_first.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100. page * page_size must not exceed 10000.Response behavior:
business_id, bbb_local_id, name, url, country, state, city, address, phone, website, rating, rating_rank, rating_reasons, accredited, accredited_since, years_in_business, category, categories, business-detail fields (bbb_file_opened, business_started, business_incorporated, entity_type, alternate_names, business_management, additional_phone_numbers, additional_websites, social_media, licensing_note, hours, products_and_services), and the on-demand pointer fields complaints_url, reviews_url, more_info_url. address_country is included when a recognized address region code is present.country remains the country parsed from the profile URL. address_country is derived from a recognized state/territory/military or Canadian province code at the end of the business address; it is omitted when the address has no recognized code.total_complaints (the three-year figure the complaints page shows), complaints_closed_last_3_years, complaints_closed_last_12_months, total_reviews, average_review_rating — and the BBB alerts on the profile: has_alerts, alert_titles and alerts[] (each id, type_id, title, the complete text, links[], url; see bbb-business). BBB publishes no date field for an alert; dates are part of text.has_alerts=true nor has_alerts=false and is excluded by min_complaints. crawled_at shows when a record was last read; a 0 count and an empty alerts array are real values, not gaps.complaints_desc sorts by total_complaints, records without a count last.rating_reasons on this record is the shallow rating-card list bbb-business itself returns — often a single generic boilerplate bullet. Fetch more_info_url for the fuller per-factor reasons on a lower-rated business.10000; page * page_size must not exceed 10000. To read a slice with more records than that, split it with the facets endpoint: list every state with facet=state, every city of a state with facet=city&state=<state> (paging with limit and offset), and search each state + city pair. No city holds more than 10,000 records.items array (not an error) when nothing matches or the dataset has no data yet.page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. Use facets (1 credit) to size a query before paging through it.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| business_id | 20 | |
| bbb_local_id | 20 | |
| name | 20 | |
| url | 20 | bbb.org |
| country | 20 | |
| state | 20 | |
| city | 20 | |
| address | 20 | |
| phone | 20 | |
| website | 18 | planetplumbinganddrain.com and 17 other hosts |
| rating | 20 | |
| rating_rank | 20 | 12 |
| rating_reasons | 2 | median 1 entry |
| accredited | 20 | true in 20 of 20 |
| accredited_since | 20 | |
| years_in_business | 20 | 4 to 120, median 28 |
| years_in_business_num | 20 | 4 to 120, median 28 |
| category | 20 | |
| categories | 20 | median 8 entries |
| bbb_file_opened | 20 | |
| business_started | 20 | |
| business_incorporated | 18 | |
| entity_type | 18 | |
| alternate_names | 13 | median 1 entry |
| business_management | 19 | |
| additional_phone_numbers | 9 | median 2 entries |
| additional_websites | 11 | median 2 entries |
| social_media | 17 | median 3 entries |
| licensing_note | 17 | median 209 characters |
| hours | 11 | median 7 entries |
| products_and_services | 19 | median 19 entries |
| complaints_url | 20 | bbb.org |
| reviews_url | 20 | bbb.org |
| more_info_url | 20 | bbb.org |
| discovery_source | 20 | |
| run_id | 20 | |
| crawled_at | 20 | 2026-08-27 to 2026-09-14 |
| schema_version | 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text match on the business name/category, max 256 characters | ||
| category | string | No | Exact category filter, e.g. Plumber (case-sensitive). Use the values returned by facets?facet=category | ||
| country | string | No | Country filter, parsed from the profile URL (case-insensitive). Enum: us, ca Allowed values: us, ca. | ||
| address_country | string | No | Country filter derived from the business address, separate from the profile-URL country (case-insensitive). Enum: us, ca Allowed values: us, ca. | ||
| state | string | No | Exact 2-letter state or province code as in the profile URL, e.g. tx (case-insensitive). Use the values returned by facets?facet=state | ||
| city | string | No | Exact city slug as in the profile URL, e.g. san-diego (case-insensitive). Use the values returned by facets?facet=city with a state filter; the same slug exists in several states, so send state with it | ||
| rating | string | No | Exact letter-grade rating filter. Enum: A+, A, A-, B+, B, B-, C+, C, C-, D+, D, D-, F Allowed values: A+, A, A-, B+, B, B-, C+, C, C-, D+, D, D-, F. | ||
| min_rating_rank | integer | No | Numeric floor against the denormalized rating rank (A+=12 down to F=0), e.g. 10 for 'A- and above' | ||
| accredited | boolean | No | Accreditation filter; true keeps only accredited businesses, false only the others | ||
| has_alerts | boolean | No | BBB-alert filter; true keeps businesses whose profile carries at least one BBB alert, false keeps refreshed records with none | ||
| alert_title | string | No | Exact BBB alert title filter, e.g. Pattern of Complaint. Use the values returned by facets?facet=alert_title | ||
| min_complaints | integer | No | Floor against total_complaints (BBB's three-year complaint count), 0 or greater | ||
| entity_type | string | No | Exact entity-type filter, e.g. Limited Liability Company (LLC) (case-sensitive). Use the values returned by facets?facet=entity_type | ||
| run_id | string | No | Exact crawl run id filter, e.g. bbb-20260906. Use the values returned by facets?facet=run_id | ||
| sort | string | No | Sort enum: relevance, rating_desc, rating_asc, accredited_first, name_asc, years_in_business_desc, complaints_desc Allowed values: relevance, rating_desc, rating_asc, accredited_first, name_asc, years_in_business_desc, complaints_desc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/bbb-businesses/search?q=coffee&country=us&address_country=us&rating=A%2B&accredited=true&has_alerts=true&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "bbb-businesses",
"items": [
{
"business_id": "0825-1000223803",
"bbb_local_id": "0825",
"name": "Calixto Plumbing",
"url": "https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803",
"country": "us",
"address_country": "us",
"state": "tx",
"city": "austin",
"phone": "(512) 945-3143",
"rating": "A+",
"rating_rank": 12,
"accredited": true,
"category": "Plumber",
"categories": [
"Plumber",
"Plumbing Renovation",
"Commercial Plumber"
],
"complaints_url": "https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803/complaints",
"reviews_url": "https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803/customer-reviews"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "accredited_first"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.bbbBusinessesSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.BBBBusinessesSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | BBBBusinessRecord record, 57 fields: accredited, accredited_since, additional_phone_numbers, additional_websites, address, address_country, alert_titles, alerts, alternate_names, average_review_rating, bbb_file_opened, bbb_local_id and 35 more. Described under BBB Business Dataset Lookup API. | |||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.sort | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/bbb-businesses/search?q=coffee&country=us&address_country=us&rating=A%2B&accredited=true&has_alerts=true&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"