Find app ideas - niches ranked by opportunity score (demand, weak incumbents, competition, monetization, trend).

GEThttps://api.appgoat.ai/v1/opportunities
50 creditsoperationId listOpportunities

Use this when a user wants to know what app to build, or how attractive a niche is. Every niche of the App Store and Google Play (an AI taxonomy of the catalog, e.g. "ADHD habit tracker") is scored weekly from 0 to 100 per store and country: demand (30%: popularity of the niche's search keywords + ratings the niche holds), supply_gap (30%: incumbents' rating, apps not updated for a year, a fragmented market, unhappy reviews), competition (20%: ease, from keyword difficulty and the number of apps with 100k+ ratings), monetization (10%: incumbents selling IAP / paid, top-grossing chart presence) and trend (10%: ratings growth, share won by apps released in the last 2 years). Every component lists its signals with the raw values; a signal without data is left out and confidence (0–1) drops. Each item has the niche's top keywords (popularity, difficulty), its incumbents and their complaints from AI-tagged reviews; the top 10 per store in the US also carry an analyst headline and thesis. Filter by niche (id, slug or words like habit tracker) or category; page with cursor. Then use GET /v1/keywords on top_keywords and GET /v1/apps/{app} on incumbents to dig deeper. A page with no results costs nothing.

Request

curl "https://api.appgoat.ai/v1/opportunities" \
  -H "x-api-key: $APPGOAT_API_KEY"

Query parameters

nichestring
A niche id, slug (health-fitness/adhd-habit-tracker) or words matched against niche names (habit tracker).
categorystring
Store category: App Store name (Health & Fitness, or health-fitness) or Play category (HEALTH_AND_FITNESS).
store"apple" | "play"
Default both stores.
countrystring
ISO country code. Every niche is scored in us; other markets where its keywords are measured (gb, de, …).

Default "us"

min_scoreinteger
sort"score" | "demand" | "supply_gap" | "competition" | "monetization" | "trend" | "confidence"
Total score, one component, or confidence.

Default "score"

weekstring
The ranking as of this date (ISO; the latest weekly computation on or before it). Default the latest.
limitinteger

Default 20

cursorstring
meta.next_cursor from the previous page.
fieldsstring
Comma list of top-level fields to return (identifiers are always kept), e.g. title,rating,version.

Response

200 with data: Opportunity[]. See the envelope for meta.

idinteger
rankinteger
nicheobject
niche.idinteger
niche.slugstring
niche.labelstring
niche.descriptionstring | null
niche.categorystring | null
storeStore
countrystring
weekstring
scorenumber
0–100.
confidencenumber
0–1; low = few signals had data.
app_countinteger
Apps in the niche.
headlinestring | null
Analyst headline (top 10 per store in the US).
thesisstring | null
One-paragraph analyst thesis (top 10 per store in the US).
componentsobject
components.demandOpportunityComponent
components.supply_gapOpportunityComponent
components.competitionOpportunityComponent
components.monetizationOpportunityComponent
components.trendOpportunityComponent
top_keywordsobject[]
top_keywords[].termstring
top_keywords[].popularityinteger | null
top_keywords[].difficultyinteger | null
top_keywords[].source"serp" | "seed"
serp = the niche holds ≥ 3 of its top 10; seed = a taxonomy search term.
top_keywords[].niche_sharenumber
incumbentsobject[]
incumbents[].app_idstring
incumbents[].titlestring | null
incumbents[].developer_namestring | null
incumbents[].icon_urlstring | null
incumbents[].ratingnumber | null
incumbents[].ratings_countinteger | null
incumbents[].updated_atstring | null
incumbents[].days_since_updateinteger | null
incumbents[].released_atstring | null
incumbents[].has_iapboolean | null
incumbents[].iap_pricesstring[]
Up to 4 in-app purchases as "name: price" (App Store).
incumbents[].pricenumber | null
incumbents[].in_top_grossingboolean
complaintsobject[]
Topics / intents of the incumbents' negative AI-tagged reviews.
complaints[].labelstring
complaints[].reviewsinteger
statsobject
Example
{
  "data": [
    {
      "id": 1,
      "rank": 1,
      "niche": {
        "id": 1,
        "slug": "health-fitness/adhd-habit-tracker",
        "label": "ADHD habit tracker",
        "description": "string",
        "category": "string"
      },
      "store": "apple",
      "country": "us",
      "week": "2026-10-22",
      "score": 4.5,
      "confidence": 4.5,
      "app_count": 1,
      "headline": "string",
      "thesis": "string",
      "components": {
        "demand": {},
        "supply_gap": {},
        "competition": {},
        "monetization": {},
        "trend": {}
      },
      "top_keywords": [
        {}
      ],
      "incumbents": [
        {}
      ],
      "complaints": [
        {}
      ],
      "stats": {}
    }
  ],
  "meta": {
    "credits_used": 50,
    "credits_remaining": 9981,
    "request_id": "req_123"
  }
}

Status codes

200
Ranked niches (meta.week = the Monday of the computation).
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).
Not found.
Too many requests per second for your plan.