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

# Get search rollup totals

> Returns materialized fixed-window Google Search Console, legacy GA4, or selected analytics provider rollup totals. Missing or stale freshness pointers serve the last published rollup with its own dates. Retained evidence has availability partial, isCurrent false and compatibility status unmeasured; asOfDate identifies its publication. Never-published projects return unavailable coverage and null totals. GSC uses Pacific source days ending three days before today, with coverage capped by the age of days at the last successful sync. Current totals require every non-paused, non-disconnected current contributor to cover the full requested window. Stale published totals remain visible but are not current evidence or verified comparisons. Coverage is reported per contributor. measurement.availability and explanation distinguish unavailable verification, partial evidence, verified zero, and fully measured totals. The analytics source additionally returns paginated daily session rows; limit (default 25, maximum 100) and offset apply only to those rows. Pass pagination.generation on every continuation. Imports, provider changes and UTC midnight invalidate continuations and require restarting at offset 0. Use the returned source window dates; storedData bounds are row-presence evidence, not proof of continuous coverage.



## OpenAPI

````yaml /openapi.json get /projects/{projectId}/traffic/search-rollups
openapi: 3.1.0
info:
  title: DevTune API
  version: 2.0.0
  description: >-
    API for programmatic access to your AI visibility data, webhook
    subscriptions, and automation workflows. Use this API to integrate DevTune
    data into CI/CD pipelines, BI tools, AI agents, and operational systems.
servers:
  - url: https://devtune.ai/api/v2
    description: Production
security:
  - bearerAuth: []
paths:
  /projects/{projectId}/traffic/search-rollups:
    get:
      summary: Get search rollup totals
      description: >-
        Returns materialized fixed-window Google Search Console, legacy GA4, or
        selected analytics provider rollup totals. Missing or stale freshness
        pointers serve the last published rollup with its own dates. Retained
        evidence has availability partial, isCurrent false and compatibility
        status unmeasured; asOfDate identifies its publication. Never-published
        projects return unavailable coverage and null totals. GSC uses Pacific
        source days ending three days before today, with coverage capped by the
        age of days at the last successful sync. Current totals require every
        non-paused, non-disconnected current contributor to cover the full
        requested window. Stale published totals remain visible but are not
        current evidence or verified comparisons. Coverage is reported per
        contributor. measurement.availability and explanation distinguish
        unavailable verification, partial evidence, verified zero, and fully
        measured totals. The analytics source additionally returns paginated
        daily session rows; limit (default 25, maximum 100) and offset apply
        only to those rows. Pass pagination.generation on every continuation.
        Imports, provider changes and UTC midnight invalidate continuations and
        require restarting at offset 0. Use the returned source window dates;
        storedData bounds are row-presence evidence, not proof of continuous
        coverage.
      operationId: getSearchRollups
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: source
          in: query
          required: true
          schema:
            type: string
            enum:
              - gsc
              - ga4
              - analytics
        - name: windowDays
          in: query
          schema:
            type: integer
            enum:
              - 30
              - 90
            default: 30
          description: >-
            Fixed rolling window in days. Supported values are 30 and 90.
            Defaults to 30.
        - name: generation
          in: query
          schema:
            type: string
            minLength: 1
            maxLength: 128
          description: >-
            Required with analytics offsets after the first page; use
            pagination.generation.
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 25
          description: Daily analytics rows per page; ignored for other sources.
        - name: offset
          in: query
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Daily analytics row offset; ignored for other sources.
      responses:
        '200':
          description: Search rollup totals and measurement coverage
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      source:
                        type: string
                        enum:
                          - gsc
                          - ga4
                          - analytics
                      items:
                        type: array
                        description: >-
                          Daily aggregate rows, present for source analytics.
                          Row presence does not establish complete window
                          coverage.
                        items:
                          type: object
                          properties:
                            source:
                              type: string
                              enum:
                                - analytics
                            id:
                              type: string
                            day_bucket:
                              type: string
                              format: date
                            domain_canonical:
                              type: string
                            landing_page_path:
                              type: string
                            source_class:
                              type:
                                - string
                                - 'null'
                            llm_platform:
                              type:
                                - string
                                - 'null'
                            sessions:
                              type: integer
                            engaged_sessions:
                              type:
                                - integer
                                - 'null'
                            synced_at:
                              type: string
                              format: date-time
                          required:
                            - source
                            - id
                            - day_bucket
                            - domain_canonical
                            - landing_page_path
                            - source_class
                            - llm_platform
                            - sessions
                            - engaged_sessions
                            - synced_at
                      pagination:
                        type: object
                        description: Present for source analytics.
                        properties:
                          hasMore:
                            type: boolean
                          limit:
                            type: integer
                          offset:
                            type: integer
                          nextOffset:
                            type:
                              - integer
                              - 'null'
                          generation:
                            type: string
                        required:
                          - hasMore
                          - limit
                          - offset
                          - nextOffset
                          - generation
                      aggregates:
                        oneOf:
                          - type: object
                            properties:
                              avgPosition:
                                type:
                                  - number
                                  - 'null'
                              clicks:
                                type:
                                  - integer
                                  - 'null'
                              ctr:
                                type:
                                  - number
                                  - 'null'
                              impressions:
                                type:
                                  - integer
                                  - 'null'
                              measurement:
                                $ref: '#/components/schemas/GscMeasurement'
                            required:
                              - avgPosition
                              - clicks
                              - ctr
                              - impressions
                              - measurement
                          - type: object
                            properties:
                              engagedSessions:
                                type:
                                  - integer
                                  - 'null'
                              measurement:
                                type: object
                                properties:
                                  availability:
                                    type: string
                                    enum:
                                      - unavailable
                                      - partial
                                      - verified_zero
                                      - measured
                                    description: >-
                                      Distinguishes missing verification,
                                      partial evidence, verified zero, and
                                      complete totals. Partial evidence never
                                      unlocks full-window totals.
                                  explanation:
                                    type: string
                                  contributors:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        connectionId:
                                          type: string
                                          format: uuid
                                        generation:
                                          type: integer
                                        status:
                                          type: string
                                        coverageFrom:
                                          type:
                                            - string
                                            - 'null'
                                          format: date
                                        coverageThrough:
                                          type:
                                            - string
                                            - 'null'
                                          format: date
                                      required:
                                        - connectionId
                                        - generation
                                        - status
                                        - coverageFrom
                                        - coverageThrough
                                  coverageFrom:
                                    type:
                                      - string
                                      - 'null'
                                    format: date
                                  coverageThrough:
                                    type:
                                      - string
                                      - 'null'
                                    format: date
                                  status:
                                    type: string
                                    enum:
                                      - measured
                                      - unmeasured
                                required:
                                  - availability
                                  - explanation
                                  - contributors
                                  - coverageFrom
                                  - coverageThrough
                                  - status
                              sessions:
                                type:
                                  - integer
                                  - 'null'
                            required:
                              - engagedSessions
                              - measurement
                              - sessions
                      window:
                        type: object
                        properties:
                          days:
                            type: integer
                            enum:
                              - 30
                              - 90
                          dateFrom:
                            type: string
                            format: date
                          dateTo:
                            type: string
                            format: date
                        required:
                          - days
                          - dateFrom
                          - dateTo
                    required:
                      - aggregates
                      - source
                      - window
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - data
                  - meta
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  schemas:
    GscMeasurement:
      type: object
      required:
        - availability
        - status
        - isCurrent
        - asOfDate
        - explanation
        - contributors
        - coveredRanges
        - storedEvidence
        - sourceDateFrom
        - sourceDateTo
        - finalityBoundary
      properties:
        availability:
          type: string
          enum:
            - unavailable
            - partial
            - verified_zero
            - measured
        status:
          type: string
          enum:
            - unmeasured
            - measured
          description: Compatibility field. Use availability when reporting evidence.
        isCurrent:
          type: boolean
          description: >-
            False when serving a retained publication after invalidation or
            source-boundary aging, or before first publication.
        asOfDate:
          type:
            - string
            - 'null'
          format: date-time
          description: Timestamp of the published source snapshot, when available.
        explanation:
          type: string
        coverageFrom:
          type:
            - string
            - 'null'
          format: date
        coverageThrough:
          type:
            - string
            - 'null'
          format: date
        sourceDateFrom:
          type:
            - string
            - 'null'
          format: date
        sourceDateTo:
          type:
            - string
            - 'null'
          format: date
        finalityBoundary:
          type:
            - string
            - 'null'
          format: date
          description: >-
            Published Pacific finality boundary, shared by current and prior
            periods. A retained snapshot keeps its original boundary.
        contributors:
          type: array
          items:
            type: object
            additionalProperties: true
        coveredRanges:
          type: array
          description: >-
            Clipped verified ranges per contributor. Overlap does not establish
            full project coverage.
          items:
            type: object
            properties:
              connectionId:
                type:
                  - string
                  - 'null'
              dateFrom:
                type: string
                format: date
              dateTo:
                type: string
                format: date
        storedEvidence:
          type: array
          description: >-
            Stored row-presence bounds, including legacy and historical
            generations. Excluded from verified totals.
          items:
            type: object
            additionalProperties: true
    Meta:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
        projectId:
          type: string
          format: uuid
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string
        status:
          type: integer
      required:
        - error
        - message
        - status
  responses:
    BadRequestError:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnauthorizedError:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ForbiddenError:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimitExceededError:
      description: Rate limit exceeded
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServerError:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  headers:
    X-RateLimit-Limit:
      description: Maximum requests per window
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests remaining in current window
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Unix timestamp when the window resets
      schema:
        type: integer
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key with dtk_live_ prefix. Obtain it from API Keys in the account
        sidebar. New keys start with all supported scopes selected for the
        chosen project, and you can narrow them to specific read/write scopes as
        needed.

````

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