Domains by Technology Analyzer
Pricing
from $2.00 / 1,000 results
Domains by Technology Analyzer
This actor provides domains based on the technology they use. In addition to the list of domains, you will also get their technology profiles, the country and language they belong to, and other related data.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
wang wei
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
2
Monthly active users
3.9 days
Issues response
18 hours ago
Last modified
Categories
Share
Domains by Technology Analyzer — find sites by stack with auto-pagination
Search 5,000+ technologies (Shopify, WordPress, nginx, Google Analytics, jQuery, React…) and pull a clean list of domains that use them, with optional country filtering and automatic cursor pagination up to 1,000 results per run.
Why Use This Actor
| Problem | How This Actor Solves It |
|---|---|
| Need a prospect list of every Shopify store in the US? | Search Shopify + filter country: US in one run. |
| Need more than 100 results? | Set limit up to 1,000 — the Actor cursor-paginates upstream results automatically so you get a single, de-duplicated, ordered list. |
| Don't know the exact casing of a technology? | Case is normalized via an 800+ alias table: wordpress → WordPress, GA → Google Analytics. |
| Need to resume a previous run? | Use offset to skip the first N upstream items. |
What You Get
For every matched domain you receive:
- Identity:
domain,title,description,metaKeywords - Signals:
domainRank,lastVisited,countryIsoCode,languageCode,contentLanguageCode - Contact:
phoneNumbers[],emails[],socialGraphUrls[] - Stack: full
technologies{}object as detected upstream - Provenance (
_*fields): the query echo, total upstream count, page count, and how many items this run collected — so you can detect partial vs. complete runs.
Quick Start
1. Run with Example Input
{"technologies": "Shopify\nWordPress","country": "US","limit": 250}
Returns up to 250 US domains using Shopify OR WordPress.
2. Export Your Results
- Open the run in Apify Console.
- Click the Dataset tab → Export → JSON / CSV / Excel.
- Or fetch the API:
GET https://api.apify.com/v2/acts/<ACTOR_ID>/runs/<RUN_ID>/dataset/items
Input Reference
Top-Level Structure
{"technologies": "Shopify\nWordPress\nWooCommerce","country": "US","limit": 500,"offset_token": ""}
technologies — Technologies
| Required | Type | Default | Description |
|---|---|---|---|
| Yes | string (textarea) | — | One technology per line, or comma-separated. Case-insensitive (normalized via the built-in alias table). Up to 10 per run. |
Examples:
ShopifyWordPressGoogle AnalyticsnginxWooCommerce, jQuery, React
country — Country Filter
| Required | Type | Default | Description |
|---|---|---|---|
| No | string | empty (all countries) | ISO-3166-1 alpha-2 code: US, GB, DE, CN, JP, BR, etc. Leave empty to search worldwide. |
limit — Result Limit
| Required | Type | Default | Min | Max | Description |
|---|---|---|---|---|---|
| No | integer | 100 | 1 | 1000 | How many domains to collect. The Actor cursor-paginates upstream results automatically — setting limit: 500 will fetch 5 upstream pages if needed. |
offset_token — Resume From Cursor
| Required | Type | Default | Description |
|---|---|---|---|
| No | string | empty | Opaque base64 cursor returned by a previous run. Paste the value of _lastOffsetToken from a SUMMARY record to resume that run from where it left off. Leave empty to start fresh. |
Output Reference
Domain Object — one row per matched domain
| Field | Type | Description |
|---|---|---|
domain | string | The root domain, e.g. example-store.com. |
title | string|null | <title> tag content. |
description | string|null | <meta name="description"> content. |
metaKeywords | string|null | <meta name="keywords"> content. |
domainRank | number|null | Upstream rank score (lower = more popular). |
lastVisited | string|null | ISO timestamp of last crawl visit. |
countryIsoCode | string|null | ISO-3166-1 alpha-2 country of the IP. |
languageCode | string|null | Detected site language. |
contentLanguageCode | string|null | <meta http-equiv="content-language"> value. |
phoneNumbers | string[] | Phone numbers scraped from the page. |
emails | string[] | Email addresses scraped from the page. |
socialGraphUrls | string[] | URLs to the site's social profiles. |
technologies | object | Map of detected technologies on this domain. |
_query | object | Echo of the input that produced this row (technologies, limit, offset, country). |
_totalCount | number | Total matching domains upstream (may be > _collected). |
_pagesFetched | number | How many upstream pages this run pulled. |
_collected | number | Items actually pushed in this run (= limit, or fewer if upstream had less). |
_lastOffsetToken | string|null | Opaque cursor to pass into the next run's offset_token to continue paginating. null when upstream has no more pages. |
Run Summary
Stored under the SUMMARY key in the default key-value store. Shape:
{"ok": true,"query": { "technologies": ["..."], "normalizedTechs": ["..."], "limit": 500, "offset": 0, "country": "US" },"result": { "totalCount": 12834, "collected": 500, "pagesFetched": 5, "lastOffsetToken": "eyJ...", "hasMore": true },"paying": false,"freeRunsToday": 2,"apiRequests": 5,"completedAt": "2026-07-20T12:00:00.000Z"}
Pagination — How It Works
Each run returns exactly 100 domains. To get the next 100, run again with offset = previous_nextOffset.
Run 1: offset=0 → 100 items (1-100), _nextOffset: 100Run 2: offset=100 → 100 items (101-200), _nextOffset: 200Run 3: offset=200 → 100 items (201-300), _nextOffset: 300...Run 99: offset=9800 → 100 items (9801-9900), _nextOffset: null (exhausted)
When _nextOffset is null, upstream has no more matches and you've finished.
Hard ceiling: 9900 items per query
The upstream API enforces offset + limit <= 10000 and rejects anything above (Invalid Field: 'limit'). With limit locked at 100, the maximum reachable offset is 9900 — that's 99 pages × 100 = 9,900 domains per (technologies, country, last_visited) query.
To go deeper:
- Refine your query: add a
countryfilter to scope results to a single market. - Split technologies: search
Shopifyin run 1,WooCommercein run 2, etc. - Tighten
last_visited: the Actor defaults to "visited this calendar year"; older results need a different filter (currently hardcoded — let us know if you need a date range input).
Empty-page handling
If a run returns 0 items (offset past the end), the Actor returns an empty dataset with _nextOffset: null and hasMore: false. No upstream call is made when offset > 9900.
Pricing & Limits
- Free tier: 5 runs/day (capped via Actor-scoped KV store).
- Hard cap per run: 100 domains.
- Hard cap on technologies per run: 10.
- Max pages per query: 99 (offset 0 → 9800, yielding 9,900 items total). Beyond that, refine your query.
- Filter:
lastVisitedis restricted to the current calendar year by default (results stay fresh).
FAQ
Q: Why do I get fewer results than limit?
A: Upstream simply doesn't have that many matches for your query. Check _totalCount in the output or result.totalCount in SUMMARY — that's the real upstream count.
Q: How do I get more than 100 results?
A: Run the Actor again with offset set to the value of _nextOffset from the previous run's SUMMARY (or any dataset row's _nextOffset field). Example: run 1 returns 100 items with _nextOffset: 100. Run 2 uses offset: 100 to get items 101-200. Repeat until _nextOffset is null.
Q: Does case matter in technologies?
A: No. Input is lowercased and looked up in the alias table (800+ entries). wordpress, WordPress, and WORDPRESS all resolve to canonical WordPress.
Q: Does the free tier reset at midnight UTC?
A: Yes — the counter is keyed by YYYY-MM-DD (UTC).
Q: Why is _collected < limit even though _totalCount > limit?
A: You ran out of free quota mid-pagination, OR upstream returned pages shorter than limit. Use the API (apify call) or a paid tier to avoid the free-tier block.
Support
- Console run page: open the run for live logs + retry options.
- Email: sam.wang0420@gmail.com (errors auto-notified via Resend).
License
MIT License — free to use and modify.


