Datasets API endpoint
Searches the stored archive of public consumer scam reports from bbb.org/scamtracker (dataset id enum value `bbb-scamtracker-reports`), one record per report: narrative, scam type, reported dollar loss, targeted and scammer locations, the business name used, and the report date. Unlike the live bbb-scamtracker-search endpoint, results are not cut off at BBB's 10,000-result limit and any date range can be read page by page. Reports are unreviewed consumer allegations; names and contact details in them are as reported, not verified. The archive is still being filled, so `total` is the number of stored reports matching the filters, not BBB's own count. country enum: `USA`, `CAN`. sort enum: `relevance`, `reported_desc`, `reported_asc`, `loss_desc`. 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-scamtracker-reports/searchQuery parameters:
q: optional full-text match on the report narrative and the business name used, max 256 characters.scam_type: optional exact scam type filter, e.g. Online Purchase. Use the values returned by facets?facet=scam_type.state: optional 2-letter state or province code of the targeted person, e.g. TX or QC.country: optional country of the targeted person. Allowed values: USA, CAN.date_from: optional inclusive report-date floor, YYYY-MM-DD.date_to: optional inclusive report-date ceiling, YYYY-MM-DD. Must not be before date_from.min_loss: optional floor against the reported dollar loss, 0 or greater.max_loss: optional ceiling against the reported dollar loss, 0 or greater. Must not be below min_loss.sort: optional sort order. Allowed values: relevance, reported_desc, reported_asc, loss_desc. Defaults to relevance with q, otherwise reported_desc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
report_id, description (the narrative), scam_type, dollars_lost (as BBB shows it, e.g. $149 or Unknown), loss_amount (the same loss as a number, left out when BBB shows no amount), targeted_location, state and country (derived from the targeted location when it names a US state or Canadian province), scammer_location, scammer_email, scammer_phone, scammer_url, business_name (the business name the report says was used), date_reported (as BBB shows it), reported_at (the same date as an ISO timestamp), source_url, discovery_source, crawled_at and schema_version.total is the number of stored reports matching the filters, not BBB's own count. The archive is filled continuously by a date census of BBB's search and by Common Crawl, and is not complete; a report missing here can still be read live with bbb-scamtracker-detail.min_loss and max_loss exclude reports with an unknown loss. An unknown loss is never stored as 0.state or country and is not matched by those filters.10000; page * page_size must not exceed 10000. To read more than that, split the range with date_from/date_to (a month, then a week or a day if needed).items array (not an error) when nothing matches.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.Example response (the report is the one in the bbb-scamtracker-detail docs; discovery_source and crawled_at are illustrative):
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "bbb-scamtracker-reports",
"items": [
{
"report_id": "1397968",
"description": "AltRX has taken $149 and is stringing me along about my 2nd delivery. They deducted money from my account with no product being delivered",
"dollars_lost": "$149",
"loss_amount": 149,
"targeted_location": "Chesapeake, VA, USA - 23322",
"country": "USA",
"state": "VA",
"scammer_location": "GA",
"scammer_email": "Unknown Email",
"scammer_phone": "Unknown Phone Number",
"scammer_url": "Unknown URL",
"scam_type": "Online Purchase",
"business_name": "AltRX",
"date_reported": "August 19, 2026",
"reported_at": "2026-08-19T00:00:00Z",
"source_url": "https://www.bbb.org/scamtracker/lookupscam/1397968",
"discovery_source": "search",
"crawled_at": "2026-10-09T04:12:31Z",
"schema_version": 1
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "reported_desc"
}
}
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| report_id | 20 | |
| description | 20 | median 362 characters |
| targeted_location | 20 | |
| country | 20 | |
| state | 20 | |
| scammer_location | 20 | |
| scammer_email | 20 | |
| scammer_phone | 20 | |
| scammer_url | 20 | |
| scam_type | 20 | |
| business_name | 20 | |
| date_reported | 20 | |
| reported_at | 20 | 2026-10-12 |
| source_url | 20 | bbb.org |
| discovery_source | 20 | |
| crawled_at | 20 | 2026-10-13 |
| schema_version | 20 | |
| dollars_lost | 12 | |
| loss_amount | 12 | 22 to 2,500, median 70 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text match on the report narrative and the business name used, max 256 characters | ||
| scam_type | string | No | Exact scam type filter, e.g. Online Purchase. Use the values returned by facets?facet=scam_type | ||
| state | string | No | 2-letter state or province code of the targeted person, e.g. TX or QC | ||
| country | string | No | Country of the targeted person. Enum: USA, CAN Allowed values: USA, CAN. | ||
| date_from | string | No | Inclusive report-date floor, YYYY-MM-DD | 2023-01-01 | |
| date_to | string | No | Inclusive report-date ceiling, YYYY-MM-DD | 2023-01-31 | |
| min_loss | number | No | Floor against the reported dollar loss, 0 or greater; reports with an unknown loss are excluded | ||
| max_loss | number | No | Ceiling against the reported dollar loss, 0 or greater; reports with an unknown loss are excluded | ||
| sort | string | No | Sort enum: relevance, reported_desc, reported_asc, loss_desc Allowed values: relevance, reported_desc, reported_asc, loss_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-scamtracker-reports/search?q=coffee&country=us&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "bbb-scamtracker-reports",
"items": [
{
"report_id": "1397968",
"description": "AltRX has taken $149 and is stringing me along about my 2nd delivery. They deducted money from my account with no product being delivered",
"dollars_lost": "$149",
"loss_amount": 149,
"targeted_location": "Chesapeake, VA, USA - 23322",
"country": "USA",
"state": "VA",
"scammer_location": "GA",
"scammer_email": "Unknown Email",
"scammer_phone": "Unknown Phone Number",
"scammer_url": "Unknown URL",
"scam_type": "Online Purchase",
"business_name": "AltRX",
"date_reported": "August 19, 2026",
"reported_at": "2026-08-19T00:00:00Z",
"source_url": "https://www.bbb.org/scamtracker/lookupscam/1397968",
"discovery_source": "search",
"crawled_at": "2026-10-09T04:12:31Z",
"schema_version": 1
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "reported_desc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.scamTrackerReportsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.ScamTrackerReportsSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | ScamTrackerReport record, 19 fields: business_name, country, crawled_at, date_reported, description, discovery_source, dollars_lost, loss_amount, report_id, reported_at, scam_type, scammer_email and 7 more. Described under BBB Scam Report Detail 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-scamtracker-reports/search?q=coffee&country=us&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"