---

# This file is used both to generate API docs and as the source for schema
# definitions. Note that OpenAPI has a concept of component schemas that is
# very similar to, but not quite JSON Schema. We use a standard jsonschema
# validation library in this codebase, so we need to be careful to keep the
# schema definitions here to the subset supported by both JSON schema and
# OpenAPI. There are some comments below to describe the few places where
# that becomes an issue.

# Docs for supported keywords:
# https://swagger.io/docs/specification/data-models/keywords/

# Docs for ReDoc-specific keywords (x-*):
# https://github.com/Redocly/redoc#configuration

openapi: "3.0.3"

info:
  title: "Probe-Info Service API"
  description: |
    Mozilla's [probe-scraper machinery](https://github.com/mozilla/probe-scraper)
    stores its output as JSON files in S3, exposed to the web under
    probeinfo.telemetry.mozilla.org. These API docs are automatically
    generated from the schema definitions in probe-scraper.

servers:
  - url: https://probeinfo.telemetry.mozilla.org

tags:
  - name: library
    x-displayName: The repositories.yaml Library Format
    description: |
      <SchemaDefinition schemaRef="#/components/schemas/LibraryYaml" />
  - name: application
    x-displayName: The repositories.yaml Application Format
    description: |
      <SchemaDefinition schemaRef="#/components/schemas/ApplicationYaml" />
  - name: telemetry
    x-displayName: v1 Legacy telemetry endpoints
  - name: v1
    x-displayName: v1 Glean probeinfo endpoints
  - name: v2
    x-displayName: v2 Glean probeinfo endpoints
    description: |
      **⚠** The v2 API is in-development and subject to change without notice. **Do not** depend on it in production!

x-tagGroups:
  - name: Input Formats
    tags:
      - library
      - application
  - name: API
    tags:
      - telemetry
      - v1
      - v2

paths:
  /firefox/general:
    get:
      summary: "Telemetry scraping general properties"
      tags:
        - telemetry
      description: |
        Provides general properties related to the scraping process.
      operationId: "getGeneral"
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GeneralFile"

  /firefox/revisions:
    get:
      summary: "Revision hashes listing"
      tags:
        - telemetry
      description: |
        Contains the revision hashes of the changesets for the probe files that were scraped.
        These hashes are mapped to a human-readable version string.
      operationId: "getGeneral"
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RevisionsFile"
              example:
                $ref: "#/components/examples/RevisionsFile"

  /firefox/{channel}/main/all_probes:
    get:
      summary: "Probe listing"
      tags:
        - telemetry
      description: |
        Refer to the [Telemetry data collection documentation](https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/collection/index.html) for a detailed explanation of the field information reported for each probe (e.g. `cpp_guard`).
      operationId: "getMetrics"
      parameters:
        - name: channel
          in: path
          description: Firefox application channel
          required: true
          schema:
            type: string
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TelemetryProbesFile"
              example:
                $ref: "#/components/examples/TelemetryProbesFile"

  /glean/{v1_name}/general:
    get:
      summary: "Glean repo general properties"
      tags:
        - v1
      description: |
        Provides general properties related to the scraping process.
      operationId: "getGeneral"
      parameters:
        - name: v1_name
          in: path
          description: v1_name from repositories.yaml
          required: true
          schema:
            type: string
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GeneralFile"

  /glean/{v1_name}/metrics:
    get:
      summary: "Glean repo metrics"
      tags:
        - v1
      description: ""
      operationId: "getMetrics"
      parameters:
        - name: v1_name
          in: path
          description: v1_name from repositories.yaml
          required: true
          schema:
            type: string
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GleanMetricsFile"
              example:
                $ref: "#/components/examples/GleanMetricsFile"

  /glean/{v1_name}/dependencies:
    get:
      summary: "Glean repo dependencies"
      tags:
        - v1
      description: |
        Provides information about the dependencies of an application.

        Each entry in the top-level object represents a dependency of the application.
      operationId: "getDependencies"
      parameters:
        - name: v1_name
          in: path
          description: v1_name from repositories.yaml
          required: true
          schema:
            type: string
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DependenciesFile"
              example:
                $ref: "#/components/examples/DependenciesFile"

  /glean/repositories:
    get:
      summary: "List Glean repositories"
      tags:
        - v1
      description: "Includes both applications and libraries"
      operationId: "getRepos"
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RepositoriesV1"

  /v2/glean/app-listings:
    get:
      summary: "v2 Glean app listings"
      tags:
        - v2
      description: |
        Flattened view of all Glean app listings (one entry per `app_id`). No libraries are included, and this will eventually link to new v2 per-app endpoints that include information pulled from dependencies.

        **⚠** The v2 API is in-development and subject to change without notice. **Do not** depend on it in production!
      operationId: "getAppListings"
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AppListing"

  /v2/glean/library-variants:
    get:
      summary: "v2 Glean library variants"
      tags:
        - v2
      description: |
        Flattened view of all Glean library variant (one entry per `dependency_name`).

        **⚠** The v2 API is in-development and subject to change without notice. **Do not** depend on it in production!
      operationId: "getLibraryVariants"
      responses:
        "200":
          description: "successful operation"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/LibraryVariant"

components:
  schemas:
    RepositoriesYamlV1:
      type: object
      # OpenAPI validation does not support propertyNames, so we relax this.
      # But we validate these names before downgrading to the v1 format anyway.
      # propertyNames:
      #   pattern: "^[a-z][a-z0-9-]{0,29}$"
      additionalProperties:
        type: object
        additionalProperties: false
        required:
          - app_id
          - description
          - url
          - notification_emails
        properties:
          app_id:
            type: string
            pattern: "^[a-z][a-z-]{0,1023}$"
          description:
            $ref: "#/components/schemas/AppDescription"
          channel:
            $ref: "#/components/schemas/AppChannel"
          deprecated:
            $ref: "#/components/schemas/DeprecatedBool"
          notification_emails:
            $ref: "#/components/schemas/NotificationEmails"
          url:
            $ref: "#/components/schemas/RepoUrl"
          branch:
            $ref: "#/components/schemas/RepoBranch"
          tag_files:
            $ref: "#/components/schemas/TagFiles"
          metrics_files:
            $ref: "#/components/schemas/MetricsFiles"
          ping_files:
            $ref: "#/components/schemas/PingFiles"
          dependencies:
            $ref: "#/components/schemas/Dependencies"
          library_names:
            $ref: "#/components/schemas/LibraryNames"
          prototype:
            $ref: "#/components/schemas/PrototypeBool"
          moz_pipeline_metadata_defaults:
            $ref: "#/components/schemas/MozPipelineMetadataDefaults"
          moz_pipeline_metadata:
            $ref: "#/components/schemas/MozPipelineMetadata"
          skip_documentation:
            $ref: "#/components/schemas/SkipDocumentationBool"

    RepositoriesV1:
      type: array
      items:
        type: object
        additionalProperties: false
        properties:
          name:
            $ref: "#/components/schemas/V1Name"
          app_id:
            type: string
            pattern: "^[a-z][a-z-]{0,1023}$"
          description:
            type: string
          channel:
            $ref: "#/components/schemas/AppChannel"
          deprecated:
            $ref: "#/components/schemas/DeprecatedBool"
          notification_emails:
            $ref: "#/components/schemas/NotificationEmails"
          url:
            $ref: "#/components/schemas/RepoUrl"
          branch:
            $ref: "#/components/schemas/RepoBranch"
          tag_files:
            $ref: "#/components/schemas/TagFiles"
          metrics_files:
            $ref: "#/components/schemas/MetricsFiles"
          ping_files:
            $ref: "#/components/schemas/PingFiles"
          dependencies:
            $ref: "#/components/schemas/Dependencies"
          library_names:
            $ref: "#/components/schemas/LibraryNames"
          prototype:
            $ref: "#/components/schemas/PrototypeBool"
          moz_pipeline_metadata_defaults:
            $ref: "#/components/schemas/MozPipelineMetadataDefaults"
          moz_pipeline_metadata:
            $ref: "#/components/schemas/MozPipelineMetadata"
          skip_documentation:
            $ref: "#/components/schemas/SkipDocumentationBool"

    RepositoriesYamlV2:
      type: object
      additionalProperties: false
      properties:
        version:
          type: string
          description: Used to distinguish from the legacy repositories.yaml format
          enum:
            - "2"
        libraries:
          type: array
          description: Repositories that define Glean dependencies
          items:
            $ref: "#/components/schemas/LibraryYaml"
        applications:
          type: array
          description: Repositories that define Glean applications
          items:
            $ref: "#/components/schemas/ApplicationYaml"

    ApplicationYaml:
      type: object
      additionalProperties: false
      required:
        - app_name
        - canonical_app_name
        - app_description
        - url
        - channels
      properties:
        app_name:
          $ref: "#/components/schemas/AppName"
        canonical_app_name:
          $ref: "#/components/schemas/CanonicalAppName"
        app_description:
          $ref: "#/components/schemas/AppDescription"
        notification_emails:
          $ref: "#/components/schemas/NotificationEmails"
        url:
          $ref: "#/components/schemas/RepoUrl"
        branch:
          $ref: "#/components/schemas/RepoBranch"
        tag_files:
          $ref: "#/components/schemas/TagFiles"
        metrics_files:
          $ref: "#/components/schemas/MetricsFiles"
        ping_files:
          $ref: "#/components/schemas/PingFiles"
        dependencies:
          $ref: "#/components/schemas/Dependencies"
        deprecated:
          $ref: "#/components/schemas/DeprecatedBool"
        prototype:
          $ref: "#/components/schemas/PrototypeBool"
        moz_pipeline_metadata_defaults:
          $ref: "#/components/schemas/MozPipelineMetadataDefaults"
        moz_pipeline_metadata:
          $ref: "#/components/schemas/MozPipelineMetadata"
        skip_documentation:
          $ref: "#/components/schemas/SkipDocumentationBool"
        channels:
          type: array
          description: >-
            Information for each of the concrete channels that make up this
            logical application. Most applications will only have a single
            concrete listing that represents all channels, but Android and iOS
            applications in particular may need to publish several listings
            with different `app_id` values in order to make multiple channels
            available in their respective app stores.

            Note that optional fields here are redundant. If a value is
            specified for a specific channel, it will override any value
            set at the overall application level.
          items:
            type: object
            additionalProperties: false
            required:
              - app_id
              - v1_name
            properties:
              app_id:
                $ref: "#/components/schemas/AppId"
              v1_name:
                $ref: "#/components/schemas/V1Name"
              app_channel:
                $ref: "#/components/schemas/AppChannel"
              description:
                $ref: "#/components/schemas/Description"
              deprecated:
                $ref: "#/components/schemas/DeprecatedBool"
              additional_dependencies:
                type: array
                default: []
                items:
                  type: string

    LibraryYaml:
      type: object
      additionalProperties: false
      required:
        - library_name
        - description
        - notification_emails
        - url
        - variants
      properties:
        library_name:
          $ref: "#/components/schemas/LibraryName"
        description:
          $ref: "#/components/schemas/Description"
        notification_emails:
          $ref: "#/components/schemas/NotificationEmails"
        url:
          $ref: "#/components/schemas/RepoUrl"
        tag_files:
          $ref: "#/components/schemas/TagFiles"
        metrics_files:
          $ref: "#/components/schemas/MetricsFiles"
        ping_files:
          $ref: "#/components/schemas/PingFiles"
        variants:
          $ref: "#/components/schemas/LibraryVariantsYaml"

    AppListing:
      type: object
      additionalProperties: false
      required:
        - app_id
        - document_namespace
        - bq_dataset_family
        - app_name
        - v1_name
        - url
      properties:
        app_id:
          $ref: "#/components/schemas/AppId"
        document_namespace:
          $ref: "#/components/schemas/DocumentNamespace"
        bq_dataset_family:
          $ref: "#/components/schemas/BqDatasetFamily"
        app_name:
          $ref: "#/components/schemas/AppName"
        canonical_app_name:
          $ref: "#/components/schemas/CanonicalAppName"
        app_description:
          $ref: "#/components/schemas/AppDescription"
        v1_name:
          $ref: "#/components/schemas/V1Name"
        app_channel:
          $ref: "#/components/schemas/AppId"
        description:
          type: string
        notification_emails:
          $ref: "#/components/schemas/NotificationEmails"
        url:
          $ref: "#/components/schemas/RepoUrl"
        branch:
          $ref: "#/components/schemas/RepoBranch"
        tag_files:
          $ref: "#/components/schemas/TagFiles"
        metrics_files:
          $ref: "#/components/schemas/MetricsFiles"
        ping_files:
          $ref: "#/components/schemas/PingFiles"
        dependencies:
          $ref: "#/components/schemas/Dependencies"
        deprecated:
          $ref: "#/components/schemas/DeprecatedBool"
        prototype:
          $ref: "#/components/schemas/PrototypeBool"
        moz_pipeline_metadata_defaults:
          $ref: "#/components/schemas/MozPipelineMetadataDefaults"
        moz_pipeline_metadata:
          $ref: "#/components/schemas/MozPipelineMetadata"
        skip_documentation:
          $ref: "#/components/schemas/SkipDocumentationBool"

    LibraryVariant:
      type: object
      additionalProperties: false
      required:
        - library_name
        - description
        - notification_emails
        - url
        - dependency_name
        - v1_name
      properties:
        library_name:
          $ref: "#/components/schemas/LibraryName"
        description:
          $ref: "#/components/schemas/Description"
        notification_emails:
          $ref: "#/components/schemas/NotificationEmails"
        url:
          $ref: "#/components/schemas/RepoUrl"
        tag_files:
          $ref: "#/components/schemas/TagFiles"
        metrics_files:
          $ref: "#/components/schemas/MetricsFiles"
        ping_files:
          $ref: "#/components/schemas/PingFiles"
        v1_name:
          $ref: "#/components/schemas/V1Name"
        deprecated:
          $ref: "#/components/schemas/DeprecatedBool"
        branch:
          $ref: "#/components/schemas/RepoBranch"
        dependency_name:
          $ref: "#/components/schemas/DependencyName"

    V1Name:
      type: string
      pattern: "^[a-z][a-z0-9-]{0,39}$"
      description: Identifier used in v1 URI paths that reference a specific repository
      example: firefox-android-beta

    Description:
      type: string
      description: A brief free-text description of this application variant.

    AppDescription:
      type: string
      description: |
        A brief free-text description of an application, applicable across any variants.

        This should not be materialized in ETL, but rather only made available in user-facing views since it may be verbose
        and it may change over time.

        example: The desktop version of Firefox

    AppName:
      type: string
      pattern: "^[a-z][a-z0-9_]{0,39}$"
      description: |
        A lowercase_with_underscores name that is short and unambiguous. It needs to be something that can be used both in a generated table name in BigQuery or as a value in an `app_name` string field in a derived table. BigQuery users might be using this literal name in a `WHERE` clause, so it should feel reasonable for that use case. Examples: `fenix`, `firefox_ios`.

        This is an "end-to-end identifier": wherever there is a field called `app_name`
        from probe scraping to user-facing derived tables in BigQuery, it should reflect
        this exact value.
      example: firefox_ios

    CanonicalAppName:
      type: string
      description: |
        How we would formally name this application in marketing copy or in a dashboard. This should not be materialized in ETL, but rather only made available in user-facing views since it may be verbose and it may change over time. Examples: Firefox for Android, Firefox for Android (Legacy Fennec), Firefox for Desktop, Firefox Focus for iOS

        This is an "end-to-end identifier": wherever there is a field called
        `canonical_app_name` from probe scraping to user-facing derived tables in BigQuery,
        it should reflect this exact value.
      example: Firefox for iOS

    AppChannel:
      type: string
      enum:
        - release
        - beta
        - nightly
        - esr
      description: |
        The release channel.
        If this is not specified, then we assume the application provides a reasonable channel value in
        `client_info.app_channel` in its pings.

    AppId:
      type: string
      pattern: '^[a-z][a-zA-Z0-9._-]{0,1023}$'
      description: |
        The app's identifier exactly as it appears in the relevant app store listing (for relevant platforms) or in the app's Glean initialization call (for other platforms). In the case of the Google Play store, it may contain both dots and dashes. For applicable platforms, you should be able to construct an app store URL from this value.

        This is an "end-to-end identifier": wherever there is a field called `app_id`
        from probe scraping to user-facing derived tables in BigQuery, it should reflect
        this exact value.
      example: "org.mozilla.firefox_beta"

    DocumentNamespace:
      type: string
      pattern: "^[a-z][a-z-]{0,1023}$"
      description: |
        Derived from `app_id`, this is the lowercase-with-dashes value that appears
        as the `document_namespace` element of the submission URI for a ping.
      example: org-mozilla-firefox-beta

    BqDatasetFamily:
      type: string
      pattern: "^[a-z][a-z_]{0,1023}$"
      description: |
        Derived from `app_id`, this is the lowercase-with-underscores prefix for
        the BigQuery datasets where decoded ping data is written by the pipeline.
      example: org_mozilla_firefox_beta

    TagFiles:
      type: array
      description: A list of relative paths to `tags.yaml` files
      default: []
      items:
        type: string
        pattern: .+\.yaml$
        example: app/tags.yaml

    MetricsFiles:
      type: array
      description: A list of relative paths to `metrics.yaml` files in the repo
      default: []
      items:
        type: string
        pattern: .+\.yaml$
        example: app/metrics.yaml

    PingFiles:
      type: array
      description: A list of relative paths to `pings.yaml` files
      default: []
      items:
        type: string
        pattern: .+\.yaml$
        example: app/pings.yaml

    RepoBranch:
      type: string
      default: master
      description: The branch in the repository to use.
    RepoUrl:
      type: string
      format: uri
      description: The URL of the repository to scrape. It should be able to be cloned directly from that URL.
      example: https://github.com/mozilla-mobile/firefox-ios

    NotificationEmails:
      type: array
      description: |
        Where emails about probe-scraper failures and improper files
        will be forwarded to.
        These will be just about your specific repository.
      items:
        type: string
        format: email
        example: nobody@mozilla.com

    PrototypeBool:
      type: boolean
      default: false
      description: Set to `true` if the application is still under development.

    DeprecatedBool:
      type: boolean
      default: false
      description: Set to `true` if the repo corresponds to a deprecated product or library.

    LibraryName:
      type: string
      description: |
        A unique identifier for this library, applicable across all variants of it.
      example: glean-core

    LibraryVariantsYaml:
      type: array
      description: |
        Variants of this library.
      items:
        type: object
        additionalProperties: false
        required:
          - dependency_name
          - v1_name
        properties:
          v1_name:
            $ref: "#/components/schemas/V1Name"
          description:
            $ref: "#/components/schemas/Description"
          deprecated:
            $ref: "#/components/schemas/DeprecatedBool"
          branch:
            $ref: "#/components/schemas/RepoBranch"
          dependency_name:
            $ref: "#/components/schemas/DependencyName"

    LibraryNames:
      type: array
      description: |
        All the build-specific library names defined in this repository,
        used as keys to match with the `dependencies` values declared by
        applications.
        A single repository could present multiple library names for different
        platforms, thus there may be multiple values here.
      items:
        type: string
        example: org.mozilla.components:service-glean

    OverrideAttributes:
      type: array
      description: |
        Mappings of Pub/Sub attribute names to static values; these are applied in the Decoder
        immediately before incorporating metadata into the payload, so can be used to overwrite values calculated in
        the pipeline; a null value will cause the pipeline to drop the named attribute; some attribute names differ
        from the nested metadata format in BigQuery, so for example you must use \"geo_city\" here in order to
        manipulate the value that shows up as metadata.geo.city; implemented for bug 1742172.
      items:
        type: object
        additionalProperties: false
        properties:
          name:
            type: string
            required: true
            enum:
              - geo_city
              - geo_subdivision1
              - geo_subdivision2
              - normalized_channel
          value:
            type: [ string, "null" ]
            required: true

    ExpirationPolicy:
      type: object
      description: |
        Various options controlling data lifecycle.
      additionalProperties: false
      properties:
        collect_through_date:
          type: string
          description: |
            If present, the pipeline will reject new data with submission_timestamp after the
            given date, sending it to error output.  Example: `2025-12-31`
          pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
          example: "2025-12-31"
        delete_after_days:
          type: integer
          description: |
            The number of days to retain decoded ping data received for this application.
            If not specified, retention will be unlimited.

    JweMappings:
      type: array
      description: |
        Mappings of encrypted JWE field paths to destinations where the value decrypted by the
        pipeline should be placed; initial use case is Account Ecosystem Telemetry; paths must be in
        [JSON Pointer format](https://tools.ietf.org/html/rfc6901) like '/payload/ecosystemAnonId'.
      items:
        type: object
        additionalProperties: false
        properties:
          decrypted_field_path:
            type: string
            required: true
            default: ""
          source_field_path:
            type: string
            required: true
            pattern: "^/.*$"
            default: "/payload"

    MozPipelineMetadataDefaults:
      type: object
      description: |
        Container for per-doctype metadata that can affect how pings are processed in the pipeline.
      additionalProperties: false
      properties:
        expiration_policy:
          $ref: "#/components/schemas/ExpirationPolicy"
        geoip_skip_entries:
          type: integer
          description: |
            If specified, pipeline will skip a number of IP address entries from X-Forwarded-For header before GeoIP
            decoding. Intended for use with proxies that add their own IP addresses to the header.
        jwe_mappings:
          $ref: "#/components/schemas/JweMappings"
        override_attributes:
          $ref: "#/components/schemas/OverrideAttributes"
        submission_timestamp_granularity:
          type: string
          description: |
            If specified, the submission_timestamp field will be truncated to the specified
            granularity in the pipeline before being output to BigQuery; this can be used to reduce the potential for
            using time-based attacks to correlate datasets using different client-level identifiers; see Java's
            ChronoUnit for additional granularities that could be considered for inclusion; implemented for bug 1742172.
          enum:
            - millis
            - seconds
            - minutes
            - hours
            - days

    MozPipelineMetadata:
      type: object
      description: |
        Allows ping level override of metadata values.
      additionalProperties:
        type: object
        description: Override default metadata values for the specified ping name.    Note this is the document type (kebab-case) not the BigQuery table name (snake_case). 
        x-additionalPropertiesName: ping-name
        additionalProperties: false
        properties:
          expiration_policy:
            $ref: "#/components/schemas/ExpirationPolicy"
          geoip_skip_entries:
            type: integer
            description: |
              If specified, pipeline will skip a number of IP address entries from X-Forwarded-For header before GeoIP
              decoding. Intended for use with proxies that add their own IP addresses to the header.
          jwe_mappings:
            $ref: "#/components/schemas/JweMappings"
          override_attributes:
            $ref: "#/components/schemas/OverrideAttributes"
          submission_timestamp_granularity:
            type: string
            description: |
              If specified, the submission_timestamp field will be truncated to the specified
              granularity in the pipeline before being output to BigQuery; this can be used to reduce the potential for
              using time-based attacks to correlate datasets using different client-level identifiers; see Java's
              ChronoUnit for additional granularities that could be considered for inclusion; implemented for bug 1742172.
            enum:
              - millis
              - seconds
              - minutes
              - hours
              - days

    SkipDocumentationBool:
      type: boolean
      default: false
      description: |
        Set to `true` if the application does not want to show up in automated
        documentation tools (e.g. the Glean Dictionary).

    DependencyName:
      type: string
      description: |
        Build system-specific name of this dependency, to be referenced by the `dependencies` section
        of an application's definition.
      example: org.mozilla.components:browser-engine-gecko

    Dependencies:
      type: array
      default: []
      description: |
        List of libraries that this application imports. The values here must
        match a value defined under `dependency_name` by a library variant.
      items:
        type: string
        example: org.mozilla.components:service-glean

    GeneralFile:
      type: object
      required:
        - lastUpdate
      properties:
        lastUpdate:
          type: string
          description: timestamp when scraping was performed
          format: date-time

    RevisionsFile:
      type: object
      additionalProperties:
        type: object
        x-additionalPropertiesName: channel
        additionalProperties:
          type: object
          x-additionalPropertiesName: revision hash
          properties:
            version:
              type: string

    TelemetryProbesFile:
      type: object
      additionalProperties:
        type: object
        x-additionalPropertiesName: <probe type>/<probe name>
        properties:
          name:
            type: string
          type:
            type: string
          history:
            type: object
            additionalProperties:
              x-additionalPropertiesName: channel
              type: array
              items:
                type: object
                properties:
                  cpp_guard:
                    type: string
                    nullable: true
                  description:
                    type: string
                    example: The duration of the last foreground session
                  details:
                    type: object
                    properties:
                      record_in_processes:
                        type: array
                        items:
                          type: string
                    additionalProperties:
                      x-additionalPropertiesName: type-specific detail
                      type: string
                  expiry_version:
                    type: string
                  optout:
                    type: boolean
                  revisions:
                    type: object
                    properties:
                      first:
                        type: string
                        example: "9aa4f48e77001058c05f3d3182228706720bf87a"
                      last:
                        type: string
                        example: "69c485078950fb09ee2cef609b75ea9dd30d249b"
                  versions:
                    type: object
                    properties:
                      first:
                        type: string
                        example: "56"
                      last:
                        type: string
                        example: "59"

    GleanMetricsFile:
      type: object
      additionalProperties:
        type: object
        x-additionalPropertiesName: metric name
        properties:
          name:
            type: string
          type:
            type: string
          history:
            type: array
            items:
              type: object
              properties:
                type:
                  type: string
                  example: timespan
                description:
                  type: string
                  example: The duration of the last foreground session
                send_in_pings:
                  type: array
                  items:
                    type: string
                    example: baseline
                bugs:
                  type: array
                  items:
                    type: integer
                    example: 1497894
                data_reviews:
                  type: array
                  items:
                    type: string
                    example: baseline
                notification_emails:
                  $ref: "#/components/schemas/NotificationEmails"
                dates:
                  type: object
                  properties:
                    first:
                      type: string
                      format: date-time
                    last:
                      type: string
                      format: date-time
                git-commits:
                  type: object
                  properties:
                    first:
                      type: string
                      example: "9aa4f48e77001058c05f3d3182228706720bf87a"
                    last:
                      type: string
                      example: "69c485078950fb09ee2cef609b75ea9dd30d249b"

    DependenciesFile:
      type: object
      additionalProperties:
        type: object
        x-additionalPropertiesName: library name
        properties:
          name:
            type: string
          type:
            type: string
          history:
            type: array
            items:
              type: object
              properties:
                dates:
                  type: object
                  properties:
                    first:
                      type: string
                      format: date-time
                    last:
                      type: string
                      format: date-time
                git-commits:
                  type: object
                  properties:
                    first:
                      type: string
                      example: "9aa4f48e77001058c05f3d3182228706720bf87a"
                    last:
                      type: string
                      example: "69c485078950fb09ee2cef609b75ea9dd30d249b"

  examples:
    TelemetryProbesFile:
      value:
        histogram/A11Y_CONSUMERS:
          history:
            nightly:
            - cpp_guard:
              description: |
                A list of known accessibility clients that inject into Firefox
                process space (see
                https://dxr.mozilla.org/mozilla-central/source/accessible/windows/msaa/Compatibility.h).
              details:
                high: 11
                keyed: false
                kind: enumerated
                low: 1
                n_buckets: 12
              expiry_version: never
              optout: true
              revisions:
                first: 320642944e42a889db13c6c55b404e32319d4de6
                last: 6f5fac320fcb6625603fa8a744ffa8523f8b3d71
              versions:
                first: '56'
                last: '59'
          name: A11Y_CONSUMERS
          type: histogram
    RevisionsFile:
      value:
        aurora: 
          1196bf3032e1bce1fb07a01fd9082a767426c5fb: 
            version: 51
    DependenciesFile:
      value:
        org.mozilla.deprecated:glean:
          name: org.mozilla.deprecated:glean
          type: dependency
    GleanMetricsFile:
      value:
        app.opened_as_default_browser:
          history:
          - _config:
              allow_reserved: false
              do_not_disable_expired: true
            bugs:
            - https://github.com/mozilla-mobile/firefox-ios/issues/7151
            data_reviews:
            - https://github.com/mozilla-mobile/firefox-ios/pull/7245
            dates:
              first: '2020-09-02 22:57:11'
              last: '2021-01-13 23:05:09'
            description: |
              Recorded when a preference is changed and includes the
              preference that changed as well as the value changed to
              recorded in the extra keys.
            disabled: false
            expires: '2021-03-01'
            gecko_datapoint: ''
            git-commits:
              first: ecd3060791ba43162afc0718cac76c7599c62686
              last: b274ef21927c892e6f87fd7d7b8a04a594acb9f9
            lifetime: ping
            no_lint: []
            notification_emails:
            - firefox-ios@mozilla.com
            reflog-index:
              first: 8
              last: 0
            send_in_pings:
            - metrics
            type: counter
            version: 0
          name: app.opened_as_default_browser
          type: counter
    LibraryVariant:
      value:
        v1_name: glean-core
        description: Modern cross-platform telemetry (core library)
        notification_emails:
          - frank@mozilla.com
          - mdroettboom@mozilla.com
        url: https://github.com/mozilla/glean
        branch: main
        tag_files:
          - glean-core/tags.yaml
        metrics_files:
          - glean-core/metrics.yaml
        ping_files:
          - glean-core/pings.yaml
        library_names:
          - glean-core
