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

> ## Agent Instructions
> Internal links on these pages omit the .md extension. Append .md to a docs page URL, or send an Accept: text/markdown header, to get that page as markdown.

# Get search performance

> <Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Google clicks, impressions, CTR, position, top queries and pages from Search Console, or estimated rankings when Search Console isn't connected. Limited to 60 requests per minute per app across all six research endpoints; responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`, and a `429` carries `Retry-After`. Paid lookups also draw on a weekly per-app budget (`429 quota_exceeded` once it is used up).



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/seo/research/search-performance
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/seo/research/search-performance:
    get:
      summary: Get search performance
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Google clicks, impressions, CTR, position, top queries and pages from
        Search Console, or estimated rankings when Search Console isn't
        connected. Limited to 60 requests per minute per app across all six
        research endpoints; responses carry `X-RateLimit-Limit`,
        `X-RateLimit-Remaining` and `X-RateLimit-Reset`, and a `429` carries
        `Retry-After`. Paid lookups also draw on a weekly per-app budget (`429
        quota_exceeded` once it is used up).
      operationId: >-
        get_search_performance_api_apps__app_id__seo_research_search_performance_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app.
            title: App Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
        - name: days
          in: query
          required: false
          schema:
            type: integer
            description: Window in days, one of [7, 28, 90]. Default 28.
            default: 28
            title: Days
          description: Window in days, one of [7, 28, 90]. Default 28.
      responses:
        '200':
          description: >-
            Search Console numbers, or estimated rankings (`source:
            "estimated_rankings"`).
          content:
            application/json:
              schema: {}
              example:
                source: search_console
                days: 28
                totals:
                  clicks: 120
                  impressions: 4300
                  ctr: 0.028
                  position: 14.2
                previous_totals:
                  clicks: 98
                  impressions: 3900
                  ctr: 0.025
                  position: 15.1
                top_queries:
                  - query: game tracker
                    clicks: 30
                top_pages:
                  - page: /
                    clicks: 70
        '400':
          description: '`invalid_request`: a parameter is empty or malformed.'
          content:
            application/json:
              examples:
                invalid_request:
                  summary: invalid_request
                  value:
                    error:
                      code: invalid_request
                      message: Pass a keyword.
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '403':
          description: >-
            `engine_not_allowed`: the workspace's AI model settings block every
            engine asked.
          content:
            application/json:
              examples:
                engine_not_allowed:
                  summary: engine_not_allowed
                  value:
                    error:
                      code: engine_not_allowed
                      message: >-
                        This workspace's AI model settings block every engine
                        asked; pick another engine.
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '404':
          description: >-
            `not_found`: the app doesn't exist, or SEO research isn't enabled
            for it.
          content:
            application/json:
              examples:
                not_found:
                  summary: not_found
                  value:
                    error:
                      code: not_found
                      message: Not found
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '409':
          description: >-
            `not_set_up`: the app has no domain or search data source to look up
            yet.
          content:
            application/json:
              examples:
                not_set_up:
                  summary: not_set_up
                  value:
                    error:
                      code: not_set_up
                      message: This app has no domain to compare yet.
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '422':
          description: >-
            `invalid_request`: a required parameter is missing or the wrong
            type, or out of range. `error.details.errors` lists each problem.
          content:
            application/json:
              examples:
                invalid_request:
                  summary: invalid_request
                  value:
                    error:
                      code: invalid_request
                      message: Invalid request
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '429':
          description: >-
            `rate_limited` (request limit) or `quota_exceeded` (the app's lookup
            budget); both carry `Retry-After`.
          content:
            application/json:
              examples:
                quota_exceeded:
                  summary: quota_exceeded
                  value:
                    error:
                      code: quota_exceeded
                      message: >-
                        This app's live SEO lookups are used up for now; they
                        reset within a week.
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '503':
          description: '`unavailable`: the data provider failed; retry shortly.'
          content:
            application/json:
              examples:
                unavailable:
                  summary: unavailable
                  value:
                    error:
                      code: unavailable
                      message: Live SEO data is unavailable right now.
                      details: {}
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
      security:
        - PersonalAccessTokenAuth:
            - read_only
components:
  schemas:
    StandardErrorEnvelope:
      properties:
        error:
          $ref: '#/components/schemas/StandardError'
          description: What went wrong.
      type: object
      required:
        - error
      title: StandardErrorEnvelope
      description: The error body returned in the standard envelope.
    StandardError:
      properties:
        code:
          type: string
          title: Code
          description: >-
            Stable machine-readable cause of the failure. Match on this, not on
            `message`.
          example: not_found
        message:
          type: string
          title: Message
          description: Human-readable explanation. It isn't a stable contract.
          example: App not found
        details:
          additionalProperties: true
          type: object
          title: Details
          description: >-
            Structured context for the failure, or an empty object when there's
            none.
          example: {}
      type: object
      required:
        - code
        - message
      title: StandardError
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: >-
        Personal access token, sent as `Authorization: Bearer <token>`. Each
        operation lists the permission it needs: `read_only` or `full_access`. A
        full-access token can call every operation. A read-only token can call
        only the operations that list `read_only`; anything else returns 403
        `read_only_credential_route_not_allowed`.

````

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