TopDevelopers Scraper - IT Agency Leads with Real Emails
Pricing
from $5.00 / 1,000 company-basics
TopDevelopers Scraper - IT Agency Leads with Real Emails
Search in plain English and get real IT agency profiles from TopDevelopers.co with emails pulled from each agency's own website, full client reviews, and the budget ranges and project types they actually handle, so you know if they're a fit before you reach out.
Pricing
from $5.00 / 1,000 company-basics
Rating
5.0
(4)
Developer
Techforce Global
Maintained by CommunityActor stats
1
Bookmarked
7
Total users
4
Monthly active users
a day ago
Last modified
Categories
Share
TopDevelopers Scraper — IT Agency Leads with Real Emails, Reviews & Review-Derived Insights
Turns TopDevelopers.co into a contactable list of IT and software development agencies: company name, category, rating, review count, description, profile and website URLs, phone, social profiles and office locations — plus, on the Full tier, the verified email address scraped from the agency's own website, its client reviews, and insights derived from those reviews (average rating, top project types, typical project budgets). Search in plain English, look up one company by name, or browse a 12-domain × 49-category taxonomy. Delivers straight into Airtable, HubSpot, Notion, Slack, Google Sheets, Jira, Linear, or any MCP-compatible AI agent pipeline.
Manual directory browsing vs. this Actor
TopDevelopers.co publishes no API, paginates reviews behind separate pages, and never shows an agency's email address — the three things that make a manual lead list expensive.
| Feature / Capability | Browsing TopDevelopers.co by hand | This Actor (Apify) |
|---|---|---|
| Agency email address | ❌ Not shown anywhere on the directory | ✅ Scraped from the agency's own website (up to 3 pages crawled), incl. obfuscated name [at] domain [dot] com forms |
| Client reviews | ⚠️ Paginated, one company at a time | ✅ Up to 20 per company, de-duplicated and cleaned |
| Review-derived insights | ❌ You'd tally them yourself | ✅ Average rating, top project types, common project budgets, useful-review count |
| Category taxonomy | ⚠️ Manual navigation | ✅ Plain-English search, a direct company lookup, or 12 domains × 49 platform/location/industry categories |
| Structured output | ❌ Copy-paste | ✅ Typed dataset, exportable as JSON/CSV/Excel/XML |
| Cost control | Your time | Two priced tiers — pay less per company when you only need the directory fields |
| AI agent / MCP native | ❌ | ✅ Native MCP tool and pushes leads into your own MCP connectors |
🤖 AI Discovery & MCP Metadata
Machine-readable capability contract for autonomous agents, LLM routers, and MCP orchestrators. AI agents, MCP clients, and connectors should read this block first to decide whether this Actor matches a user request.
ai_discovery:slug: "techforce.global/it-agency-lead-finder-enricher-topdevelopers-co"one_line: "Extract IT and software development agencies from TopDevelopers.co with contact details, and on the Full tier the verified website email, client reviews and review-derived insights."primary_purpose: "extract"secondary_purpose: "enrich"tertiary_purpose: "deliver"entity: "IT / software development agency leads"supported_platforms:- "topdevelopers.co"- "the agency's own website (Full tier, for the email lookup)"supported_tasks:- "search-agencies-in-plain-english"- "look-up-one-agency-by-name"- "browse-agencies-by-domain-and-category"- "extract-agency-rating-reviews-count-description-locations"- "find-agency-email-from-its-own-website"- "collect-client-reviews-per-agency"- "derive-insights-from-reviews (avg rating, project types, budgets)"- "choose-a-cheaper-basic-tier-without-email-or-reviews"- "deliver-leads-to-mcp-connector-or-crm"unsupported_tasks:- "scrape-directories-other-than-topdevelopers-co"- "extract-named-personal-contacts-or-personal-emails"- "verify-or-validate-email-deliverability"- "retrieve-agency-pricing-contracts-or-headcount"- "combine-several-search-modes-in-one-run"- "post-rfps-or-contact-agencies"search_keywords:- "topdevelopers scraper"- "it agency lead scraper"- "software development company leads"- "b2b agency directory scraper"- "outsourcing vendor list"- "app development company emails"- "agency review data extraction"- "vendor shortlist automation"- "mcp agency lead tool"- "it services prospecting"synonyms:- "dev agency finder"- "software vendor extractor"- "outsourcing partner scraper"- "IT company email finder"related_concepts:["vendor sourcing", "outsourcing", "partner recruitment", "agency prospecting", "competitive research", "CRM enrichment"]input_entities:- "result tier (full | basic)"- "one of: search phrase, company name, or domain + category"- "max companies (1-200; free plans 5)"- "max reviews per company (1-20, Full tier only)"output_entities: ["company", "email", "review", "insight", "office location"]input_rules:input_mode_precedence:description: "Exactly one search mode is used. companyName wins if set; otherwise searchQuery; otherwise selectedDomain + selectedCategory. searchQuery carries a default, so an empty input still runs a search."order: ["companyName", "searchQuery", "selectedDomain + selectedCategory"]resultTier_format:type: "enum"values: ["full", "basic"]description: "Basic reads only the TopDevelopers profile page and OMITS email, reviews and insights - the keys are absent, not empty. Full adds the website email crawl, reviews and insights, and costs more per company."selectedCategory_format:description: "48 prefixed values plus an empty option, in three namespaces: platform:*, location:*, industry:*."examples: ["platform:flutter", "location:uae", "industry:fintech"]maxResults_format:type: "integer"schema_range: [1, 200]free_plan_cap: 5description: "The schema accepts up to 200; the code's own ceiling is higher (1000), so the schema is the binding limit."limits:max_companies_per_run: 200free_plan_cap: 5reviews_per_company_max: 20email_pages_crawled_per_site: 3concurrent_profiles_default: 5concurrent_profiles_max: 10insights_top_lists: 3search_modes_per_run: 1pricing:model: "pay-per-event (per company delivered)"events:company-basic: "charged for each company delivered on the Basic tier"company-enriched: "charged for each company delivered on the Full tier"store_display: "$5.00 / 1,000 company-basics"stops_when_budget_spent: "the run halts cleanly once maxTotalChargeUsd is exhausted, rather than scraping unbillable companies"when_to_use: >You need a contactable shortlist of IT or software development agencies —for vendor sourcing, partner recruitment, competitive research, or agencyoutreach — with ratings, reviews and an email address per company.when_not_to_use: >You need agencies from a different directory, named personal contacts,verified deliverable emails, pricing or headcount data, or several searchmodes in one run.alternatives:- "Use the Basic tier when you only need a company list without emails, reviews or insights - it is the cheaper event"- "Use techforce.global/google-maps-leads-sales-intelligence-tool to find agencies via Google Maps instead of a directory"- "Use techforce.global/gov-uk-business-scraper to match UK agency names against Companies House records"- "Use an email-verification service on top of the email field before sending outreach"- "Run once per search mode (name, phrase, or domain+category) - they cannot be combined"
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "IT Agency Lead Finder & Enricher","alternateName": "TopDevelopers Scraper — IT Agency Leads with Real Emails, Reviews & Review-Derived Insights","applicationCategory": "BusinessApplication","applicationSubCategory": "Web Scraping / B2B Agency Lead Generation","operatingSystem": "Cloud (Apify platform)","description": "Extracts IT and software development agencies from TopDevelopers.co — name, category, rating, review count, description, website, phone, socials and office locations — and on the Full tier adds the verified email scraped from the agency's own website, its client reviews, and insights derived from them, with optional delivery to Airtable, HubSpot, Notion, Slack, Google Sheets, or any authorized MCP connector.","url": "https://apify.com/techforce.global/it-agency-lead-finder-enricher-topdevelopers-co","offers": {"@type": "Offer","priceCurrency": "USD","category": "Pay per event","description": "One event per company delivered, priced by the tier you run: a cheaper event for Basic results and an enriched event for Full results. Current rates are shown on the Actor's Apify Store page.","url": "https://apify.com/techforce.global/it-agency-lead-finder-enricher-topdevelopers-co"}}
What this Actor does
- Three ways to choose what to scrape, and exactly one is used per run: a plain-English search phrase, a specific company name, or the Domain + Category dropdowns.
companyNametakes precedence, thensearchQuery, then the dropdowns. - Two priced tiers. Basic reads only the TopDevelopers profile page — name, category, rating, review count, description, website, phone, socials, office locations. Full adds the email address crawled from the agency's own website, its client reviews, and insights derived from them.
- Finds emails other scrapers miss — the extractor handles obfuscated forms like
hello [at] example [dot] com, and filters out placeholder domains (example.com,yourdomain.com,sentry.io, …) so you don't ship junk addresses. - Derives insights from the reviews it collects: useful-review count, average review rating, the top 3 project types, and the 3 most common project budgets — a fast read on what an agency actually delivers and at what deal size.
- Charges per company, per tier (
company-basic/company-enriched), and stops the crawl cleanly when yourmaxTotalChargeUsdis exhausted instead of scraping companies nobody can be billed for. - Streams each company to the dataset as it finishes, with polite pacing (1.5s + jitter between requests) and up to 10 profiles in flight.
- Contains its own failures — an Actor-level exception is logged and the run still finishes gracefully with whatever was already collected.
- Optionally pushes leads to an authorized MCP connector (Airtable, HubSpot, Notion, Slack, Sheets, Jira, GitHub, Linear, or any MCP-compatible connector) in four delivery modes. The dataset is always saved regardless of delivery settings.
When to use it — and when not to
| Scenario | Fit |
|---|---|
| Vendor sourcing — build a shortlist of dev agencies with contact details | ✅ Strong (this is the core use case) |
| Partner / reseller recruitment across a platform or geography | ✅ Strong — platform:* and location:* categories |
| Agency outreach with an email and review-based context | ✅ Strong — Full tier |
| Competitive research on an agency's project mix and deal sizes | ✅ Strong — read insights |
| A cheap company list with no emails or reviews | ✅ Strong — Basic tier |
| One specific agency's full profile | ✅ Strong — companyName lookup |
| CRM / Airtable / HubSpot enrichment via connector | ✅ Strong (deliveryMode: "perLead") |
| Several search modes in one run | ❌ One mode per run — companyName wins, then searchQuery |
| More than 200 companies in one execution | ⚠️ Schema ceiling is 200 — split across runs |
| Guaranteed-deliverable email addresses | ⚠️ Emails are scraped, not verified — validate before sending |
| Named personal contacts (CEO, CTO, direct emails) | ❌ Not supported — company-level public emails only |
| Agency pricing, rate cards, contracts or headcount | ❌ Not extracted |
| Directories other than TopDevelopers.co | ❌ Not supported |
| Contacting agencies or posting RFPs | ❌ Not supported — read-only Actor |
⚡ Execution Rules (Avoid Common Agent Failures)
searchQueryhas a default, so an empty input still scrapes.{}runsSoftware development companies in USAon the Full tier withmaxResults: 20. It will not raise a validation error. API and MCP callers should always send their own mode explicitly.- Exactly one search mode is used, and
companyNamewins. IfcompanyNameis set,searchQueryand the dropdowns are ignored entirely — including the default search phrase. Precedence:companyName→searchQuery→selectedDomain+selectedCategory. resultTierchanges the output shape, not just the depth. Onbasic, theemail,reviewsandinsightskeys are removed from the item, not returned empty. An absent key means "not part of this tier" — test for key presence.resultTierdefaults tofull, the more expensive event. Pass"basic"explicitly for the cheap tier.maxReviewsPerCompanyis ignored on the Basic tier — Basic never paginates reviews.maxResultsis capped at 200 by the schema, and free Apify plans are capped at 5 companies per run regardless of what you ask for. The code's internal ceiling is higher (1,000), so the schema is the binding limit — don't rely on the code number.- Each company is a billable event, and the run stops when your budget is spent. When
maxTotalChargeUsdis exhausted the Actor halts the crawl itself and sets a terminal status message — a short dataset with that message is a budget stop, not a failure. - A missing email is the string
"NA", as is a missing phone number. Don't treat"NA"as a real value. selectedCategoryvalues are namespaced strings, not display names:platform:flutter,location:uae,industry:fintech. There are 48 of them plus an empty option.selectedDomainandselectedCategoryare only read when bothcompanyNameandsearchQueryare empty. Setting a dropdown while the default search phrase is still in place does nothing.deliveryModedefaults toperLead, notnone. With a connector selected, a 200-company run makes 200 connector calls. For dataset-only runs leavemcpConnectorempty or setdeliveryMode: "none".- Ratings and counts are normalized numbers;
review_ratingcan benullinside a review when the page didn't show one.
dependencies:- rule: "companyName overrides searchQuery and the Domain/Category dropdowns"on_violation: "the other modes are silently ignored, including the default search phrase"- rule: "resultTier 'basic' removes the email, reviews and insights keys"on_violation: "consumers that read item['email'] raise KeyError instead of seeing NA"- rule: "maxReviewsPerCompany applies to the Full tier only"note: "Basic never fetches review pages"- rule: "every delivered company registers a pay-per-event charge"note: "the run self-terminates once the user's max charge is reached"- rule: "delivery requires mcpConnector AND mcpTool"on_violation: "delivery step is skipped with a warning; the dataset is still written in full"- rule: "mcpArguments must reference {message} for the rendered template to appear anywhere"on_violation: "message body is empty; the tool is still called"- rule: "mcpConnector only resolves when the Actor runs on the Apify platform"on_violation: "local runs log 'APIFY_MCP_PROXY_URL is not set' and skip delivery; the dataset is unaffected"authentication:actor_input: noneplatform: "Apify API token required for API / SDK / MCP invocation"target_site: "no TopDevelopers.co account or credentials required (public directory pages and public website content only)"
📥 Input Contract
.actor/input_schema.json is authoritative — if any table on this page disagrees with the schema files, the schema files win.
Scraping Parameters
| Field | Type | Required | Default | Allowed Values / Format | Example |
|---|---|---|---|---|---|
resultTier | string (enum) | ⬜ No | full | full · basic | basic |
searchQuery | string | ⬜ No (defaults) | Software development companies in USA | Plain-English phrase | android app developers in India |
companyName | string | ⬜ No | — | Exact agency name — overrides everything else | Hyperlink Infosystem |
selectedDomain | string (enum) | ⬜ No | "" | 11 domains + empty (see below) | Mobile App Development |
selectedCategory | string (enum) | ⬜ No | "" | 48 namespaced values + empty | platform:flutter |
maxResults | integer | ⬜ No | 20 | 1–200 (free plans: 5) | 200 |
maxReviewsPerCompany | integer | ⬜ No | 5 | 1–20 — Full tier only | 20 |
maxConcurrency | integer | ⬜ No | 5 | 1–10 profiles at once | 8 |
Choosing a search mode
| You want | Set | Leave empty |
|---|---|---|
| Everything matching a phrase | searchQuery | companyName, dropdowns |
| One specific agency | companyName | — (it wins regardless) |
| A fixed taxonomy slice | selectedDomain + selectedCategory | companyName and searchQuery (clear the default!) |
Domain reference — 11 values
Mobile App Development · Web Development · Software Development · Ecommerce Development · Artificial Intelligence · Big Data Analytics · Digital Marketing · Business Services · Blockchain · Cloud Computing · UI/UX Design
Category reference — 48 namespaced values
| Namespace | Values |
|---|---|
| platform: (31) | android · ios · flutter · react-native · wearable · php · laravel · wordpress · drupal · magento · saas · devops · qa-testing · shopify · woocommerce · bigcommerce · machine-learning · chatbot · generative-ai · business-intelligence · data-science · seo · ppc · social-media · content-marketing · ethereum · hyperledger · nft · aws · azure · salesforce |
| location: (8) | usa · india · uk · canada · australia · uae · germany · russia |
| industry: (9) | healthcare · education · fintech · retail · real-estate · travel · logistics · business-services · information-technology |
Always include the namespace prefix — platform:flutter, not flutter.
Tier comparison
| Basic | Full (default) | |
|---|---|---|
| Profile fields (name, category, rating, review count, description, profile & website URL, phone, socials, locations) | ✅ | ✅ |
email (crawled from the agency's own website) | ❌ key absent | ✅ |
reviews (up to maxReviewsPerCompany) | ❌ key absent | ✅ |
insights (avg rating, top project types, budgets) | ❌ key absent | ✅ |
| Crawls the agency's external website | ❌ | ✅ up to 3 pages |
| Billable event | company-basic | company-enriched |
| Speed | Fastest | Slower — one external site per company |
Examples
Plain-English search, full enrichment:
{"resultTier": "full","searchQuery": "android app developers in India","maxResults": 50,"maxReviewsPerCompany": 10,"deliveryMode": "none"}
Cheap company list — no emails, reviews or insights:
{"resultTier": "basic","searchQuery": "shopify experts","maxResults": 200,"deliveryMode": "none"}
One specific agency:
{"resultTier": "full","companyName": "Hyperlink Infosystem","maxReviewsPerCompany": 20,"deliveryMode": "none"}
Taxonomy browse — note searchQuery must be cleared:
{"resultTier": "full","searchQuery": "","selectedDomain": "Blockchain","selectedCategory": "platform:ethereum","maxResults": 60,"deliveryMode": "none"}
MCP Delivery Configuration (Optional)
| Parameter | Type | Default | Description |
|---|---|---|---|
mcpConnector | string | "" | Authorized MCP connector on your Apify account (Airtable, HubSpot, Notion, Slack, Sheets, Jira, GitHub, Linear, …). Leave empty for dataset-only runs. |
deliveryMode | enum | perLead | perLead (one call per company) · chunked (split a long list across calls) · summary (one digest) · none. |
mcpTool | string | "" | Tool name on the connector: create_record, send_message, create_page, create_issue. Run once with a connector selected — the log lists the connector's available tools. |
mcpArguments | object | {} | Arguments passed to the tool. String leaves support {placeholders}. |
mcpMessageTemplate | string | "" | Template rendered and exposed to mcpArguments as {message}. |
Placeholders by mode:
| Mode | Placeholders |
|---|---|
perLead | {companyName}, {category}, {rating}, {reviewCount}, {description}, {profileUrl}, {websiteUrl}, {email}, {contactNumber}, {socialMedia}, {locations}, {resultTier}, {usefulReviewCount}, {averageReviewRating}, {topProjectTypes}, {commonProjectBudgets}, {lead} (formatted multi-line block), {message} |
summary | {companyCount}, {searchQuery}, {resultTier}, {companies} (every company as a block), {message} |
chunked | the above, plus {part} and {partCount} — and {companies} holds one part |
Chunked delivery truncates each company block at ~1,800 characters and groups blocks into parts under ~72,000 characters, so services with per-request block or timeout caps (Notion in particular) never reject the call. On the Basic tier the email and insight placeholders render empty.
One Airtable/CRM record per agency:
{"resultTier": "full","searchQuery": "react native developers in UAE","maxResults": 60,"mcpConnector": "<your-authorized-airtable-connector>","deliveryMode": "perLead","mcpTool": "create_record","mcpArguments": {"fields": {"Company": "{companyName}","Category": "{category}","Rating": "{rating}","Reviews": "{reviewCount}","Email": "{email}","Phone": "{contactNumber}","Website": "{websiteUrl}","Offices": "{locations}","Top projects": "{topProjectTypes}"}}}
One Slack digest for the whole run:
{"resultTier": "basic","searchQuery": "AI companies","maxResults": 40,"mcpConnector": "<your-authorized-slack-connector>","deliveryMode": "summary","mcpTool": "send_message","mcpArguments": { "channel": "#vendor-shortlist", "text": "{message}" },"mcpMessageTemplate": "{companyCount} agencies for {searchQuery}:\n\n{companies}"}
Chunked into Notion pages for a long list:
{"resultTier": "full","searchQuery": "web design agencies in the UK","maxResults": 200,"mcpConnector": "<your-authorized-notion-connector>","deliveryMode": "chunked","mcpTool": "notion-create-pages","mcpArguments": {"parent": { "page_id": "<your-page-id>" },"pages": [{"properties": { "title": "UK web agencies (part {part}/{partCount})" },"content": "{companies}"}]}}
📤 Output Contract & Data Structure
Storage: Apify Dataset (one JSON object per company).
Pagination: limit & offset on the dataset items endpoint.
Duplicates: one record per company within a run. Cross-run deduplication is the consumer's responsibility — use profile_url as the key.
Field names are snake_case.
| Field | Type | Tier | Meaning |
|---|---|---|---|
company_name | string | both | Agency name as listed |
category | string | both | Category label built from the directory path |
rating | number | both | Normalized star rating from the profile |
review_count | number | both | Normalized review count from the profile |
description | string | both | Agency description from the profile |
profile_url | string | both | TopDevelopers profile URL — use as the dedupe key |
website_url | string | both | The agency's own website |
contact_number | string | both | First profile phone, else first website phone, else "NA" |
social_media | object | both | Social profile URLs keyed by network, merged from profile + website |
locations | array | both | Office locations from the profile |
result_tier | string | both | full or basic — which tier produced this record |
email | string | Full only | Email found on the agency's website; "NA" when none was found. Key absent on Basic |
reviews | array | Full only | Cleaned, de-duplicated client reviews. Key absent on Basic |
insights | object | Full only | Aggregates derived from reviews. Key absent on Basic |
reviews[] — Full tier
| Key | Type | Meaning |
|---|---|---|
review_headline | string | Review title |
reviewer_name | string | Reviewer's name as published |
reviewer_designation | string | Reviewer's role/company as published |
review_rating | number | null | Star rating, null when the page showed none |
review_project_type | string | Project type declared on the review |
review_project_budget | string | Budget band declared on the review |
review_feedback | string | Review body text |
insights — Full tier
| Key | Type | Meaning |
|---|---|---|
useful_review_count | integer | How many reviews survived cleaning and de-duplication |
average_review_rating | number | null | Mean of the ratings actually present, 2 dp |
top_project_types | array | Up to 3 most frequent project types |
common_project_budgets | array | Up to 3 most frequent budget bands |
Consumer rules: test key presence for email / reviews / insights — on Basic they are absent, not empty; "NA" is the sentinel for a missing email or phone; review_rating and average_review_rating can be null; and the insight lists are capped at 3 entries.
Example output item — Full tier
{"company_name": "Prismetric Technologies","category": "Mobile App Development › Flutter","rating": 4.9,"review_count": 37,"description": "Custom mobile and web application development for startups and enterprises.","profile_url": "https://www.topdevelopers.co/profile/prismetric-technologies","website_url": "https://www.prismetric.com","email": "info@prismetric.com","contact_number": "+1 917 900 0091","social_media": {"linkedin": "https://www.linkedin.com/company/prismetric","twitter": "https://twitter.com/prismetric"},"locations": ["Ahmedabad, India", "New York, USA"],"insights": {"useful_review_count": 9,"average_review_rating": 4.78,"top_project_types": ["Mobile App Development", "Web Development", "UI/UX Design"],"common_project_budgets": ["$10,000 - $49,999", "$50,000 - $199,999"]},"reviews": [{"review_headline": "Delivered our MVP ahead of schedule","reviewer_name": "A. Fitzgerald","reviewer_designation": "Founder, HealthTech startup","review_rating": 5.0,"review_project_type": "Mobile App Development","review_project_budget": "$10,000 - $49,999","review_feedback": "Clear communication throughout and a solid handover."}],"result_tier": "full"}
Example output item — Basic tier
Note the absent email, reviews and insights keys:
{"company_name": "Prismetric Technologies","category": "Mobile App Development › Flutter","rating": 4.9,"review_count": 37,"description": "Custom mobile and web application development for startups and enterprises.","profile_url": "https://www.topdevelopers.co/profile/prismetric-technologies","website_url": "https://www.prismetric.com","contact_number": "+1 917 900 0091","social_media": { "linkedin": "https://www.linkedin.com/company/prismetric" },"locations": ["Ahmedabad, India", "New York, USA"],"result_tier": "basic"}
What a successful run looks like
{"status": "SUCCEEDED","defaultDatasetId": "<datasetId>","stats": { "itemCount": 50 }}
itemCount below maxResults has three normal causes: the directory had fewer matches, a free plan capped the run at 5, or your spend limit was reached — in which case the terminal status message says so explicitly. itemCount: 0 with Actor finished without crawling because the selected input is not valid. in the log means no usable search mode was resolved.
▶️ Invocation & Integration
Lifecycle: Discover → Understand → Configure → Execute → Retrieve → Validate. Authenticate every call with Authorization: Bearer <APIFY_TOKEN>.
Apify Console
Open the Actor → Input tab → choose a Result type (Full or Basic) → fill one of: search phrase, company name, or Domain + Category → set Max companies → (optional) pick an MCP connector, tool and template → Start → export from the Dataset tab (JSON, CSV, Excel, XML).
Model Context Protocol (MCP)
claude mcp add --transport http apify \"https://mcp.apify.com?tools=techforce.global/it-agency-lead-finder-enricher-topdevelopers-co"
Python (apify-client)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.getenv("APIFY_TOKEN"))run = client.actor("techforce.global/it-agency-lead-finder-enricher-topdevelopers-co").call(run_input={"resultTier": "full","searchQuery": "android app developers in India","maxResults": 50,"maxReviewsPerCompany": 10,"deliveryMode": "none",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(f"{len(items)} agencies")# On the Basic tier 'email' / 'reviews' / 'insights' are ABSENT - use .get().emailable = [i for i in items if i.get("email", "NA") != "NA"]print(f"{len(emailable)} with a usable email")for agency in emailable[:5]:insights = agency.get("insights", {})print(agency["company_name"],"|", agency.get("rating"),"|", agency["email"],"|", ", ".join(insights.get("top_project_types", [])) or "-",)
JavaScript / TypeScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('techforce.global/it-agency-lead-finder-enricher-topdevelopers-co').call({resultTier: 'basic', // cheap tier - no email, reviews or insightssearchQuery: 'shopify experts',maxResults: 200,deliveryMode: 'none',});const { items } = await client.dataset(run.defaultDatasetId).listItems();const topRated = items.filter((i) => (i.rating ?? 0) >= 4.8);console.log(`${items.length} agencies, ${topRated.length} rated 4.8+`);
cURL — synchronous (returns items directly; 300s limit)
curl -X POST \-H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"resultTier":"basic","searchQuery":"AI companies","maxResults":20,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~it-agency-lead-finder-enricher-topdevelopers-co/run-sync-get-dataset-items'
Use the async pattern below for anything beyond ~20 companies on the Full tier — each company means an external website crawl plus review pages.
cURL — asynchronous with a spend cap (recommended for production)
# 1. Start execution with a hard spend limit.# NOTE: when this budget is spent the Actor stops the crawl and says so in the status message.curl -X POST -H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"resultTier":"full","searchQuery":"web design agencies in the UK","maxResults":200,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~it-agency-lead-finder-enricher-topdevelopers-co/runs?maxTotalChargeUsd=5.00'# 2. Pollcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/actor-runs/<runId>'# 3. Retrieve when SUCCEEDEDcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json&limit=1000&offset=0'
⚠️ Autonomous Agent Error Handling & Resolution Matrix
| Error Code | Detection Condition | Underlying Cause | Deterministic Agent Action |
|---|---|---|---|
AUTH_INVALID | HTTP 401 | Missing or malformed APIFY_TOKEN | Abort & Prompt User: request a valid API token. |
RATE_LIMITED | HTTP 429 | Apify API rate / concurrency limits | Retry: exponential backoff (2s, 4s, 8s). |
SYNC_TIMEOUT | HTTP 408 on the sync endpoint | Run exceeded the 300s synchronous ceiling — easy to hit on the Full tier | Reconfigure: switch to async POST /runs + polling. |
SILENT_DEFAULT | Results are "Software development companies in USA" you never asked for | searchQuery carries a default and nothing else was set | Modify Input: send your own mode explicitly. |
MODE_IGNORED | Your searchQuery or dropdowns had no effect | companyName was set and takes precedence | Modify Input: clear companyName to use the other modes. |
DROPDOWN_IGNORED | Domain/Category selection had no effect | The default searchQuery was still populated | Modify Input: set searchQuery to "" when browsing the taxonomy. |
INVALID_INPUT | SUCCEEDED, 0 items, log Actor finished without crawling because the selected input is not valid. | No usable search mode resolved | Modify Input: supply a search phrase, a company name, or both dropdowns. |
EMPTY_RESULTS | SUCCEEDED, itemCount: 0, valid mode in the log | The directory has no matches for that phrase/category | Modify Input: broaden the phrase or pick another category. |
FREE_PLAN_CAP | itemCount stops at 5, upgrade banner in the log | Free Apify plan caps the run at 5 companies | Prompt User: upgrade for full-volume runs. |
BUDGET_STOP | Short dataset + status message "reached the maximum cost you set" | maxTotalChargeUsd exhausted; the Actor halted the crawl deliberately | Not a failure. Raise the cap and re-run for more companies. |
MISSING_TIER_FIELD | KeyError on email / reviews / insights | The run used resultTier: "basic", which omits those keys | Fix Consumer: use .get(), or re-run on the Full tier. |
NO_EMAIL | email is "NA" | No address discoverable within the 3 crawled pages of that agency's site | Not an error. Fall back to contact_number. |
NO_PHONE | contact_number is "NA" | Neither the profile nor the website exposed a phone number | Not an error. Use the profile or website URL instead. |
NULL_RATING | review_rating / average_review_rating is null | The review page showed no numeric rating | Guard for null before arithmetic. |
CATEGORY_PREFIX_MISSING | Dropdown browse returns nothing | selectedCategory was sent without its namespace | Modify Input: use platform: / location: / industry: prefixes. |
SLOW_RUN | Run approaching the timeout | Full tier: one external site + review pages per company, 1.5s pacing | Reconfigure: switch to basic, lower maxReviewsPerCompany, or raise maxConcurrency (max 10). |
DELIVERY_SKIPPED | Log no tool name was provided | mcpConnector set but mcpTool empty | Modify Input: set mcpTool; the dataset is already saved. |
DELIVERY_TOOL_UNKNOWN | Log Tool 'x' is not available on this connector | Wrong tool name for that connector | Modify Input: pick a name from the Available tools: list in the same log line. |
DELIVERY_EMPTY | Connector called, body empty | mcpArguments omitted the {message} placeholder | Modify Input: map {message} inside mcpArguments. |
DELIVERY_FLOOD | Hundreds of connector calls / connector rate limits | deliveryMode defaults to perLead | Reconfigure: use summary or chunked. |
MCP_PROXY_MISSING | Log APIFY_MCP_PROXY_URL is not set | Running locally instead of on the platform | Reconfigure: apify push and run on the platform. |
CHARGE_EVENT_MISSING | Log Could not register the '…' billing event | The event name isn't configured in the Actor's monetization settings | Owner action: add the event in Console; the scrape still completes. |
Reading run status: an invalid or unusable input still finishes
SUCCEEDEDwith an empty dataset — the log says the selected input was not valid rather than raising. A short dataset plus a terminal status message about the spend cap is a budget stop, not an error. Only aFAILEDstatus is a platform-level failure. Every log-line and field condition in the table above comes from this Actor’s own behavior; the401/408/429rows are standard Apify API responses.
🗣️ Natural Language → Actor Mapping
| User says | Intent | Constructed Actor input |
|---|---|---|
| "Find android app developers in India with emails" | Vendor sourcing | {"resultTier":"full","searchQuery":"android app developers in India","maxResults":50} |
| "Give me a cheap list of Shopify agencies" | Cheap company list | {"resultTier":"basic","searchQuery":"shopify experts","maxResults":200} |
| "Look up Hyperlink Infosystem" | Single-company lookup | {"companyName":"Hyperlink Infosystem","resultTier":"full"} |
| "Flutter developers in the UAE" | Taxonomy browse | {"searchQuery":"","selectedDomain":"Mobile App Development","selectedCategory":"platform:flutter"} |
| "Fintech-focused dev shops" | Industry slice | {"searchQuery":"","selectedDomain":"Software Development","selectedCategory":"industry:fintech"} |
| "Which agencies get the best reviews?" | Quality ranking | {"resultTier":"full"} then sort on insights.average_review_rating |
| "What project sizes does this agency handle?" | Deal-size research | {"resultTier":"full","companyName":"<agency>"} then read insights.common_project_budgets |
| "Show me the actual client feedback" | Review mining | {"resultTier":"full","maxReviewsPerCompany":20} then read reviews[] |
| "Blockchain / Ethereum agencies" | Platform slice | {"searchQuery":"","selectedDomain":"Blockchain","selectedCategory":"platform:ethereum"} |
| "Push these agencies into Airtable" | CRM delivery | {"mcpConnector":"airtable","deliveryMode":"perLead","mcpTool":"create_record"} |
| "Post a vendor shortlist to Slack" | Digest delivery | {"mcpConnector":"slack","deliveryMode":"summary","mcpTool":"send_message","mcpArguments":{"channel":"#vendors","text":"{message}"}} |
| "Save 200 agencies into Notion without it timing out" | Chunked delivery | {"deliveryMode":"chunked","mcpTool":"notion-create-pages"} with {part}/{partCount} in the title |
| "Get me the CTO's email address" | Personal contact | ❌ Out of scope — company-level public emails only |
| "What are this agency's hourly rates?" | Pricing data | ❌ Out of scope — not extracted |
| "Find agencies on Clutch / GoodFirms" | Other directory | ❌ Out of scope — TopDevelopers.co only |
Should NOT route here: directories other than TopDevelopers.co (Clutch, GoodFirms, DesignRush) · named personal contacts or personal emails · agency rate cards, contracts, headcount or revenue · email verification/deliverability · contacting agencies or posting RFPs · several search modes in one run.
🧭 Agent Execution & Routing Logic
[Input User Query]│▼1. Target is the TopDevelopers.co directory? NO → Route to the right platform Actor│ YES▼2. Read-only (not contacting agencies / posting RFPs)? NO → Abort (no outbound actions here)│ YES▼3. Needs rates / contracts / headcount / named people? YES → Abort (not extracted)│ NO▼4. Pick EXACTLY ONE search mode (companyName wins, then searchQuery, then dropdowns)├── one named agency? → companyName├── a phrase? → searchQuery└── a taxonomy slice? → searchQuery: "" + selectedDomain + selectedCategory▼5. Choose the tier — it changes the output SHAPE and the price├── need email / reviews / insights? → resultTier "full" (company-enriched event)└── just a company list? → resultTier "basic" (company-basic event, cheaper, faster)▼6. Volume > 200 companies? YES → Partition across runs (free plans stop at 5)│ NO▼7. Set maxTotalChargeUsd — the run STOPS cleanly when it is spent▼8. Deliver to a connector? YES → mcpConnector + mcpTool + {message}│ perLead = one call per company; prefer summary/chunked at scale│ NO → set deliveryMode "none" (it defaults to perLead)▼[Execute Apify Actor]│├──► status == "SUCCEEDED" ──► itemCount == 0? YES → read the log: invalid input mode vs. no matches│ │ NO│ └──► dedupe on profile_url; use .get() for email/reviews/insights;│ treat "NA" as missing; check the status message for a budget stop└──► status == "FAILED" ──► route to Error Handling Matrix above
💰 Cost Control & Pricing Transparency
Model: pay-per-event, one event per company delivered, with the event chosen by the tier you ran:
| Tier | Billable event | What each company includes |
|---|---|---|
| Basic | company-basic | Profile fields only — no email, reviews or insights |
| Full (default) | company-enriched | Everything in Basic plus website email, reviews and insights |
The Store listing currently advertises $5.00 / 1,000 company-basics. Because the event is per company, cost scales linearly with maxResults — and choosing Basic over Full is the single biggest lever.
| Companies | Basic-tier cost at $5.00 / 1,000 |
|---|---|
| 5 companies (free-plan cap) | $0.025 |
| 20 companies (default run) | $0.10 |
| 50 companies | $0.25 |
| 200 companies (schema ceiling) | $1.00 |
| 1,000 companies (5 runs) | $5.00 |
The spend cap is a real stop, not just a ceiling. When maxTotalChargeUsd is exhausted the Actor detects event_charge_limit_reached, halts the crawl, and sets a terminal status message saying so — it deliberately avoids scraping companies it cannot bill. A short dataset plus that message is a budget stop, not an error.
Cost levers, in order of impact: run Basic when you don't need emails or reviews; keep maxResults tight; lower maxReviewsPerCompany on Full runs (fewer review pages, faster and cheaper in platform usage); and set maxTotalChargeUsd for a hard per-execution ceiling.
ℹ️ Always confirm the live per-event rates on the Actor’s Apify Store page before committing to a large run. The Store listing is what bills you; the table above is a worked example at the advertised Basic-tier rate. Note also that
maxResultsis capped at 200 per run by the input schema.
🔍 Companion machine-readable files
| File | Purpose |
|---|---|
.actor/actor.json | Identity, version, input/output/dataset wiring |
.actor/input_schema.json | Authoritative typed input contract — tier enum, the three search modes, 11 domains, 48 categories, maxResults (1–200), review/concurrency limits, deliveryMode enum |
.actor/dataset_schema.json | Output field metadata and the Console table view |
.actor/output_schema.json | Declares where results are stored |
my_actor/main.py | Search-mode routing, Playwright directory + profile scraping, review pagination, website email crawl, insight derivation, per-company charging, MCP delivery |
my_actor/connector.py | MCP connector session handling and {placeholder} rendering |
Note: this Actor has no pay_per_event.json — the company-basic and company-enriched event prices are configured on the Store listing.
If any table on this page disagrees with the schema files, the schema files win.
🛠️ Troubleshooting
| # | Symptom you see | Most likely cause | Fix |
|---|---|---|---|
| 1 | Results are "Software development companies in USA" you never asked for | searchQuery has a default and nothing else was set | Send your own search mode explicitly. |
| 2 | Your search phrase was ignored | companyName was set — it takes precedence | Clear companyName. |
| 3 | The Domain/Category dropdowns did nothing | The default searchQuery was still populated | Set searchQuery to "" when browsing the taxonomy. |
| 4 | Dropdown browse returns nothing | selectedCategory sent without its namespace | Use platform: / location: / industry: prefixes. |
| 5 | SUCCEEDED with 0 items, log says the input is not valid | No usable search mode resolved | Supply a phrase, a company name, or both dropdowns. |
| 6 | Exactly 5 companies every run | Free Apify plan cap | Upgrade the plan; the log prints the upgrade banner. |
| 7 | Run stopped early with a "maximum cost you set" message | maxTotalChargeUsd was exhausted — a deliberate stop | Raise the cap and re-run. Not an error. |
| 8 | KeyError: 'email' (or reviews / insights) | The run used the Basic tier, which omits those keys | Use .get(), or re-run with resultTier: "full". |
| 9 | email is "NA" | No address discoverable within 3 crawled pages of that site | Fall back to contact_number, or enrich elsewhere. |
| 10 | contact_number is "NA" | Neither profile nor website exposed a phone | Use the profile/website URL instead. |
| 11 | Arithmetic on ratings fails | review_rating / average_review_rating can be null | Guard for null before averaging or comparing. |
| 12 | maxReviewsPerCompany seems ignored | You ran the Basic tier, which never fetches reviews | Switch to resultTier: "full". |
| 13 | Only 3 project types / budgets listed | The insight lists are capped at the top 3 | Read reviews[] for the full distribution. |
| 14 | Emails bounce when you send outreach | Scraped emails are not verified | Run them through an email-verification service first. |
| 15 | Run is slow | Full tier crawls one external site per company plus review pages, with 1.5s pacing | Use Basic, lower maxReviewsPerCompany, or raise maxConcurrency (max 10). |
| 16 | maxResults: 500 rejected | The schema caps maxResults at 200 | Send 200 or less and partition across runs. |
| 17 | HTTP 408 on run-sync-get-dataset-items | The synchronous endpoint has a hard 300-second ceiling | Use async: POST /runs → poll → fetch dataset. |
| 18 | Log: Could not register the '…' billing event | That event isn't configured in the Actor's monetization settings | Owner action: add it in Console. The scrape still completes. |
| 19 | Hundreds of connector calls / connector rate-limited | deliveryMode defaults to perLead | Switch to summary or chunked. |
| 20 | Notion rejects or truncates a long list | Single-call payload exceeded block/timeout caps | Use deliveryMode: "chunked" with {part}/{partCount} in the title. |
| 21 | Slack / Airtable / Notion received nothing | Delivery needs both mcpConnector and mcpTool | Set both. The dataset is still written in full. |
| 22 | Connector fired but the message body is empty | mcpArguments did not reference {message} | Map {message} in mcpArguments and populate mcpMessageTemplate. |
| 23 | Log: APIFY_MCP_PROXY_URL is not set | You ran locally; connectors only resolve on the platform | Deploy with apify push and run on the platform. |
| 24 | Connector fields blank on a Basic run | {email}, {topProjectTypes} etc. have no source data on Basic | Use Full, or drop those placeholders from the template. |
| 25 | HTTP 401 / 403 | Missing, expired, or malformed APIFY_TOKEN | Regenerate in Apify Console → Settings → API & Integrations. |
| 26 | HTTP 429 | Apify account concurrency / rate limits — not TopDevelopers blocking | Retry with exponential backoff (2s → 4s → 8s). |
Diagnostic checklist before opening an issue
- Baseline run.
resultTier: "basic",searchQuery= a broad phrase,maxResults: 5,deliveryMode: "none". - Results returned? If yes, the scraper is fine — re-add the Full tier, volume and delivery one step at a time.
- Zero items? Read the log:
input is not validmeans no mode resolved; otherwise the directory genuinely had no matches. - Short run? Check the terminal status message for a free-plan cap or a budget stop before assuming a bug.
- Missing fields? Confirm which
result_tierthe items carry — Basic legitimately omitsemail,reviewsandinsights.
If the issue survives all five steps, open an Issues ticket on the Actor page (or email support) with the run ID, the exact input JSON, and what you expected.
❓ FAQ
Setup & access
Do I need a TopDevelopers.co account?
No. The Actor reads public directory pages and public company websites. You need an Apify account and API token only.
Is this an official TopDevelopers.co API?
No. This is an independent Actor and is not affiliated with, endorsed by, or sponsored by TopDevelopers.co.
Can I plug it into Claude, Cursor, or a LangChain agent?
Yes — it is a native MCP tool:
claude mcp add --transport http apify "https://mcp.apify.com?tools=techforce.global/it-agency-lead-finder-enricher-topdevelopers-co"
Search modes & volume
Can I combine a search phrase with the dropdowns?
No. One mode per run: companyName wins, then searchQuery, then selectedDomain + selectedCategory. To use the dropdowns you must clear the default searchQuery.
How many companies can one run return?
Up to 200 (schema ceiling), and 5 on free Apify plans. Partition bigger jobs across runs and dedupe on profile_url.
What do the category prefixes mean?
platform: is a technology or service (e.g. platform:flutter), location: is a country (location:uae), industry: is a vertical (industry:fintech).
Tiers, output & data
What exactly does Basic leave out?
email, reviews and insights — and the keys are absent, not empty. Basic also never crawls the agency's own website, which is why it is faster and cheaper.
Why is email sometimes "NA" on a Full run?
Because no address was discoverable within the 3 pages crawled on that agency's site. The extractor does handle obfuscated forms like hello [at] example [dot] com and filters placeholder domains.
Are the emails verified?
No. They are scraped from public website content. Run them through an email-verification service before any real outreach.
Do I get named contacts — a CEO or CTO email?
No. Company-level public addresses only (info@, hello@, contact@ and similar). Reviewer names come from published reviews, not from a contact database.
How are the insights calculated?
From the reviews collected in that run only: useful_review_count after cleaning and de-duplication, the mean of the ratings actually present, and the top 3 project types and budget bands by frequency.
Pricing
How is this billed?
Pay-per-event, one event per company delivered — company-basic on the Basic tier, company-enriched on Full. The Store listing shows $5.00 / 1,000 for the basics event.
How do I make a run as cheap as possible?
Run resultTier: "basic" and keep maxResults tight. Basic skips the external website crawl entirely, so it is both the cheaper event and the faster run.
What happens when my spend cap runs out?
The Actor stops the crawl on purpose, keeps everything already scraped, and sets a terminal status message explaining the stop. Nothing is lost and nothing unbillable is scraped.
🔗 Related Actors
Same data family — other agency & company lead sources
| Actor | Use it for |
|---|---|
| Clutch.co Scraper | The same agency-directory shape from Clutch.co — ratings, reviews and contacts. The closest substitute for this Actor, and the natural second source when you want two directories' view of the same market |
| Design Rush Outreach Bot | Agency listings from DesignRush, aimed at outreach — a third directory to widen coverage beyond what any single one lists |
| Google Maps Business Leads & Sales Intelligence | Find agencies (or any business type) via Google Maps instead of a curated directory — adds website grading and a pitch playbook per lead |
| UK Companies House Advanced Search Scraper | Match UK agency names against Companies House records, with PSC / beneficial-ownership enrichment |
Which source when: curated directories (this Actor, Clutch, DesignRush) give you vetted agencies with client reviews, so they are the better starting point for a shortlist. Google Maps gives you reach and local coverage that no directory has. Companies House verifies that a shortlisted UK agency is a real, solvent entity before you sign anything. Dedupe across all four on website_url — the same agency appears in more than one.
Enrichment & downstream
| Actor | Use it for |
|---|---|
| Advanced Website Crawling Actor | Crawl an agency's whole site from website_url for clean HTML/Markdown/text context beyond the 3 pages this Actor reads |
Suggested pipeline patterns
🎯 Vendor shortlist
Full-tier run over a platform: + location: slice → filter insights.average_review_rating ≥ 4.5 and common_project_budgets matching your deal size → deliveryMode: "perLead" into Airtable → brief the buying team.
💸 Two-pass discovery
Broad Basic run to map the market cheaply → shortlist by rating and review_count → re-run just the shortlist on Full with maxReviewsPerCompany: 20 for emails and review depth.
🏛️ UK agency verification
This Actor for contacts → GOV.UK Business Scraper on company_name → attach company number, incorporation date and PSC data before signing anything.
📇 CRM enrichment loop
One run per category on a schedule → perLead delivery into HubSpot → dedupe on profile_url → verify email before any sequence.
Browse all Actors by Techforce Global at scraper.techforce.global.
🔐 Compliance & Data Privacy
This is an independent Actor. It is not affiliated with, endorsed by, or sponsored by TopDevelopers.co. "TopDevelopers" is a trademark of its respective owner.
This Actor collects publicly available directory listings and publicly published website content. It does not log into any account or scrape behind authentication.
Two points matter before you use the output:
- Some of this is personal data. Agency contact addresses can identify a person at a small firm, and reviewer names and job titles are personal data about identifiable individuals. GDPR and CCPA can apply to both — think carefully before republishing reviewer identities or storing them longer than you need.
- Cold outreach is regulated. Before emailing a scraped address, satisfy the applicable anti-spam and electronic-marketing rules (GDPR Art. 6/21, ePrivacy/PECR, CAN-SPAM, CASL). Emails here are unverified and unconsented.
You are responsible for ensuring your use complies with TopDevelopers.co's Terms of Service and all applicable law.
🆘 Support & Custom Pipeline Engineering
Need scheduled refreshes across categories, other agency directories, email verification in-pipeline, or a full CRM / data-warehouse integration?
- Email: bhavin.shah@techforceglobal.com
- Custom Enterprise Integrations: Book a 15-Minute Technical Consultation
- Maintained by: Techforce Global — Specialists in High-Performance Web Scrapers and Agentic Workflows.
Made with ❤️ by Techforce Global Specialists in High-Performance B2B Lead Data Extraction and AI Automation.
🏷️ Structured data for search & AI discovery
SoftwareApplication describes the Actor; FAQPage wraps the FAQ above so those answers are
eligible for rich results, matching it question-for-question.
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "IT Agency Lead Finder & Enricher","alternateName": "TopDevelopers Scraper — IT Agency Leads with Real Emails, Reviews & Review-Derived Insights","applicationCategory": "BusinessApplication","applicationSubCategory": "Web Scraping / B2B Agency Lead Generation","operatingSystem": "Cloud (Apify platform)","description": "Extracts IT and software development agencies from TopDevelopers.co — name, category, rating, review count, description, website, phone, socials and office locations — and on the Full tier adds the verified email scraped from the agency's own website, its client reviews, and insights derived from them, with optional delivery to Airtable, HubSpot, Notion, Slack, Google Sheets, or any authorized MCP connector.","url": "https://apify.com/techforce.global/it-agency-lead-finder-enricher-topdevelopers-co","author": {"@type": "Organization","name": "Techforce Global","url": "https://www.techforceglobal.com"},"provider": {"@type": "Organization","name": "Apify","url": "https://apify.com"},"offers": {"@type": "Offer","priceCurrency": "USD","category": "Pay per event","description": "One event per company delivered, priced by the tier you run: a cheaper event for Basic results and an enriched event for Full results. Current rates are shown on the Actor's Apify Store page.","url": "https://apify.com/techforce.global/it-agency-lead-finder-enricher-topdevelopers-co"},"featureList": ["No TopDevelopers.co account, API key or credentials required","Three search modes: exact company name, free-text phrase, or service domain plus category","11 service domains and 48 namespaced categories selectable from dropdowns","Category namespaces separate technology, country and vertical filters","Two result tiers, so you pay the cheaper event when you only need profile fields","Basic tier: name, category, rating, review count, description, website, phone, socials and office locations","Full tier adds the company email scraped from the agency's own website","Obfuscated email forms such as hello [at] example [dot] com are decoded, and placeholder domains filtered out","Full tier adds client reviews with a configurable per-company cap","Insights derived from the reviews collected in that run: useful review count, mean rating, and top project types and budget bands","Office locations returned as a structured array, not a single address string","One billing event per company delivered, so an empty run costs nothing in event charges","Spend cap is a genuine stop: the crawl halts rather than scraping companies it cannot bill","Companies pushed to the dataset as each profile completes, so a partial run keeps its results","Optional MCP delivery to Airtable, HubSpot, Notion, Slack, Google Sheets, Linear and more","Chunked delivery mode keeps long company lists under connector size and timeout caps"],"isAccessibleForFree": false,"softwareRequirements": "Apify account and API token","softwareHelp": {"@type": "CreativeWork","url": "https://apify.com/techforce.global/it-agency-lead-finder-enricher-topdevelopers-co"},"keywords": "TopDevelopers scraper, IT agency leads, software development companies, agency directory scraper, B2B lead generation, company email finder, client review scraping, outsourcing partner research, MCP connector"}
{"@context": "https://schema.org","@type": "FAQPage","mainEntity": [{"@type": "Question","name": "Do I need a TopDevelopers.co account?","acceptedAnswer": {"@type": "Answer","text": "No. The Actor reads public directory pages and public company websites. You need an Apify account and API token only."}},{"@type": "Question","name": "Is this an official TopDevelopers.co API?","acceptedAnswer": {"@type": "Answer","text": "No. This is an independent Actor and is not affiliated with, endorsed by, or sponsored by TopDevelopers.co."}},{"@type": "Question","name": "Can I plug it into Claude, Cursor, or a LangChain agent?","acceptedAnswer": {"@type": "Answer","text": "Yes - it is a native MCP tool. Add it with: claude mcp add --transport http apify \"https://mcp.apify.com?tools=techforce.global/it-agency-lead-finder-enricher-topdevelopers-co\""}},{"@type": "Question","name": "Can I combine a search phrase with the dropdowns?","acceptedAnswer": {"@type": "Answer","text": "No. One mode per run: companyName wins, then searchQuery, then selectedDomain plus selectedCategory. To use the dropdowns you must clear the default searchQuery."}},{"@type": "Question","name": "How many companies can one run return?","acceptedAnswer": {"@type": "Answer","text": "Up to 200, the schema ceiling, and 5 on free Apify plans. Partition bigger jobs across runs and dedupe on profile_url."}},{"@type": "Question","name": "What do the category prefixes mean?","acceptedAnswer": {"@type": "Answer","text": "platform: is a technology or service such as platform:flutter, location: is a country such as location:uae, and industry: is a vertical such as industry:fintech."}},{"@type": "Question","name": "What exactly does Basic leave out?","acceptedAnswer": {"@type": "Answer","text": "email, reviews and insights - and the keys are absent, not empty. Basic also never crawls the agency's own website, which is why it is faster and cheaper."}},{"@type": "Question","name": "Why is email sometimes \"NA\" on a Full run?","acceptedAnswer": {"@type": "Answer","text": "Because no address was discoverable within the 3 pages crawled on that agency's site. The extractor does handle obfuscated forms like hello [at] example [dot] com and filters placeholder domains."}},{"@type": "Question","name": "Are the emails verified?","acceptedAnswer": {"@type": "Answer","text": "No. They are scraped from public website content. Run them through an email-verification service before any real outreach."}},{"@type": "Question","name": "Do I get named contacts - a CEO or CTO email?","acceptedAnswer": {"@type": "Answer","text": "No. Company-level public addresses only, such as info@, hello@ and contact@. Reviewer names come from published reviews, not from a contact database."}},{"@type": "Question","name": "How are the insights calculated?","acceptedAnswer": {"@type": "Answer","text": "From the reviews collected in that run only: useful_review_count after cleaning and de-duplication, the mean of the ratings actually present, and the top 3 project types and budget bands by frequency."}},{"@type": "Question","name": "How is this billed?","acceptedAnswer": {"@type": "Answer","text": "Pay-per-event, one event per company delivered - a cheaper event on the Basic tier and an enriched event on Full. Current rates are shown on the Actor's Apify Store page."}},{"@type": "Question","name": "How do I make a run as cheap as possible?","acceptedAnswer": {"@type": "Answer","text": "Run resultTier basic and keep maxResults tight. Basic skips the external website crawl entirely, so it is both the cheaper event and the faster run."}},{"@type": "Question","name": "What happens when my spend cap runs out?","acceptedAnswer": {"@type": "Answer","text": "The Actor stops the crawl on purpose, keeps everything already scraped, and sets a terminal status message explaining the stop. Nothing is lost and nothing unbillable is scraped."}}]}


