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

# Get Competitor Seo Position History

> Per-keyword position over time for one competitor, from stored captures.

Read-only over data the weekly acquisition already bought — this route
never triggers a fetch, so opening it cannot cost a DataForSEO call.



## OpenAPI

````yaml /openapi.json get /api/v1/brands/{brand_id}/dashboards/competitor-seo/position-history
openapi: 3.1.0
info:
  title: AITasker
  version: 0.1.0
servers: []
security: []
paths:
  /api/v1/brands/{brand_id}/dashboards/competitor-seo/position-history:
    get:
      tags:
        - Dashboards
        - Dashboards
      summary: Get Competitor Seo Position History
      description: |-
        Per-keyword position over time for one competitor, from stored captures.

        Read-only over data the weekly acquisition already bought — this route
        never triggers a fetch, so opening it cannot cost a DataForSEO call.
      operationId: >-
        get_competitor_seo_position_history_api_v1_brands__brand_id__dashboards_competitor_seo_position_history_get
      parameters:
        - name: brand_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            title: Brand Id
        - name: competitor
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            description: competitor domain
            title: Competitor
          description: competitor domain
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompetitorSeoPositionHistoryResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
components:
  schemas:
    CompetitorSeoPositionHistoryResponse:
      properties:
        competitor_domain:
          type: string
          title: Competitor Domain
        available:
          type: boolean
          title: Available
          default: false
        unavailable_reason:
          anyOf:
            - type: string
              enum:
                - insufficient_captures
                - no_usable_ranks
            - type: 'null'
          title: Unavailable Reason
        captured_ats:
          items:
            type: string
            format: date-time
          type: array
          title: Captured Ats
        keywords:
          items:
            $ref: '#/components/schemas/SeoKeywordPositionHistory'
          type: array
          title: Keywords
        total_keywords_seen:
          type: integer
          title: Total Keywords Seen
          default: 0
        any_capture_capped:
          type: boolean
          title: Any Capture Capped
          default: false
        estimate_notice:
          type: string
          title: Estimate Notice
          default: ''
      type: object
      required:
        - competitor_domain
      title: CompetitorSeoPositionHistoryResponse
      description: |-
        Per-keyword position over time for ONE competitor domain.

        Empty `keywords` with `available=False` is explained by
        ``unavailable_reason`` — NOT interpreted as "nothing moved".
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    SeoKeywordPositionHistory:
      properties:
        keyword:
          type: string
          title: Keyword
        search_volume:
          anyOf:
            - type: integer
            - type: 'null'
          title: Search Volume
        points:
          items:
            $ref: '#/components/schemas/SeoPositionPoint'
          type: array
          title: Points
        first_position:
          anyOf:
            - type: integer
            - type: 'null'
          title: First Position
        last_position:
          anyOf:
            - type: integer
            - type: 'null'
          title: Last Position
        net_delta:
          anyOf:
            - type: integer
            - type: 'null'
          title: Net Delta
        has_gap:
          type: boolean
          title: Has Gap
          default: false
      type: object
      required:
        - keyword
      title: SeoKeywordPositionHistory
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    SeoPositionPoint:
      properties:
        captured_at:
          type: string
          format: date-time
          title: Captured At
        position:
          anyOf:
            - type: integer
            - type: 'null'
          title: Position
        observed:
          type: boolean
          title: Observed
          default: false
        sample_capped:
          type: boolean
          title: Sample Capped
          default: false
      type: object
      required:
        - captured_at
      title: SeoPositionPoint
      description: One keyword's standing at one capture.
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````