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

# Update recommendations

> Re-check this brand's recommendations against its latest AI answers, the same update as the dashboard's Check for updates button.

Recommendations are built from the answers to your prompts, which come in once a day, so a brand can be updated once every 24 hours; sooner returns `429` with `Retry-After`. Recommendations also update by themselves when they are more than a week old and someone opens the Recommendations page. `mode: more` instead checks more pages for outreach, up to 3 times a day.

Returns straight away with `poll_after` and a `poll` path; the update takes a few minutes. Poll the recommendations list and treat it as finished once `last_seen_at` is later than `poll_after`.



## OpenAPI

````yaml /openapi.json post /v1/brands/{id}/recommendations/generate
openapi: 3.1.0
info:
  title: Geoptie API
  version: 1.0.0
  summary: Read and manage your AI-search visibility data.
  description: >-
    Everything the Geoptie dashboard can do, over HTTP.


    **Authentication.** Every request needs an API key as `Authorization: Bearer
    <key>`, and the workspace must have an active or trialing subscription. Keys
    are created in the dashboard and scoped to one workspace.


    **Pagination** is cursor-based. Pass `next_cursor` back as `cursor` and stop
    when `has_more` is false. The cursor is opaque; do not parse it.


    **Dates** are ISO 8601. `from` is inclusive, `to` is exclusive. Omitting
    both gives the last 30 days.


    **Limits** exist to stop runaway clients, not to meter you: there is no
    monthly request ceiling. Every response carries `X-RateLimit-*`, and
    endpoints that spend money carry `X-Endpoint-*` as well. A 429 names which
    limit was hit.


    **Errors** always carry a stable `error.code`. Match on that, never on the
    message text. A verb that an endpoint does not declare returns 405
    `method_not_allowed`.
  contact:
    name: Geoptie support
    email: support@geoptie.com
servers:
  - url: https://api.geoptie.com
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Brands
    description: The brands you track. A brand owns its prompts, engines and country.
  - name: Prompts
    description: >-
      The questions you track across engines, the answers they returned, and the
      brands named in those answers. Plan limits apply to how many you can
      track.
  - name: Visibility
    description: How often and how prominently a brand appears in engine answers.
  - name: Citations
    description: Which pages engines cited when answering your prompts.
  - name: Competitors
    description: >-
      Your share of voice against the other brands appearing in your prompts,
      the tracked set that share of voice is computed over, and per-competitor
      trends.
  - name: Topics
    description: Optional grouping for prompts within a brand.
  - name: Recommendations
    description: Generated actions for improving visibility, and their lifecycle.
  - name: Audit reports
    description: On-demand GEO analysis of a single URL.
  - name: Content generations
    description: >-
      New articles, written from the pages engines already cite for the prompts
      you track. Research a brief first, then write the article from it.
  - name: Content optimizations
    description: >-
      Pages you already have, scored for AI search with the specific changes
      that would raise the score.
paths:
  /v1/brands/{id}/recommendations/generate:
    post:
      tags:
        - Recommendations
      summary: Update recommendations
      description: >-
        Re-check this brand's recommendations against its latest AI answers, the
        same update as the dashboard's Check for updates button.


        Recommendations are built from the answers to your prompts, which come
        in once a day, so a brand can be updated once every 24 hours; sooner
        returns `429` with `Retry-After`. Recommendations also update by
        themselves when they are more than a week old and someone opens the
        Recommendations page. `mode: more` instead checks more pages for
        outreach, up to 3 times a day.


        Returns straight away with `poll_after` and a `poll` path; the update
        takes a few minutes. Poll the recommendations list and treat it as
        finished once `last_seen_at` is later than `poll_after`.
      operationId: generateRecommendations
      parameters:
        - name: id
          in: path
          required: true
          description: Brand id.
          schema:
            type: string
            format: uuid
          example: b7c1e5a0-4f3d-42a8-9c6b-1e8d5a2f7043
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  type: string
                  enum:
                    - refresh
                    - more
                  default: refresh
                  description: >-
                    `refresh` re-checks everything. `more` checks more pages for
                    outreach.
      responses:
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/RecommendationRunAccepted'
        '400':
          $ref: '#/components/responses/E400'
        '401':
          $ref: '#/components/responses/E401'
        '402':
          $ref: '#/components/responses/E402'
        '403':
          $ref: '#/components/responses/E403'
        '404':
          $ref: '#/components/responses/E404'
        '429':
          $ref: '#/components/responses/E429'
        '500':
          $ref: '#/components/responses/E500'
components:
  schemas:
    RecommendationRunAccepted:
      type: object
      properties:
        brand_id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - generating
        mode:
          type: string
          enum:
            - refresh
            - more
        poll_after:
          type: string
          format: date-time
          description: >-
            The completion watermark. Poll `poll` and treat the run as finished
            once the recommendations' `last_seen_at` is later than this.
        poll:
          type: string
          description: Path to poll for the result.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Stable machine code. Match on this, not the message.
            message:
              type: string
  responses:
    E400:
      description: >-
        Bad request. `missing_parameter`, `invalid_request`, `invalid_engine` or
        `invalid_date`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E401:
      description: '`missing_api_key` or `invalid_api_key`.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E402:
      description: >-
        `subscription_required`. The workspace has no active or trialing
        subscription.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E403:
      description: '`plan_not_eligible` or `forbidden`.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E404:
      description: '`not_found`. Also returned for records belonging to another workspace.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E429:
      description: >-
        `rate_limited`, `quota_exceeded`, `endpoint_rate_limited` or
        `concurrency_limited`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E500:
      description: '`internal_error`. Quote the `X-Request-Id` when reporting it.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Your API key, e.g. `Authorization: Bearer gp_live_...`.'

````

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