TopDevelopers Scraper - IT Agency Leads with Real Emails avatar

TopDevelopers Scraper - IT Agency Leads with Real Emails

Pricing

from $5.00 / 1,000 company-basics

Go to Apify Store
TopDevelopers Scraper - IT Agency Leads with Real Emails

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

Techforce Global

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

4

Monthly active users

a day ago

Last modified

Share

TopDevelopers Scraper — IT Agency Leads with Real Emails, Reviews & Review-Derived Insights

Apify Actor MCP Ready Pricing Target

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 / CapabilityBrowsing TopDevelopers.co by handThis 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 controlYour timeTwo 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: 5
description: "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: 200
free_plan_cap: 5
reviews_per_company_max: 20
email_pages_crawled_per_site: 3
concurrent_profiles_default: 5
concurrent_profiles_max: 10
insights_top_lists: 3
search_modes_per_run: 1
pricing:
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 agency
outreach — 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 search
modes 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. companyName takes precedence, then searchQuery, 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 your maxTotalChargeUsd is 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

ScenarioFit
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)

  1. searchQuery has a default, so an empty input still scrapes. {} runs Software development companies in USA on the Full tier with maxResults: 20. It will not raise a validation error. API and MCP callers should always send their own mode explicitly.
  2. Exactly one search mode is used, and companyName wins. If companyName is set, searchQuery and the dropdowns are ignored entirely — including the default search phrase. Precedence: companyNamesearchQueryselectedDomain + selectedCategory.
  3. resultTier changes the output shape, not just the depth. On basic, the email, reviews and insights keys are removed from the item, not returned empty. An absent key means "not part of this tier" — test for key presence.
  4. resultTier defaults to full, the more expensive event. Pass "basic" explicitly for the cheap tier.
  5. maxReviewsPerCompany is ignored on the Basic tier — Basic never paginates reviews.
  6. maxResults is 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.
  7. Each company is a billable event, and the run stops when your budget is spent. When maxTotalChargeUsd is 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.
  8. A missing email is the string "NA", as is a missing phone number. Don't treat "NA" as a real value.
  9. selectedCategory values are namespaced strings, not display names: platform:flutter, location:uae, industry:fintech. There are 48 of them plus an empty option.
  10. selectedDomain and selectedCategory are only read when both companyName and searchQuery are empty. Setting a dropdown while the default search phrase is still in place does nothing.
  11. deliveryMode defaults to perLead, not none. With a connector selected, a 200-company run makes 200 connector calls. For dataset-only runs leave mcpConnector empty or set deliveryMode: "none".
  12. Ratings and counts are normalized numbers; review_rating can be null inside 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: none
platform: "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

FieldTypeRequiredDefaultAllowed Values / FormatExample
resultTierstring (enum)⬜ Nofullfull · basicbasic
searchQuerystring⬜ No (defaults)Software development companies in USAPlain-English phraseandroid app developers in India
companyNamestring⬜ NoExact agency name — overrides everything elseHyperlink Infosystem
selectedDomainstring (enum)⬜ No""11 domains + empty (see below)Mobile App Development
selectedCategorystring (enum)⬜ No""48 namespaced values + emptyplatform:flutter
maxResultsinteger⬜ No201200 (free plans: 5)200
maxReviewsPerCompanyinteger⬜ No5120 — Full tier only20
maxConcurrencyinteger⬜ No5110 profiles at once8

Choosing a search mode

You wantSetLeave empty
Everything matching a phrasesearchQuerycompanyName, dropdowns
One specific agencycompanyName— (it wins regardless)
A fixed taxonomy sliceselectedDomain + selectedCategorycompanyName 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

NamespaceValues
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

BasicFull (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 eventcompany-basiccompany-enriched
SpeedFastestSlower — 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)

ParameterTypeDefaultDescription
mcpConnectorstring""Authorized MCP connector on your Apify account (Airtable, HubSpot, Notion, Slack, Sheets, Jira, GitHub, Linear, …). Leave empty for dataset-only runs.
deliveryModeenumperLeadperLead (one call per company) · chunked (split a long list across calls) · summary (one digest) · none.
mcpToolstring""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.
mcpArgumentsobject{}Arguments passed to the tool. String leaves support {placeholders}.
mcpMessageTemplatestring""Template rendered and exposed to mcpArguments as {message}.

Placeholders by mode:

ModePlaceholders
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}
chunkedthe 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.

FieldTypeTierMeaning
company_namestringbothAgency name as listed
categorystringbothCategory label built from the directory path
ratingnumberbothNormalized star rating from the profile
review_countnumberbothNormalized review count from the profile
descriptionstringbothAgency description from the profile
profile_urlstringbothTopDevelopers profile URL — use as the dedupe key
website_urlstringbothThe agency's own website
contact_numberstringbothFirst profile phone, else first website phone, else "NA"
social_mediaobjectbothSocial profile URLs keyed by network, merged from profile + website
locationsarraybothOffice locations from the profile
result_tierstringbothfull or basic — which tier produced this record
emailstringFull onlyEmail found on the agency's website; "NA" when none was found. Key absent on Basic
reviewsarrayFull onlyCleaned, de-duplicated client reviews. Key absent on Basic
insightsobjectFull onlyAggregates derived from reviews. Key absent on Basic

reviews[] — Full tier

KeyTypeMeaning
review_headlinestringReview title
reviewer_namestringReviewer's name as published
reviewer_designationstringReviewer's role/company as published
review_ratingnumber | nullStar rating, null when the page showed none
review_project_typestringProject type declared on the review
review_project_budgetstringBudget band declared on the review
review_feedbackstringReview body text

insights — Full tier

KeyTypeMeaning
useful_review_countintegerHow many reviews survived cleaning and de-duplication
average_review_ratingnumber | nullMean of the ratings actually present, 2 dp
top_project_typesarrayUp to 3 most frequent project types
common_project_budgetsarrayUp 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 os
from apify_client import ApifyClient
client = 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().items
print(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 insights
searchQuery: '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.

# 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. Poll
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://api.apify.com/v2/actor-runs/<runId>'
# 3. Retrieve when SUCCEEDED
curl -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 CodeDetection ConditionUnderlying CauseDeterministic Agent Action
AUTH_INVALIDHTTP 401Missing or malformed APIFY_TOKENAbort & Prompt User: request a valid API token.
RATE_LIMITEDHTTP 429Apify API rate / concurrency limitsRetry: exponential backoff (2s, 4s, 8s).
SYNC_TIMEOUTHTTP 408 on the sync endpointRun exceeded the 300s synchronous ceiling — easy to hit on the Full tierReconfigure: switch to async POST /runs + polling.
SILENT_DEFAULTResults are "Software development companies in USA" you never asked forsearchQuery carries a default and nothing else was setModify Input: send your own mode explicitly.
MODE_IGNOREDYour searchQuery or dropdowns had no effectcompanyName was set and takes precedenceModify Input: clear companyName to use the other modes.
DROPDOWN_IGNOREDDomain/Category selection had no effectThe default searchQuery was still populatedModify Input: set searchQuery to "" when browsing the taxonomy.
INVALID_INPUTSUCCEEDED, 0 items, log Actor finished without crawling because the selected input is not valid.No usable search mode resolvedModify Input: supply a search phrase, a company name, or both dropdowns.
EMPTY_RESULTSSUCCEEDED, itemCount: 0, valid mode in the logThe directory has no matches for that phrase/categoryModify Input: broaden the phrase or pick another category.
FREE_PLAN_CAPitemCount stops at 5, upgrade banner in the logFree Apify plan caps the run at 5 companiesPrompt User: upgrade for full-volume runs.
BUDGET_STOPShort dataset + status message "reached the maximum cost you set"maxTotalChargeUsd exhausted; the Actor halted the crawl deliberatelyNot a failure. Raise the cap and re-run for more companies.
MISSING_TIER_FIELDKeyError on email / reviews / insightsThe run used resultTier: "basic", which omits those keysFix Consumer: use .get(), or re-run on the Full tier.
NO_EMAILemail is "NA"No address discoverable within the 3 crawled pages of that agency's siteNot an error. Fall back to contact_number.
NO_PHONEcontact_number is "NA"Neither the profile nor the website exposed a phone numberNot an error. Use the profile or website URL instead.
NULL_RATINGreview_rating / average_review_rating is nullThe review page showed no numeric ratingGuard for null before arithmetic.
CATEGORY_PREFIX_MISSINGDropdown browse returns nothingselectedCategory was sent without its namespaceModify Input: use platform: / location: / industry: prefixes.
SLOW_RUNRun approaching the timeoutFull tier: one external site + review pages per company, 1.5s pacingReconfigure: switch to basic, lower maxReviewsPerCompany, or raise maxConcurrency (max 10).
DELIVERY_SKIPPEDLog no tool name was providedmcpConnector set but mcpTool emptyModify Input: set mcpTool; the dataset is already saved.
DELIVERY_TOOL_UNKNOWNLog Tool 'x' is not available on this connectorWrong tool name for that connectorModify Input: pick a name from the Available tools: list in the same log line.
DELIVERY_EMPTYConnector called, body emptymcpArguments omitted the {message} placeholderModify Input: map {message} inside mcpArguments.
DELIVERY_FLOODHundreds of connector calls / connector rate limitsdeliveryMode defaults to perLeadReconfigure: use summary or chunked.
MCP_PROXY_MISSINGLog APIFY_MCP_PROXY_URL is not setRunning locally instead of on the platformReconfigure: apify push and run on the platform.
CHARGE_EVENT_MISSINGLog Could not register the '…' billing eventThe event name isn't configured in the Actor's monetization settingsOwner action: add the event in Console; the scrape still completes.

Reading run status: an invalid or unusable input still finishes SUCCEEDED with 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 a FAILED status is a platform-level failure. Every log-line and field condition in the table above comes from this Actor’s own behavior; the 401/408/429 rows are standard Apify API responses.


🗣️ Natural Language → Actor Mapping

User saysIntentConstructed 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:

TierBillable eventWhat each company includes
Basiccompany-basicProfile fields only — no email, reviews or insights
Full (default)company-enrichedEverything 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.

CompaniesBasic-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 maxResults is capped at 200 per run by the input schema.


🔍 Companion machine-readable files

FilePurpose
.actor/actor.jsonIdentity, version, input/output/dataset wiring
.actor/input_schema.jsonAuthoritative typed input contract — tier enum, the three search modes, 11 domains, 48 categories, maxResults (1–200), review/concurrency limits, deliveryMode enum
.actor/dataset_schema.jsonOutput field metadata and the Console table view
.actor/output_schema.jsonDeclares where results are stored
my_actor/main.pySearch-mode routing, Playwright directory + profile scraping, review pagination, website email crawl, insight derivation, per-company charging, MCP delivery
my_actor/connector.pyMCP 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 seeMost likely causeFix
1Results are "Software development companies in USA" you never asked forsearchQuery has a default and nothing else was setSend your own search mode explicitly.
2Your search phrase was ignoredcompanyName was set — it takes precedenceClear companyName.
3The Domain/Category dropdowns did nothingThe default searchQuery was still populatedSet searchQuery to "" when browsing the taxonomy.
4Dropdown browse returns nothingselectedCategory sent without its namespaceUse platform: / location: / industry: prefixes.
5SUCCEEDED with 0 items, log says the input is not validNo usable search mode resolvedSupply a phrase, a company name, or both dropdowns.
6Exactly 5 companies every runFree Apify plan capUpgrade the plan; the log prints the upgrade banner.
7Run stopped early with a "maximum cost you set" messagemaxTotalChargeUsd was exhausted — a deliberate stopRaise the cap and re-run. Not an error.
8KeyError: 'email' (or reviews / insights)The run used the Basic tier, which omits those keysUse .get(), or re-run with resultTier: "full".
9email is "NA"No address discoverable within 3 crawled pages of that siteFall back to contact_number, or enrich elsewhere.
10contact_number is "NA"Neither profile nor website exposed a phoneUse the profile/website URL instead.
11Arithmetic on ratings failsreview_rating / average_review_rating can be nullGuard for null before averaging or comparing.
12maxReviewsPerCompany seems ignoredYou ran the Basic tier, which never fetches reviewsSwitch to resultTier: "full".
13Only 3 project types / budgets listedThe insight lists are capped at the top 3Read reviews[] for the full distribution.
14Emails bounce when you send outreachScraped emails are not verifiedRun them through an email-verification service first.
15Run is slowFull tier crawls one external site per company plus review pages, with 1.5s pacingUse Basic, lower maxReviewsPerCompany, or raise maxConcurrency (max 10).
16maxResults: 500 rejectedThe schema caps maxResults at 200Send 200 or less and partition across runs.
17HTTP 408 on run-sync-get-dataset-itemsThe synchronous endpoint has a hard 300-second ceilingUse async: POST /runs → poll → fetch dataset.
18Log: Could not register the '…' billing eventThat event isn't configured in the Actor's monetization settingsOwner action: add it in Console. The scrape still completes.
19Hundreds of connector calls / connector rate-limiteddeliveryMode defaults to perLeadSwitch to summary or chunked.
20Notion rejects or truncates a long listSingle-call payload exceeded block/timeout capsUse deliveryMode: "chunked" with {part}/{partCount} in the title.
21Slack / Airtable / Notion received nothingDelivery needs both mcpConnector and mcpToolSet both. The dataset is still written in full.
22Connector fired but the message body is emptymcpArguments did not reference {message}Map {message} in mcpArguments and populate mcpMessageTemplate.
23Log: APIFY_MCP_PROXY_URL is not setYou ran locally; connectors only resolve on the platformDeploy with apify push and run on the platform.
24Connector fields blank on a Basic run{email}, {topProjectTypes} etc. have no source data on BasicUse Full, or drop those placeholders from the template.
25HTTP 401 / 403Missing, expired, or malformed APIFY_TOKENRegenerate in Apify Console → Settings → API & Integrations.
26HTTP 429Apify account concurrency / rate limits — not TopDevelopers blockingRetry with exponential backoff (2s → 4s → 8s).

Diagnostic checklist before opening an issue

  1. Baseline run. resultTier: "basic", searchQuery = a broad phrase, maxResults: 5, deliveryMode: "none".
  2. Results returned? If yes, the scraper is fine — re-add the Full tier, volume and delivery one step at a time.
  3. Zero items? Read the log: input is not valid means no mode resolved; otherwise the directory genuinely had no matches.
  4. Short run? Check the terminal status message for a free-plan cap or a budget stop before assuming a bug.
  5. Missing fields? Confirm which result_tier the items carry — Basic legitimately omits email, reviews and insights.

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.


Same data family — other agency & company lead sources

ActorUse it for
Clutch.co ScraperThe 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 BotAgency listings from DesignRush, aimed at outreach — a third directory to widen coverage beyond what any single one lists
Google Maps Business Leads & Sales IntelligenceFind 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 ScraperMatch 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

ActorUse it for
Advanced Website Crawling ActorCrawl 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?


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."
}
}
]
}