Business directory API
A business directory API returns the companies a directory lists for a category in a place: name, category, the printed address split into street, CAP, comune and province, phone numbers and the listing URL. It is the channel that reaches the businesses search engines do not rank — the ones that exist commercially but not editorially.
$0.001 per delivered business · $2 free every month · Failed runs never billed
$ curl $QD/business_directory/run \
-H "Authorization: Bearer $QD_API_KEY" \
-d '{}'
{ "status": "done", "count": 10,
"results": [
{
"name": "…",
"category": "…",
"address": "…",
"street": "…" } ],
"cost": 0.01 }
# 10 businesss × $0.001 · nothing delivered, nothing charged
What a business directory API does
Search engines rank what is optimised, and a two-person operation with no website optimises nothing. Asked for car rental in Milan, a web search returns the national chains and the price aggregators; the same category in a directory returns the independents, because a directory lists businesses rather than ranking pages. If your dataset is meant to describe a market rather than its advertisers, this is the source that closes the gap.
Every row is a business, not a page: one listing fetch yields around 25 companies already split into fields, so a row costs a tenth of a cent and needs no parsing on your side. The addresses arrive decomposed — street, CAP, comune, provincia — which is what makes a directory dataset joinable against your own records instead of a column of strings to normalise later.
What one business looks like
Every delivered business carries these fields. Nullable means the source did not publish it — the field stays empty instead of being guessed.
| Field | Type | What it holds |
|---|---|---|
rank | integer | 1-based position in the merged result set. |
name | string | Business name as listed. |
category | string · nullable | The directory's own category for the business. |
address | string · nullable | Full printed address. |
street | string · nullable | Street and number. |
postal_code | string · nullable | CAP. |
city | string · nullable | Comune. |
province | string · nullable | Two-letter province code. |
phone | string · nullable | First published phone number. |
phones | string[] | Every phone number on the listing. |
description | string · nullable | Blurb the business published on the listing, when it has one. |
profile_url | string · nullable | The directory page for this business. |
source | string | Which directory delivered the row. |
source_id | string · nullable | The directory's own id — a stable dedup key. |
Inputs
The whole request. Anything you leave out falls back to the default shown in the catalog.
| Input | Type | Required | What it does |
|---|---|---|---|
query | string | yes | What the businesses do, as the directory categorises it — e.g. "autonoleggio", "dentista", "idraulico". |
location | string | yes | Comune or quartiere — e.g. "Milano", "Milano Quartiere Affori", "Monza". |
sources | array | no | Which directories to read (default paginegialle). Pagine Bianche is best-effort: it refuses repeated requests more often. |
only_with_phone | boolean | no | Drop and do not bill businesses with no published phone number. |
country | string | no | ISO 3166-1 alpha-2 code — proxy exit geo and Google locale (gl). Omit for the default pool. |
max_results | integer | no | How many businesses to deliver at most (1–100). You pay only for delivered businesses. |
Pricing
Business directory API pricing
$0.001 per delivered business. A run that delivers nothing costs nothing: blocked pages, challenges and retries are on us, and the $2 monthly allowance covers about 2,000 businesss before you spend anything.
Pay as you go
- $2 free credit / month
- 60 requests / min
- List unit prices
Starter
- $15 free credit / month
- 300 requests / min
- 10% off unit prices
Growth
- $50 free credit / month
- 600 requests / min
- 20% off unit prices
Scale
- $250 free credit / month
- 1,200 requests / min
- 30% off unit prices
Same wallet, same key and same $2 monthly allowance as every other Data API. Prices are launch pricing read live from the billing config — GET /v1/scraper/collectors returns the price your key actually pays.
Integration
One POST, typed rows
Base URL https://api.quanticdata.io/v1, Bearer auth, the same key as every other Data API. Endpoint: POST /v1/.
curl -X POST https://api.quanticdata.io/v1/scraper/collectors/business_directory/run \
-H "Authorization: Bearer $QD_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
What people build with the business directory API
Three shapes of work this endpoint was designed around.
Market mapping
Count and locate every operator in a category across comuni, including the ones with no web presence, and you have the denominator that a search-based dataset silently omits.
Lead lists for local B2B
Name, address and a published phone number per business — for small operators the phone is the contact route, and it is on the listing.
Enriching a place dataset
Directory rows carry the legal-ish name and the printed address, which resolve entities that map data leaves ambiguous.
Business directory API versus rolling your own
The differences that actually cost time when you build this in-house.
| DIY scraper | This collector | |
|---|---|---|
| What you get | Whatever ranks for the query | Whatever the directory lists for the category |
| Small operators | Largely absent — they rank for nothing | Present: being listed is the whole point |
| Address | Free text on a page, if any | Split into street, CAP, comune, provincia |
Why no official API answers this
There is no API that returns "every business of this kind in this town". Company registries hold legal entities — registration numbers, officers, filings — which is authoritative and tells you nothing about what a firm actually does today or how to reach it. Maps platforms answer with what they have mapped, weighted by prominence. Directories answer the question as asked, because listing businesses by category and place is the only thing they do.
That difference in purpose is the reason the coverage differs. A directory has no incentive to rank anyone: an operator appears because it is listed, which is exactly why the small ones are there. For a dataset that is supposed to describe a market rather than its advertisers, that is the property that matters.
Limits, coverage and the legal bit
One listing page per source, around 25 businesses. The "show more" control is served over XHR and the deep pages answer with an empty body on a direct request, so paging is not offered rather than half-implemented. Widen coverage by running more places — these directories are organised by comune and by quartiere — and de-duplicate on the directory id, which every row carries. Throughput is your plan's rate limit rather than anything about the collector: 60 requests/minute on pay-as-you-go, up to 1,200 on the top tier.
Coverage is Italian: the sources are Pagine Gialle and Pagine Bianche. Pagine Bianche is best-effort — it answered once and then refused repeated requests during testing — so it is selectable but not the default, and a refusal comes back as a note rather than as an empty result set that would read like "no businesses here".
Collecting publicly visible data is generally lawful in most jurisdictions, and courts have repeatedly declined to treat reading a public page as unauthorised access. Business listings are published by the directory for the purpose of being found, which is about as consent-adjacent as public data gets, and most of what comes back is commercial rather than personal data — though a sole trader's name and number are personal data even on a business listing. Using the contacts for unsolicited marketing is governed separately by GDPR and PECR, and in Italy also by the Registro Pubblico delle Opposizioni for phone numbers. None of this is legal advice — get some for your actual use case.
Why not just use a search API?
Because search returns the businesses that rank, and ranking correlates with marketing budget rather than with existing. Measured on car rental in Milan, ten web results were national chains and aggregators with no independents; the directory listing for the same category was mostly independents. Use both: search for the big players, the directory for the long tail.
How many businesses does one run return?
Around 25 per source — one listing page. The "show more" control is an XHR and the deep pages refuse a direct request, so coverage grows by asking for more places, which is how these directories are organised: by comune and by quartiere.
Which directories are covered?
Pagine Gialle by default, with Pagine Bianche selectable. Pagine Bianche is best-effort: it served one request during testing and refused the following ones, so it is offered rather than relied on, and a refusal is reported as a note instead of a silent empty result.
Is the data any good for an LLM pipeline?
It is typed and already decomposed, which is the part that usually costs you: name, category, street, CAP, comune, provincia, phones. There is no free-text blob to have a model clean up, and every row carries the directory id so the same business resolves across runs.
Is there a free business directory API?
Every account gets $2 of credit every month with no card, which is about 2,000 delivered businesss on this endpoint at $0.001 each. It renews monthly, and a run that delivers nothing is never billed — so a failed or blocked attempt does not eat the allowance.
How much does one run cost?
Multiply the rows you actually receive by $0.001. A run capped at 100 businesss — the maximum for this collector — costs $0.1 if every row comes back, and less when the source has fewer. Volume tiers take up to 30% off, and GET /v1/scraper/collectors returns the price your key actually pays.
Can I call the numbers I collect?
Collecting a published business number and cold-calling it are different questions with different answers. In Italy, marketing calls to numbers in public directories are governed by the Registro Pubblico delle Opposizioni, which subscribers use to opt out; GDPR and PECR apply on top. Check the register before a campaign and take proper advice — this is not it.
How do I avoid duplicates against a Maps dataset?
Match on the normalised name plus the postal code, stripping legal-form suffixes: the directory prints "Autozitra srl" where Maps has "Autozitra", so a naive join counts the same business twice. The lead scraper does exactly this internally when its directory channel is enabled.
Run the business directory API now
$2 of free credit every month, no card. Your key returns its own prices from GET /v1/scraper/collectors.