Lead lists
A Business plan is required to use this feature.
Compare plansBuild targeted prospect lists from the technologies, keywords, and account attributes that match your market. Lead lists can include websites, company and contact details, social media profiles, and other enrichment data for prospecting, segmentation, and reporting.
Returns the lead lists you have created so you can monitor status, pricing, and available results.
GET https://api.wappalyzer.com/v2/lists/
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | Free |
| Name | Description |
|---|---|
id | The list's unique identifier. |
createdAt | List creation date as a UNIX timestamp. |
status |
List status. One of Calculating,
Ready, Failed,
Insufficient or Complete.
|
totalCredits | The price of the list in credits. |
technologies | Array of technologies. |
keywords | Array of keywords. |
rows | The total number of results in the list per technology. |
Request
curl -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/"
Response
[ { "id": "lst_abcdef", "createdAt": 1620687647, "status": "Ready", "totalCredits": 1000, "technologies": [ { "slug": "shopify", "name": "Shopify", "categories": [ { "slug": "ecommerce", "name": "Ecommerce" } ], "operator": "=", "version": null }, ], "keywords": [], "rows": 1000 } ]
Returns the full details of a list by its ID, including filters, pricing, download URLs, and field coverage once the list is ready.
GET https://api.wappalyzer.com/v2/lists/{id}
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | Free |
| Parameter | Description |
|---|---|
id |
The list's unique identifier, e.g. lst_abcdef.
|
| Name | Description |
|---|---|
id |
The list's unique identifier, e.g. lst_abcdef.
|
createdAt | List creation date as a UNIX timestamp. |
status |
List status. One of Calculating,
Ready, Failed,
Insufficient or Complete.
|
technologies | Array of technologies. |
keywords | Array of keywords. |
languages |
Array of language codes (ISO 639-1), e.g. en-us.
|
countries |
Array of two-letter country codes (ISO 3166-2), e.g.
US.
|
industries |
Array of industries, e.g. Fashion & Apparel.
|
companySizes |
Array of company sizes, e.g.
1,001-5,000 employees |
tlds | Array of top-level domains, e.g. .com. |
matchCountryLanguage |
Filtering by both country and language (true) or
either (false).
|
matchTechnologies |
Operator for the technology filter, one of or,
and or not.
|
rootPath | Only include websites that have the selected technology on the root path (typically the homepage). |
subset |
Limits the number of results in the list per technology. Use
subsetSlice to target higher or lesser trafficked
websites.
|
subsetSlice |
Websites in the list are sorted in order of traffic. When a
subset is specified,
subsetSlice determines which section of the list
the results should be taken from (i.e. top or bottom). Set to
0-4 for highest, high, medium, low and
lowest traffic, respectively. Default is 0 for
highest traffic. This option has no effect when subset is equal to
or larger than the total number of available results.
|
subdomains |
Include or exclude subdomains in the results. One of
include, exclude or
merge.
|
minAge |
Include results that were verified at least
minAge months ago (0-11,
default is 0).
|
maxAge |
Include results that were verified at most
maxAge months ago (1-12,
default 2). The default includes the current
calendar month and the two previous months (UTC).
|
fromDate | Only include websites that were discovered after a date (UNIX timestamp). |
requiredSets | Array of required field sets, see Fields. |
excludeNoTraffic | Exclude websites that don't include traffic data. |
excludeMultilingual | Exclude websites with content in more than one language. |
sets | Array of field sets to include in the results. |
callbackUrl | Callback URL that's notified when the list is ready. |
totalCredits | The price of the list in credits. |
url | URL of a ZIP file with the list. |
sampleUrl | URL of a ZIP file with a sample taken from the list. |
rows | Number of results in the list per technology. |
setRows | Number of values included in the list per field set. |
suppressionListId | The suppression list used for this list, if any. |
baseListId | ID of the list that was used as a base for this list, if any. |
baseList | Details of the list that was used as a base for this list, if any. |
Request
curl -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/lst_abcdef"
Response
{ "id": "lst_abcdef", "createdAt": 1620687647, "status": "Ready", "technologies": [ { "slug": "shopify", "name": "Shopify", "categories": [ { "slug": "ecommerce", "name": "Ecommerce" } ], "operator": "=", "version": null }, ], "keywords": [ "FASHION" ], "languages": [ "en-us" ], "countries": [ "US" ], "industries": [ "Fashion & Apparel" ], "companySizes": [ "1,001-5,000 employees" ], "tlds": [ ".com" ], "matchCountryLanguage": false, "matchTechnologies": "or", "rootPath": false, "subset": 1000, "subsetSlice": 0, "subdomains": "include", "minAge": 0, "maxAge": 2, "fromDate": null, "requiredSets": [ "email" ], "excludeNoTraffic": false, "excludeMultilingual": false, "sets": [ "email", ], "callbackUrl": "https://yourdomain/wappalyzer", "format": "csv", "totalCredits": 1000, "url": null, "sampleUrl": "https://lists.wappalyzer.com/wappalyzer-29ddddaa-4949-4217-86a7-f6a407e5853d-lst_abcdef-5ukjhs-sample.zip", "rows": { "shopify": 1000 }, "setRows": { "email": 1000, }, "baseListId": "lst_abcdef" }
Create a new lead list from technologies, keywords, and company filters. Use this endpoint to turn your ICP criteria into a downloadable prospect set.
POST https://api.wappalyzer.com/v2/lists
| Property | Description |
|---|---|
| Execution | Asynchronous |
| Request timeout | 20 seconds |
| Rate limit |
10 requests per second 25 requests per day 3 concurrent requests (lists with Calculating status)
|
| Pricing | Free |
| Name | Description | ||||||||
|---|---|---|---|---|---|---|---|---|---|
technologies |
Array of technologies to filter by (no more than 50).
| ||||||||
categories |
Array of category slugs to filter by (e.g.
payment-processors). Refer to the full
list of categories
(JSON).
If a category includes more than 50 technologies, only the top 50 technologies will be selected. | ||||||||
keywords |
Array of keywords to filter by, e.g.
fashion. Keywords must be alphanumeric
(a-z0-9) and work best with English nouns. Prefix
with not to exclude, e.g.
not fashion.
| ||||||||
languages |
Array of language codes (ISO 639-1) to filter, e.g. en-us.
| ||||||||
countries |
Array of two-letter country codes (ISO 3166-2) to filter, e.g. US.
| ||||||||
industries |
Array of industries, e.g. Fashion & Apparel.
| ||||||||
companySizes |
Array of company sizes to filter, e.g.
5000 for 1,001-5,000 employees.
| ||||||||
tlds |
Array of top-level domains to filter, e.g. .com.
| ||||||||
matchCountryLanguage |
Filter by both country and language (true) or
either (false).
| ||||||||
matchTechnologies |
Operator for the technology filter, one of
or (match any), and (match all) or
not (match the first technology, exclude all
others).
| ||||||||
rootPath | Only include websites that have the selected technology on the root path (typically the homepage). | ||||||||
subset |
Limit the number of results in the list per technology. Use
subsetSlice to target high or low traffic websites.
| ||||||||
subsetSlice |
Websites in the list are sorted in order of traffic. When a
subset is specified,
subsetSlice determines which section of the list
the results should be taken from (i.e. top or bottom). Set to
0-4 for highest, high, medium, low and
lowest traffic, respectively. Default is 0 for
highest traffic. This option has no effect when subset is equal to
or larger than the total number of available results.
| ||||||||
minAge |
Include results that were verified at least
minAge months ago (0-11,
default is 0).
| ||||||||
maxAge |
Include results that were verified at most
maxAge months ago (1-12,
default is 2). The default includes the current
calendar month and the two previous months (UTC).
| ||||||||
fromDate |
Only include websites that were discovered after a date (UNIX
timestamp, e.g. 1620687647).
| ||||||||
requiredSets |
Array of required field sets, e.g. email. See
Fields.
| ||||||||
subdomains |
Include or exclude subdomain in the results. One of
include (default), exclude or
merge. By selecting merge, data for subdomains (such as
languages and traffic) on a domain will be combined into a
single result.
| ||||||||
excludeNoTraffic |
Exclude websites that don't include traffic data (true
or false (default)).
| ||||||||
excludeMultilingual |
Exclude websites with content in more than one language (true
or false (default)).
| ||||||||
suppressionListId |
ID of a ready suppression list uploaded by your account. Reuse
it to exclude the same domains from multiple lead lists. Can be
combined with excludeListId. See
Suppression lists below.
| ||||||||
excludeListId |
ID of an existing lead list whose websites you want to exclude,
e.g.
lst_abcdef. Any URLs that appear in this list will
be excluded from the new list. This function is recursive, i.e. if an excluded list excludes another list, both are excluded. Limited to ten lists or 500,000 websites. | ||||||||
baseListId |
ID of a list to use as a base, e.g. lst_abcdef. The
results will be filtered to only include websites that are also
in the base list.
| ||||||||
sets |
Array of
field sets to include
in the results, e.g. email. See
Fields.
| ||||||||
callbackUrl |
Callback URL that's notified when the list is ready, e.g.
https://yourdomain.com/wappalyzer.
| ||||||||
format |
Output file format, one of csv (default) or
json.
|
The initial response only includes the list ID and current status.
Detailed fields such as totalCredits,
sampleUrl, rows and setRows
become available through the callback payload below or when fetching the
list later.
| Name | Description |
|---|---|
id | The list's unique identifier. |
status |
List status. One of Calculating,
Ready, Failed,
Insufficient or Complete.
|
Use a callback URL to continue your workflow as soon as a list is ready. List generation can take anywhere from a few seconds to a couple of hours depending on the query, so callbacks are the easiest way to avoid polling.
Request
curl -X POST -H "Content-Type: application/json" -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/" -d '{ "technologies": [ { "slug": "shopify" } ] }'
Response
{ "id": "lst_abcdef", "status": "Calculating" }
Callback response
Your callback URL receives a POST request when the list is
ready to price and finalize.
{ "id": "lst_abcdef", "status": "Ready", "rows": { "shopify": 1000 }, "setRows": { "email": 1000 }, "totalCredits": 1000, "sampleUrl": "https://lists.wappalyzer.com/wappalyzer-29ddddaa-4949-4217-86a7-f6a407e5853d-lst_abcdef-5ukjhs-sample.zip" }
Exclude websites from your results using an uploaded suppression list or an existing lead list. Exclusions apply before the result limit, sample, export and credit calculation.
A suppression list is a reusable list of domains you
want to exclude, such as existing customers. Upload it once and pass its
suppressionListId when creating lead lists. To exclude
websites from an existing lead list, use excludeListId. You
can use both in the same request. Uploading and reusing a suppression
list does not spend credits.
- Upload the file in a single request. The response contains a reusable ID. No name or file size is required.
- Fetch the ID every two seconds until
its status is
Ready. If it becomesInvalid, check theerrormessage and correct the file. -
Pass that ID as
suppressionListIdtoPOST /v2/lists. Continue with the usual sample review and list finalization. Reuse the same ID for subsequent lists.
You can also list all suppression lists, fetch a suppression list or delete a suppression list.
Use an uncompressed UTF-8 text file containing one domain or HTTP(S) URL
per line, with no header. Blank lines are ignored. Domain matching
ignores case and a leading www.; duplicates count once.
Invalid lines reject the entire upload and report the line number. Files
are never silently truncated.
Matching uses the existing lead-list subdomain rules. With
subdomains: "include", an entry for
example.com does not exclude every subdomain automatically.
With subdomains: "merge", excluding the root domain also
excludes the merged result for that domain.
| Limit | Allowance per account |
|---|---|
| File size | 20 MiB (20,971,520 bytes) |
| Unique domains per list | 250,000 |
| Total storage | 100 MiB (104,857,600 bytes) |
| New uploads | 20 per UTC calendar day |
| Pending or validating uploads | Two at once |
These limits are shared by all API keys on the account. Storage is checked after upload and validation, using the size of the validated file. There is no storage reservation. Files that exceed the storage quota are rejected and removed. Original uploads and invalid files are removed after processing; interrupted uploads are scheduled for cleanup after 15 minutes. Background processing retries temporary failures for up to one hour; uploads that still cannot be processed become invalid and are cleaned up. Cleanup retries run every five minutes. Validated files remain available until deleted, and files retained for existing lead lists continue to count against storage.
Each upload creates a new ID for a fixed set of domains. To replace a
suppression file, upload a new version and use its new ID in subsequent
requests. Existing lead lists continue using their original set of
domains. When combined with
excludeListId, the existing combined limit of 500,000
exclusions still applies.
These fields are shared by the upload, fetch and deletion responses. File contents are not returned.
| Name | Description |
|---|---|
id |
The unique suppression list ID. Pass it as
suppressionListId when creating a lead list.
|
name | The optional name provided with the upload; otherwise, the ID. |
status |
One of Pending, Validating,
Ready, Invalid,
Retired or Deleted. Only
Ready IDs can be used in new lead lists.
|
createdAt | Creation date as a UNIX timestamp in seconds. |
domainCount | The number of unique domains, available after validation. |
sizeBytes | The validated file size in bytes; initially zero. This can differ from the uploaded file size after blank lines and duplicates are removed. |
error | The validation error, when available. |
retiredAt | The retirement date as a UNIX timestamp in seconds, when available. |
Uploads a file in one request, returning a reusable ID while validation
runs in the background. Send the file itself as the request body with
Content-Type: text/plain. No JSON wrapper, form fields or
separate completion request are needed.
POST https://api.wappalyzer.com/v2/lists/suppressions
| Property | Description |
|---|---|
| Execution | Asynchronous validation after upload |
| Upload timeout | 60 seconds to receive and store the file |
| Upload limits | Two at once; 20 per UTC calendar day |
| Pricing | Free |
Required. An uncompressed UTF-8 text file of up to 20 MiB, with one
domain or HTTP(S) URL per line and no header. See
file format and matching.
application/octet-stream is also accepted.
| Name | Description |
|---|---|
name | Optional. A label of 1–100 characters. Defaults to the returned ID. |
Returns 202 Accepted and the
suppression list fields once the
file is stored. Fetch the ID every two seconds while its status is
Pending or Validating. Once it is
Ready, the response includes domainCount and
validated sizeBytes; pass the ID as
suppressionListId when creating lead lists. If it becomes
Invalid, read error and correct the file
before uploading again. A fast validation may finish before the upload
response arrives.
Files over 20 MiB return 413. Exceeding the daily or
simultaneous upload limit returns 429. File-content errors
and account-storage limits are checked in the background and reported
with status Invalid and an error message.
id, fetch
that ID to check its status. A Ready ID can be used
immediately.
The examples upload suppression.txt without a name or file
size, then check its status until it is ready. The cURL example also
uses jq to read the JSON responses. If polling stops before
processing finishes, keep the ID and fetch its status later.
Request
api="https://api.wappalyzer.com/v2/lists/suppressions" key="<your api key>" result=$(curl --fail-with-body --max-time 75 -X POST \ -H "Content-Type: text/plain" -H "x-api-key: $key" \ --data-binary @suppression.txt "$api") || exit 1 id=$(printf '%s' "$result" | jq -r '.id') echo "Suppression ID: $id" for attempt in $(seq 1 60); do case $(printf '%s' "$result" | jq -r '.status') in Ready) printf '%s\n' "$result"; exit 0 ;; Pending|Validating) sleep 2 ;; *) printf '%s\n' "$result" >&2; exit 1 ;; esac result=$(curl --fail-with-body --max-time 30 \ -H "x-api-key: $key" "$api/$id") || exit 1 done echo "Still processing. Fetch $id again later."
Response
{ "id": "sup_0123456789abcdef0123456789abcdef", "name": "sup_0123456789abcdef0123456789abcdef", "status": "Pending", "createdAt": 1792886400, "sizeBytes": 0 }
Returns up to 100 suppression lists per page, along with the storage allocation and limits shared by all API keys on your account.
GET https://api.wappalyzer.com/v2/lists/suppressions
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | Free |
| Name | Description |
|---|---|
cursor |
Optional. Pass nextCursor from the preceding
response to fetch the next page. Omit it for the first page.
|
| Name | Description |
|---|---|
lists | An array of suppression list records. |
nextCursor |
The next page cursor, or null when there are no
more pages.
|
allocatedBytes | Total validated file storage, including files retained for existing lead lists. |
limits | The account limits shown below. Sizes are in bytes and durations are in seconds. |
Request
curl --fail-with-body -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/suppressions"
Response
{ "lists": [ { "id": "sup_0123456789abcdef0123456789abcdef", "name": "sup_0123456789abcdef0123456789abcdef", "status": "Ready", "createdAt": 1792886400, "domainCount": 2, "sizeBytes": 23 } ], "nextCursor": null, "allocatedBytes": 23, "limits": { "fileBytes": 20971520, "domains": 250000, "accountBytes": 104857600, "uploadsPerDay": 20, "pendingUploads": 2, "uploadSeconds": 300, "activeUploadSeconds": 900, "abandonedSeconds": 86400 } }
Returns the status and metadata for one suppression list. Use this to check whether validation has completed.
GET https://api.wappalyzer.com/v2/lists/suppressions/{suppressionId}
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | Free |
| Name | Description |
|---|---|
suppressionId | The suppression list ID returned by the upload. It must belong to your account. |
Returns the suppression list fields.
Request
curl --fail-with-body -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/suppressions/sup_0123456789abcdef0123456789abcdef"
Response
{ "id": "sup_0123456789abcdef0123456789abcdef", "name": "sup_0123456789abcdef0123456789abcdef", "status": "Ready", "createdAt": 1792886400, "domainCount": 2, "sizeBytes": 23 }
Retires the ID so it cannot be used in new lead-list requests. Existing lead lists and repeat jobs continue using their original set of excluded domains.
DELETE https://api.wappalyzer.com/v2/lists/suppressions/{suppressionId}
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | Free |
| Name | Description |
|---|---|
suppressionId | The suppression list ID returned by the upload. It must belong to your account. |
Returns the
suppression list fields with status
Retired, or Deleted if cleanup has already
completed. Repeating deletion is safe while the record remains
available.
Request
curl --fail-with-body -X DELETE -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/suppressions/sup_0123456789abcdef0123456789abcdef"
Response
{ "id": "sup_0123456789abcdef0123456789abcdef", "name": "sup_0123456789abcdef0123456789abcdef", "status": "Retired", "createdAt": 1792886400, "domainCount": 2, "sizeBytes": 23, "retiredAt": 1792890000 }
Deletion does not immediately reclaim storage. Cleanup waits at least 24 hours and retains the file while lead lists reference it. Delete those lead lists to release their retained file. Cleanup is asynchronous; cleaned metadata expires after seven days.
| Status | Description |
|---|---|
| 200 | The fetch, list or deletion request succeeded. |
| 202 | The file is stored and queued for validation. Check the ID's status and wait for Ready before using it. |
| 400 | Invalid request parameters or an empty upload. File-content errors are reported through the ID's Invalid status. |
| 403 | The API key is missing or invalid. |
| 404 | The ID is unknown or belongs to another account. |
| 408 | The upload was interrupted or exceeded 60 seconds. Check the returned ID before uploading again. |
| 409 | A concurrent update is in progress, or the ID is not in the required state. Only Ready IDs can be used in lead lists. |
| 413 | The file exceeds the permitted size. |
| 415 | Use an uncompressed file with Content-Type: text/plain or application/octet-stream. |
| 429 | The daily upload, pending-upload or API request rate limit has been reached. |
| 503 | The upload service is unavailable. Check the returned ID before uploading again. |
| 504 | The upload timed out. Check existing IDs before starting another upload. |
When a list is ready, finalize it to spend credits and unlock the full
download URL. After payment, the list status changes to
Complete.
POST https://api.wappalyzer.com/v2/lists/{id}
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | 1 Credit per website |
| Parameter | Description |
|---|---|
id |
The list's unique identifier, e.g. lst_abcdef.
|
| Name | Description |
|---|---|
spendCredits |
The number of credits to spend. This value must exactly match
the list's
totalCredits, obtained from either the
callback response or
fetch endpoint.
|
Request
curl -X POST -H "Content-Type: application/json" -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/lst_abcdef" -d '{ "spendCredits": 1000 }'
Response
{ "id": "lst_abcdef", "status": "Complete", "url": "https://lists.wappalyzer.com/wappalyzer-29ddddaa-4949-4217-86a7-f6a407e5853d-lst_abcdef-5ukjhs.zip", }
Permanently delete a list you no longer need.
DELETE https://api.wappalyzer.com/v2/lists/{id}
| Property | Description |
|---|---|
| Execution | Synchronous |
| Request timeout | 20 seconds |
| Rate limit | 10 requests per second |
| Pricing | Free |
| Parameter | Description |
|---|---|
id |
The list's unique identifier, e.g. lst_abcdef.
|
Request
curl -X DELETE -H "x-api-key: <your api key>" "https://api.wappalyzer.com/v2/lists/lst_abcdef"
Response
{}