Datasets API endpoint
Returns one business by id from dataset id enum value `bbb-businesses`. Returns 404 when the business is not in the index.
/datasets/bbb-businesses/items/{id}Dataset id enum:
bbb-businessesPath parameters:
id: business id (the <bbbLocalId>-<businessId> slug from the profile URL), e.g. 0825-1000223803.Response behavior:
404 when the business is not in the index.country parsed from the profile URL, optional address_country derived from the business address (us or ca), complaint and review counts, and the profile's BBB alerts (has_alerts, alert_titles, alerts[] with the complete text).| Field | Filled in, of 7 checked |
|---|---|
| day | 7 |
| hours | 7 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id (path) | string | Yes | Business id (the <bbbLocalId>-<businessId> slug from the profile URL), e.g. 0825-1000223803 | 0825-1000223803 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/bbb-businesses/items/0825-1000223803" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"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",
"address": "PO Box 40698, Austin, TX 78704-0012",
"phone": "(512) 945-3143",
"rating": "A+",
"rating_rank": 12,
"rating_reasons": [
"Customer Reviews are not used in the calculation of the BBB Letter Grade Rating."
],
"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"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.bbbBusinessResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | es.BBBBusinessRecord | No | ||||
| data.accredited | boolean | No | ||||
| data.accredited_since | string | No | ||||
| data.additional_phone_numbers | array | No | ||||
| data.additional_websites | array | No | ||||
| data.address | string | No | ||||
| data.address_country | string | No | us, ca | AddressCountry is derived from the recognized US state/territory/military or Canadian province code at the end of Address. Empty when unrecognized. | ||
| data.alert_titles | array | No | ||||
| data.alerts | array | No | ||||
| data.alerts[].id | string | No | ||||
| data.alerts[].links | array | No | ||||
| data.alerts[].links[].text | string | No | ||||
| data.alerts[].links[].url | string | No | ||||
| data.alerts[].text | string | No | ||||
| data.alerts[].title | string | No | ||||
| data.alerts[].type_id | integer | No | ||||
| data.alerts[].url | string | No | ||||
| data.alternate_names | array | No | ||||
| data.average_review_rating | number | No | ||||
| data.bbb_file_opened | string | No | ||||
| data.bbb_local_id | string | No | ||||
| data.business_id | string | No | ||||
| data.business_incorporated | string | No | ||||
| data.business_management | string | No | ||||
| data.business_started | string | No | ||||
| data.categories | array | No | ||||
| data.category | string | No | Plumber | |||
| data.city | string | No | ||||
| data.complaints_closed_last_12_months | integer | No | ||||
| data.complaints_closed_last_3_years | integer | No | ||||
| data.complaints_url | string | No | On-demand pointers -- not crawled/embedded, see package doc above. | |||
| data.country | string | No | State/City are parsed from the profile URL's /us|ca/<state>/<city>/... path segments -- BusinessResponse.Address is a free-text joined string, not structured, so it isn't a reliable filter/facet field on its own. | |||
| data.crawled_at | string | No | ||||
| data.discovery_source | string | No | Crawl bookkeeping. DiscoverySource records how the CURRENT document content was obtained (last-crawl mechanism), not first-discovery provenance -- keyword-sweep, category-grid, and Common Crawl discovery are deduplicated against the same business, so the same business is never double-enqueued no matter how many search/category cells or CC records surface it. A richer per-discovery-event location/category isn't tracked, only the coarse source. | |||
| data.entity_type | string | No | Limited Liability Company (LLC) | |||
| data.has_alerts | boolean | No | HasAlerts, AlertTitles and Alerts describe the notices BBB attaches to the profile (pattern of complaints, investigation results, licensing findings). A refreshed record with no alerts carries has_alerts=false and empty lists; a record not re-crawled since these were added has none of the keys. | |||
| data.hours | array | No | ||||
| data.hours[].day | string | No | ||||
| data.hours[].hours | string | No | ||||
| data.licensing_note | string | No | ||||
| data.more_info_url | string | No | ||||
| data.name | string | No | ||||
| data.phone | string | No | ||||
| data.products_and_services | array | No | ||||
| data.rating | string | No | A+ | |||
| data.rating_rank | integer | No | ||||
| data.rating_reasons | array | No | ||||
| data.reviews_url | string | No | ||||
| data.run_id | string | No | ||||
| data.schema_version | integer | No | ||||
| data.social_media | array | No | ||||
| data.state | string | No | ||||
| data.total_complaints | integer | No | 943 | Complaint and review counts from the profile page, the same values bbb-business returns. A record not re-crawled since these were added has none of the keys until its next refresh, and a count BBB did not publish is likewise absent, so 0 is a real zero. | ||
| data.total_reviews | integer | No | ||||
| data.url | string | No | ||||
| data.website | string | No | ||||
| data.years_in_business | string | No | ||||
| data.years_in_business_num | integer | No | YearsInBusinessNum is a best-effort leading-digit parse of YearsInBusiness (a free-text upstream string, e.g. "3"), -1 when unparseable. Denormalized purely for numeric sorting -- YearsInBusiness itself stays a keyword, so a lexicographic string sort would wrongly rank "9" ahead of "12". | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/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/items/0825-1000223803" \
-H "x-api-key: $CRAWLORA_API_KEY"