Skip to main content
GET
Adoption and churn signals API

Frequently asked questions

count is how many rows came back in this response, capped by your limit. total_sites is the corpus-wide number of distinct sites with this event in the window, ignoring limit entirely. Use total_sites for headline figures like “2,847 sites installed this technology this month” and count only to page through rows. total_sites can be null on very large categories if the count query runs too long — the row list still returns.
Each row carries confidence with a score from 0 to 100 and a label. It combines three things: how reliable the detection method is, how many distinct scans saw the technology (detection_count), and how consistently it was seen (detection_rate). A detection seen on only one scan caps at medium no matter how reliable the method, because a single snapshot is not corroboration. A churn with fewer than 2 detections caps at low — if we only ever caught the technology once, its removal is unconfirmed.
Firmographic filters switch the query into filter mode, which restricts results to domains with a matched LinkedIn company record that passes your predicates. Roughly 23–30% of technology domains have a company match, so filtering shrinks both the rows and total_sites. The response’s firmographics.note says so explicitly. If you want company data attached without losing rows, pass company=true on its own instead.
A domain we crawl for the first time appears to have “adopted” everything on it at once, which is not adoption — it is discovery. By default those first-crawl domains are excluded, and the response confirms it with excludes_first_seen: true. Set include_first_seen=true to turn the gate off, which gives you a newly-discovered-domains feed rather than genuine adoption.
Yes. Pass category_id instead of a technology and the query fans out to every detectable technology whose primary category is that one, with each result row naming the specific technology involved. Note that primary category is the only axis used, so a tool cross-listed elsewhere will not appear under a secondary category.
Signal queries are heavy scans over the detection corpus. Everything under /v1/signals/* carries an additional per-key limit of 10, 30 or 60 requests per minute depending on plan, on top of your general plan limit. A signals 429 identifies itself with "scope": "signals" in the error details.

Authorizations

Authorization
string
header
required

API key in format tapi_live_[32-char] (live) or tapi_test_[32-char] (test)

Path Parameters

type
enum<string>
required

The signal type. churn = a technology the domain had is now gone. adoption = a technology the domain newly started using.

Available options:
churn,
adoption
Example:

"adoption"

Query Parameters

technology_id
integer

Scope by BuiltWith technology id. Provide exactly one of technology_id, technology or category_id.

technology
string

Scope by exact technology name. The technology must be detectable.

category_id
integer

Scope by category — fans out to every detectable technology whose primary category is this one. Each result row names the specific technology.

window
string
default:30

Look-back window in days. Accepts 30 or 30d. Clamped to 1–365.

limit
integer
default:100

Rows returned. Clamped to 1–1000.

Required range: 1 <= x <= 1000
min_confidence
number<float>
default:0.5

Minimum detection_rate for a row to be returned.

Required range: 0 <= x <= 1
include_first_seen
boolean
default:false

Adoption only. true disables the first-seen gate and counts first-time-crawled domains as adopters — a newly-discovered-domains feed, not genuine adoption.

country
string

Filter to companies in this country (case-insensitive).

city
string

Filter to companies in this city (case-insensitive).

state
string

Filter to companies in this state or region (case-insensitive).

industry
string

Filter to companies in this industry (case-insensitive).

industry_code
integer

Filter by exact LinkedIn industry code.

employees
string

Filter by exact LinkedIn employee band. Unknown bands are rejected with INVALID_EMPLOYEE_BAND and the allowed list.

company_type
string

Filter by exact company type.

founded_min
integer

Only companies founded in or after this year.

Required range: 1800 <= x <= 2025
founded_max
integer

Only companies founded in or before this year.

Required range: 1800 <= x <= 2025
company
boolean

Set to true to attach the company card without filtering results (enrich-only mode).

has_email
boolean

Filter to domains where the crawler found (or did not find) an email address. false is a real filter, not a no-op.

has_phone
boolean

Filter to domains where the crawler found (or did not find) a phone number.

social
enum<string>

Filter to domains publishing a profile on this platform.

Available options:
linkedin,
x,
facebook,
instagram,
youtube,
github,
tiktok,
discord,
reddit,
crunchbase,
slack
language
string

Filter by the site's primary language.

web_country
string

Filter by the country the site declares in its schema.org markup. Accepts ISO-2, English name or common variants.

segment_id
string

Apply a saved audience instead of inline filters. Filter audiences replay their firmographic predicates; list audiences restrict rows to their member domains. Mutually exclusive with inline firmographic parameters.

Response

Matching domains and the corpus-wide site count

success
boolean
Example:

true

data
object