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

# Builder user journey economics

> Lifetime economics of the builder's trailing-year acquisition cohort (wallets with 3+ attributed fills): average and median revenue per wallet, concentration (avg/median), median days from first fill to peak-revenue day and to 50% and 75% of lifetime revenue, and where users peak (before day 7, days 7-30, after day 30). Answers how fast and how unevenly a builder monetizes new users. BREAKING (2026-08-28): avgRevenueUsd, medianRevenueUsd, concentration, and every avgDays/medianDays field are now NULLABLE and serve null when users = 0 (no qualifying cohort). They previously served 0, which clients could not distinguish from a cohort that genuinely earned nothing. Counts (users, peakDayDistribution) are unchanged and still serve 0.



## OpenAPI

````yaml /api-reference/openapi.json get /api/public/v1/builders/{builder}/journey
openapi: 3.1.0
info:
  title: coinversa-api
  version: 0.1.0
servers:
  - url: https://api.coinversa.ai
    description: Production
security: []
paths:
  /api/public/v1/builders/{builder}/journey:
    get:
      tags:
        - Builder Analytics
      summary: Builder user journey economics
      description: >-
        Lifetime economics of the builder's trailing-year acquisition cohort
        (wallets with 3+ attributed fills): average and median revenue per
        wallet, concentration (avg/median), median days from first fill to
        peak-revenue day and to 50% and 75% of lifetime revenue, and where users
        peak (before day 7, days 7-30, after day 30). Answers how fast and how
        unevenly a builder monetizes new users. BREAKING (2026-08-28):
        avgRevenueUsd, medianRevenueUsd, concentration, and every
        avgDays/medianDays field are now NULLABLE and serve null when users = 0
        (no qualifying cohort). They previously served 0, which clients could
        not distinguish from a cohort that genuinely earned nothing. Counts
        (users, peakDayDistribution) are unchanged and still serve 0.
      operationId: get-api-public-v1-builders-by-builder-journey
      parameters:
        - description: Builder address (0x-hex)
          in: path
          name: builder
          required: true
          schema:
            description: Builder address (0x-hex)
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BuilderJourneyBody'
          description: OK
        '400':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/APIError'
          description: Bad Request
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/APIError'
          description: Unauthorized
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/APIError'
          description: Unprocessable Entity
        '429':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/APIError'
          description: Too Many Requests
        '500':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/APIError'
          description: Internal Server Error
        '504':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/APIError'
          description: Gateway Timeout
      security:
        - apiKey: []
components:
  schemas:
    BuilderJourneyBody:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
            - https://api.coinversa.ai/schemas/BuilderJourneyBody.json
          format: uri
          readOnly: true
          type: string
        avgRevenueUsd:
          description: >-
            Mean lifetime attributed builder fees per qualifying wallet; null
            when there is no qualifying cohort (users = 0). Null means unknown,
            never zero
          format: double
          type:
            - number
            - 'null'
        builder:
          type: string
        builderName:
          description: Known display name for the builder; omitted if unknown
          type: string
        concentration:
          description: >-
            avgRevenueUsd / medianRevenueUsd — how whale-skewed per-user revenue
            is (1 = evenly spread). Null when there is no qualifying cohort, and
            also when the median is 0 (the ratio is undefined)
          format: double
          type:
            - number
            - 'null'
        dataNotes:
          type: string
        daysToHalfRevenue:
          $ref: '#/components/schemas/BuilderJourneyDays'
          description: >-
            Days from first fill to the day cumulative attributed fees first
            reached 50% of the wallet's lifetime total
        daysToPeak:
          $ref: '#/components/schemas/BuilderJourneyDays'
          description: >-
            Days from a wallet's first attributed fill to its single
            highest-revenue day (earliest such day on fee ties)
        daysToThreeQuartersRevenue:
          $ref: '#/components/schemas/BuilderJourneyDays'
          description: >-
            Days from first fill to the day cumulative attributed fees first
            reached 75% of the wallet's lifetime total
        medianRevenueUsd:
          description: >-
            Median lifetime attributed builder fees per qualifying wallet; null
            when there is no qualifying cohort (users = 0). Null means unknown,
            never zero
          format: double
          type:
            - number
            - 'null'
        minFills:
          description: >-
            Inclusion floor: wallets need >= this many lifetime attributed fills
            (fixed at 3 so one-shot wallets don't define days-to-peak as
            trivially zero)
          format: int32
          type: integer
        peakDayDistribution:
          $ref: '#/components/schemas/BuilderJourneyPeakDistribution'
          description: Qualifying wallets bucketed by when their peak-revenue day landed
        users:
          description: >-
            Wallets the journey stats are computed over — those whose first
            builder-fee order via this builder was within the last 365 days and
            with at least minFills lifetime attributed fills (see dataNotes)
          format: int32
          type: integer
        verified:
          $ref: '#/components/schemas/BuilderStamp'
      required:
        - builder
        - users
        - minFills
        - avgRevenueUsd
        - medianRevenueUsd
        - concentration
        - daysToPeak
        - daysToHalfRevenue
        - daysToThreeQuartersRevenue
        - peakDayDistribution
        - dataNotes
      type: object
    APIError:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
            - https://api.coinversa.ai/schemas/APIError.json
          format: uri
          readOnly: true
          type: string
        code:
          description: Machine-readable error code
          type: string
        current_tier:
          description: Caller's effective tier
          type: string
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        required_tier:
          description: Minimum tier for this operation
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
        upgrade_url:
          description: Where to upgrade
          type: string
      type: object
    BuilderJourneyDays:
      additionalProperties: false
      properties:
        avgDays:
          description: >-
            Mean across qualifying wallets; null when there is no qualifying
            cohort (users = 0) — an absence of data, not a zero
          format: double
          type:
            - number
            - 'null'
        medianDays:
          description: >-
            Median across qualifying wallets; null when there is no qualifying
            cohort (users = 0) — an absence of data, not a zero
          format: double
          type:
            - number
            - 'null'
      required:
        - avgDays
        - medianDays
      type: object
    BuilderJourneyPeakDistribution:
      additionalProperties: false
      properties:
        from7To30d:
          description: Peak-revenue day 7 to 30 days (inclusive) after the first fill
          format: int32
          type: integer
        over30d:
          description: Peak-revenue day more than 30 days after the first fill
          format: int32
          type: integer
        under7d:
          description: >-
            Wallets whose peak-revenue day came less than 7 days after their
            first fill
          format: int32
          type: integer
      required:
        - under7d
        - from7To30d
        - over30d
      type: object
    BuilderStamp:
      additionalProperties: false
      properties:
        coverage:
          $ref: '#/components/schemas/BuilderCoverage'
          description: >-
            Attribution coverage vs the ledger; null until the coverage pipeline
            is provisioned
        ledger_block:
          description: >-
            Latest block in HL's builder-fee ledger this data was verified
            against
          format: int64
          type: integer
        ledger_chain_time:
          description: Chain timestamp of that ledger entry (RFC3339)
          type: string
      required:
        - ledger_block
        - ledger_chain_time
        - coverage
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    BuilderCoverage:
      additionalProperties: false
      properties:
        attributed_fees_usd:
          description: Join-attributed fees in the rollup window
          format: double
          type: number
        computed_at:
          description: When the rollup was computed (RFC3339)
          type: string
        ledger_fees_usd:
          description: Exact ledger revenue in the rollup window
          format: double
          type: number
        ratio:
          description: >-
            attributed_fees / ledger_fees — the share of revenue the fill-level
            metrics account for
          format: double
          type: number
        window_end:
          description: End of that window (RFC3339)
          type: string
        window_start:
          description: Start of the window the coverage rollup was computed over (RFC3339)
          type: string
      required:
        - window_start
        - window_end
        - ledger_fees_usd
        - attributed_fees_usd
        - ratio
        - computed_at
      type: object
  securitySchemes:
    apiKey:
      description: Get one at https://coinversa.ai/developers
      in: header
      name: X-API-Key
      type: apiKey

````