Find app developers to pitch - a filtered lead list with each developer's best scored business email (Studio plan).
Developer lead lists (Studio). Filter by store, top category, country, total ratings range, app count, last
app update and email quality; page with cursor. Each row has the developer's profile, reach and the best
business contact we found and scored (email, email_score 0-100, email_role, email_mx_ok). Personal
addresses, addresses that failed the MX check or opted out, and developers who asked not to be contacted are
never returned. 1 credit per page (up to 500 rows). Other plans get 402 plan_limit; GET /v1/developers/{dev}
works on every plan.
Request
curl "https://api.appgoat.ai/v1/developers?store=apple&has_email=true&min_ratings=1000" \
-H "x-api-key: $APPGOAT_API_KEY"const res = await fetch("https://api.appgoat.ai/v1/developers?store=apple&has_email=true&min_ratings=1000", {
headers: {
"x-api-key": process.env.APPGOAT_API_KEY,
},
});
const { data, meta } = await res.json();import os, requests
res = requests.get(
"https://api.appgoat.ai/v1/developers?store=apple&has_email=true&min_ratings=1000",
headers={"x-api-key": os.environ["APPGOAT_API_KEY"]}
)
body = res.json()Query parameters
store"apple" | "play"qstringName substring, exact domain or developer id.
categorystringThe developer's top category (as in the store, e.g. Productivity, GAME_PUZZLE).
countrystringDeveloper country (2-letter ISO, best effort from address / website).
min_ratingsintegerTotal ratings across the developer's apps, at least.
max_ratingsintegerTotal ratings, at most (e.g. 20000 to skip big brands).
min_installsintegerTotal Google Play installs, at least.
min_appsintegerNumber of apps they publish, at least.
max_appsintegerNumber of apps, at most (e.g. 20 for indie studios).
updated_sincestringSome app of theirs was updated in the store on or after this date.
updated_within_daysintegerSame as updated_since, relative (e.g. 365).
has_emailbooleanOnly developers with a usable scored business email.
Default false
min_email_scoreintegerOnly developers whose best email scores at least this (0-100; implies has_email). 60+ is a good outreach threshold.
sort"reach" | "ratings" | "apps" | "recent"reach = ratings + installs/100; ratings; apps; recent = most recent app update.
Default "reach"
limitintegerDefault 50
cursorstringmeta.next_cursor from the previous page.Response
200 with data: DeveloperLead[]. See the envelope for meta.
storeStoredeveloper_idstringnamestring | nullurlstring | nullDeveloper page in the store.
websitestring | nulldomainstring | nullcountrystring | nullsupport_urlstring | nullapp_countinteger | nulltotal_ratingsinteger | nulltotal_installsinteger | nulltop_categorystring | nulllast_app_updatestring | nullMost recent store update of any of their apps.
emailstring | nullBest scored business email (never personal
email_scoreinteger | null0-100 (role
email_rolestring | nullsupport, sales, press, legal, privacy or generic.
email_mx_okboolean | nullExample
{
"data": [
{
"store": "apple",
"developer_id": "string",
"name": "string",
"url": "string",
"website": "string",
"domain": "string",
"country": "us",
"support_url": "string",
"app_count": 1,
"total_ratings": 1,
"total_installs": 1,
"top_category": "string",
"last_app_update": "2026-10-22T10:00:00Z",
"email": "string",
"email_score": 1,
"email_role": "string",
"email_mx_ok": false
}
],
"meta": {
"credits_used": 1,
"credits_remaining": 9981,
"request_id": "req_123"
}
}Status codes
200
One page of developers;
meta.next_cursor for the next.A parameter is missing or invalid (
error.param names it).Missing or invalid API key.
insufficient_credits (the call costs more than you have left; nothing was done) or plan_limit (a feature of a higher plan).429
rate_limitedToo many requests per second for your plan.