> ## Documentation Index
> Fetch the complete documentation index at: https://docs.asobeast.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List the keywords an app ranks for or could rank for that it does not track

> Reads stored rows only and reaches no store. A weekly job and a manual refresh build the list from the listing of each market, the home titles and subtitles of competitors, review phrases, Apple popularity weeks for the genre of the app and the phrases the workspace tracks for other apps, leaving out what the app tracks, active or paused, and what was dismissed. position is 1 based; null with a depth means checked and not found within that depth, and a null depth means never checked. depth 50 comes from another search of the phrase today or yesterday, 200 from the search of the app itself. state is ranked when the app has a position, opportunity when it has none, relevance is at least 60 and opportunity at least 35, and open otherwise. traffic and difficulty come from a score some tracker already produced, or, for an unscored App Store term, from the popularity Apple lists; a discovery is never scored, so opportunity is null until the keyword has a score. recommended marks the first 50 rows in list order and counts cover every open row of the requested market, whatever the state filter and the limit. unfit is the number of ranked rows that did not fit the plan while auto track is on. checks reports the weekly cap of searches, how many were queued this ISO week, how many are still waiting, the day of the newest check and the next weekly run, null when the schedule is off.



## OpenAPI

````yaml /api-reference/openapi.json get /apps/{id}/keyword-discoveries
openapi: 3.0.0
info:
  title: asobeast API
  description: >-
    Self hosted ASO toolkit API.


    A metered instance carries RateLimit-Limit, RateLimit-Remaining and
    RateLimit-Reset on every response, for the tightest limit the request
    touched. A self hosted instance has no request rate limits and sends no such
    header. Limits are per workspace, so minting more tokens does not buy more
    capacity, and they are sized per plan across three classes: read for stored
    data, write for configuration changes and store for the endpoints that reach
    the App Store or Google Play.


    A 429 carries Retry-After and a rateLimit object naming the window that
    closed, or an aiAllowance object when the workspace has spent the AI calls
    its plan includes this month. A 403 with a quota object means a plan
    capacity limit such as apps or tracked keyword markets, which is a different
    problem from a rate limit. A 402 with an entitlement object means the
    workspace needs a plan.


    Positions are 1-based and null means checked but not found within the
    captured depth, never zero. Daily granularity uses UTC dates.
  version: 1.15.0
  contact: {}
servers:
  - url: http://localhost:3000/api/backend
    description: Web origin proxy
  - url: http://localhost:4000
    description: Direct API
security:
  - personalApiToken: []
tags: []
paths:
  /apps/{id}/keyword-discoveries:
    get:
      tags:
        - keywords
      summary: >-
        List the keywords an app ranks for or could rank for that it does not
        track
      description: >-
        Reads stored rows only and reaches no store. A weekly job and a manual
        refresh build the list from the listing of each market, the home titles
        and subtitles of competitors, review phrases, Apple popularity weeks for
        the genre of the app and the phrases the workspace tracks for other
        apps, leaving out what the app tracks, active or paused, and what was
        dismissed. position is 1 based; null with a depth means checked and not
        found within that depth, and a null depth means never checked. depth 50
        comes from another search of the phrase today or yesterday, 200 from the
        search of the app itself. state is ranked when the app has a position,
        opportunity when it has none, relevance is at least 60 and opportunity
        at least 35, and open otherwise. traffic and difficulty come from a
        score some tracker already produced, or, for an unscored App Store term,
        from the popularity Apple lists; a discovery is never scored, so
        opportunity is null until the keyword has a score. recommended marks the
        first 50 rows in list order and counts cover every open row of the
        requested market, whatever the state filter and the limit. unfit is the
        number of ranked rows that did not fit the plan while auto track is on.
        checks reports the weekly cap of searches, how many were queued this ISO
        week, how many are still waiting, the day of the newest check and the
        next weekly run, null when the schedule is off.
      operationId: KeywordDiscoveryController_list
      parameters:
        - name: id
          required: true
          in: path
          schema:
            type: string
        - name: country
          required: false
          in: query
          schema:
            type: string
            example: de
            pattern: ^[a-z]{2}$
        - name: state
          required: false
          in: query
          schema:
            default: all
            type: string
            enum:
              - all
              - ranked
              - opportunity
        - name: limit
          required: false
          in: query
          schema:
            minimum: 1
            maximum: 500
            default: 200
            type: number
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
components:
  securitySchemes:
    personalApiToken:
      scheme: bearer
      bearerFormat: asob
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.