> ## 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.

# List measured results

> Returns the Results ledger and scoreboard from their canonical rollups, plus analytics-attributed conversions for fixed 30 and 90 day windows. An unmeasured conversion window returns null, never zero. Only the fixed 7, 30, 90, and 365 day ledger windows are accepted.



## OpenAPI

````yaml /openapi.json get /projects/{projectId}/outcomes/ledger
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}/outcomes/ledger:
    get:
      summary: List measured results
      description: >-
        Returns the Results ledger and scoreboard from their canonical rollups,
        plus analytics-attributed conversions for fixed 30 and 90 day windows.
        An unmeasured conversion window returns null, never zero. Only the fixed
        7, 30, 90, and 365 day ledger windows are accepted.
      operationId: listOutcomesLedger
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: interventionId
          in: query
          description: >-
            Include fixed 7, 14, 30 and 90 day impact windows (citations,
            presence and answer fetches) for this completion-based measurement.
          schema:
            type: string
            format: uuid
        - name: windowDays
          in: query
          schema:
            type: integer
            default: 30
            enum:
              - 7
              - 30
              - 90
              - 365
          description: >-
            Fixed rolling window in days. Supported values are 7, 30, 90, and
            365. Defaults to 30.
        - name: cursor
          in: query
          schema:
            type: string
          description: >-
            Opaque cursor from the previous response; cursors expire after ~48
            hours.
        - name: pageSize
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 25
          description: Results per page. Capped at 100.
        - name: status
          in: query
          schema:
            type: string
            enum:
              - measured
              - in_flight
              - blind
              - unmatched_url
              - sensor_gap
              - improved
              - mixed
              - no_clear_change
              - declined
              - still_measuring
              - unmeasured
              - conclusive
      responses:
        '200':
          description: Results ledger
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/OutcomesLedgerData'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - data
                  - meta
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
components:
  schemas:
    OutcomesLedgerData:
      type: object
      properties:
        impactWindows:
          type: array
          description: >-
            Included when interventionId is supplied. Completion-based
            comparisons of citations, presence and answer fetches; unfinished or
            unsupported deltas are null. evidenceQuality grades citations and
            presence; answerFetchEvidenceQuality grades answer fetches by
            machine-sensor coverage.
          items:
            type: object
            properties:
              windowDays:
                type: integer
                enum:
                  - 7
                  - 14
                  - 30
                  - 90
              evidenceQuality:
                type: string
                enum:
                  - still_measuring
                  - observed
                  - directional
                  - unavailable
              citationDelta:
                type: number
                nullable: true
              presenceDelta:
                type: number
                nullable: true
              answerFetchEvidenceQuality:
                type: string
                enum:
                  - still_measuring
                  - observed
                  - directional
                  - unavailable
              answerFetchDelta:
                type: number
                nullable: true
                description: >-
                  Change in answer fetches per sensor-covered day, after minus
                  before.
            required:
              - windowDays
              - evidenceQuality
              - citationDelta
              - presenceDelta
              - answerFetchEvidenceQuality
              - answerFetchDelta
        attributedConversions:
          type: array
          items:
            $ref: '#/components/schemas/OutcomesAttributedConversion'
        items:
          type: array
          items:
            $ref: '#/components/schemas/OutcomesLedgerItem'
        pagination:
          $ref: '#/components/schemas/RollupCursorPagination'
        scoreboard:
          $ref: '#/components/schemas/OutcomesScoreboard'
        window:
          type: object
          properties:
            days:
              type: integer
            dateFrom:
              type: string
              format: date
            dateTo:
              type: string
              format: date
          required:
            - days
            - dateFrom
            - dateTo
      required:
        - attributedConversions
        - items
        - pagination
        - scoreboard
        - window
    Meta:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
        projectId:
          type: string
          format: uuid
    OutcomesAttributedConversion:
      type: object
      additionalProperties: false
      properties:
        attributionLabel:
          type: string
          enum:
            - GA4-attributed
            - PostHog-attributed
            - Analytics-attributed
        conversions:
          type:
            - number
            - 'null'
          minimum: 0
        dateFrom:
          type: string
          format: date
        dateTo:
          type: string
          format: date
        state:
          type: string
          enum:
            - measured
            - unmeasured
        windowDays:
          type: integer
          enum:
            - 30
            - 90
      required:
        - attributionLabel
        - conversions
        - dateFrom
        - dateTo
        - state
        - windowDays
    OutcomesLedgerItem:
      type: object
      additionalProperties: true
      properties:
        analyticsComparison:
          anyOf:
            - $ref: '#/components/schemas/AnalyticsComparison'
            - type: 'null'
        interventionId:
          type: string
          format: uuid
        actionId:
          type: string
          format: uuid
        actionTitle:
          type: string
        result:
          type:
            - string
            - 'null'
          enum:
            - improved
            - mixed
            - no_clear_change
            - declined
            - still_measuring
            - unmeasured
            - null
          description: >-
            Authoritative result. A metric moves when its count changes further
            than chance would explain: a binomial test on the combined before
            and after count, weighted by each window's exposure (all probe
            answers for cited probe answers, window length for answer fetches),
            comes in under 0.1 two-sided, the higher window holds at least 3
            across at least 3 days, and the exposure-adjusted rate moves at
            least 20%. evidence carries the counts, days, exposure and chance
            behind each metric. improved: a rise and no fall. declined: a fall
            and no rise. mixed: one metric rose and another fell.
            no_clear_change: a conclusive window where no metric moved; it is
            not a decline. Pending fetch comparisons stay still_measuring even
            when citations are complete; an established citation improvement
            remains conclusive, and becomes mixed if the answer-fetch comparison
            later closes with a material fall; a mixed result is dated at that
            fetch-window close. Open windows stay still_measuring; missing
            evidence is unmeasured. Null means the result contract is
            unavailable. Lifecycle status is preserved separately for
            compatibility.
        measuredAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Legacy lifecycle measurement timestamp; may precede the completed
            comparison window.
        resultAvailableAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Server-derived conclusive result date: the later of the complete
            daily comparison boundary and measuredAt, also including the
            recorded fetch-window close when citations did not independently
            establish an improvement. Null for non-conclusive results or an
            unavailable date. This describes the supporting comparison, not an
            audit timestamp of first observation.
        citationConfidence:
          type:
            - string
            - 'null'
        answerFetchConfidence:
          type:
            - string
            - 'null'
        citationsBefore:
          type:
            - number
            - 'null'
        citationsAfter:
          type:
            - number
            - 'null'
        citationDelta:
          type:
            - number
            - 'null'
        answerFetchesBefore:
          type:
            - number
            - 'null'
        answerFetchesAfter:
          type:
            - number
            - 'null'
        answerFetchDelta:
          type:
            - number
            - 'null'
        evidence:
          anyOf:
            - $ref: '#/components/schemas/OutcomeResultEvidence'
            - type: 'null'
          description: >-
            What the result rests on, per metric. Null for rows without a
            comparison.
      required:
        - interventionId
        - actionId
        - actionTitle
        - result
        - resultAvailableAt
    RollupCursorPagination:
      type: object
      properties:
        hasMore:
          type: boolean
        nextCursor:
          type:
            - string
            - 'null'
        pageSize:
          type: integer
          minimum: 1
          maximum: 100
        totalCount:
          type: integer
          minimum: 0
      required:
        - hasMore
        - nextCursor
        - pageSize
        - totalCount
    OutcomesScoreboard:
      type: object
      additionalProperties: true
      properties:
        conclusiveCount:
          type: integer
          minimum: 0
        improvedCount:
          type: integer
          minimum: 0
        mixedCount:
          type: integer
          minimum: 0
        noClearChangeCount:
          type: integer
          minimum: 0
        declinedCount:
          type: integer
          minimum: 0
        stillMeasuringCount:
          type: integer
          minimum: 0
        unmeasuredCount:
          type: integer
          minimum: 0
        improvementRate:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 1
          description: >-
            Improved results divided by conclusive measurements in the same
            filtered population. Null when there are none.
        combinedCitationLift:
          type: number
          description: >-
            Sum of citation deltas across citation improvements only, in
            citations/day.
      required:
        - conclusiveCount
        - improvedCount
        - mixedCount
        - noClearChangeCount
        - declinedCount
        - stillMeasuringCount
        - unmeasuredCount
        - improvementRate
        - combinedCitationLift
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string
        status:
          type: integer
      required:
        - error
        - message
        - status
    AnalyticsComparison:
      type: object
      description: >-
        One provider and conversion definition across both measured-action
        windows. Completed evidence preserves its original provenance. Measured
        values remain null without full coverage. Optional recorded counts
        preserve partial observations without percentage eligibility.
      properties:
        recorded:
          type: object
          description: >-
            Observed qualified counts from one published identity. Not complete
            measurements; null is not zero.
          properties:
            before:
              $ref: '#/components/schemas/RecordedAnalyticsCounts'
            after:
              $ref: '#/components/schemas/RecordedAnalyticsCounts'
          required:
            - before
            - after
        provider:
          type:
            - string
            - 'null'
        connectionId:
          type:
            - string
            - 'null'
        generation:
          type:
            - integer
            - 'null'
        definitionHash:
          type:
            - string
            - 'null'
        sessionsCovered:
          type: boolean
        conversionsCovered:
          type: boolean
        before:
          type: object
          properties:
            sessions:
              type:
                - number
                - 'null'
            conversions:
              type:
                - number
                - 'null'
        after:
          type: object
          properties:
            sessions:
              type:
                - number
                - 'null'
            conversions:
              type:
                - number
                - 'null'
      required:
        - provider
        - connectionId
        - generation
        - definitionHash
        - sessionsCovered
        - conversionsCovered
        - before
        - after
    OutcomeResultEvidence:
      type: object
      additionalProperties: false
      properties:
        citations:
          anyOf:
            - $ref: '#/components/schemas/OutcomeMetricEvidence'
            - type: 'null'
        answerFetches:
          anyOf:
            - $ref: '#/components/schemas/OutcomeMetricEvidence'
            - type: 'null'
        rule:
          type: object
          additionalProperties: false
          properties:
            significance:
              type: number
            minCount:
              type: number
            minActiveDays:
              type: number
            minRelativeChange:
              type: number
          required:
            - significance
            - minCount
            - minActiveDays
            - minRelativeChange
      required:
        - citations
        - answerFetches
        - rule
    RecordedAnalyticsCounts:
      type: object
      properties:
        sessions:
          type:
            - number
            - 'null'
        conversions:
          type:
            - number
            - 'null'
      required:
        - sessions
        - conversions
    OutcomeMetricEvidence:
      type: object
      additionalProperties: false
      properties:
        before:
          type:
            - number
            - 'null'
          description: >-
            Before-window count: cited probe answers for citations, requests for
            answer fetches.
        after:
          type:
            - number
            - 'null'
        beforeActiveDays:
          type:
            - number
            - 'null'
          description: >-
            Days in the window with at least one; null when the days cannot be
            counted.
        afterActiveDays:
          type:
            - number
            - 'null'
        beforeProbeAnswers:
          type:
            - number
            - 'null'
          description: All probe answers (executions) in the window. Citations only.
        afterProbeAnswers:
          type:
            - number
            - 'null'
        direction:
          type:
            - number
            - 'null'
          enum:
            - -1
            - 0
            - 1
            - null
          description: 1 rose, -1 fell, 0 no change counted.
        pValue:
          type:
            - number
            - 'null'
          description: >-
            Two-sided: how often a shift at least this large, in either
            direction, happens by chance with no real change. Null until the
            window is measured.
  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'
    NotFoundError:
      description: Not found
      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'
  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.

````