---
updatedAt: 2026-08-19T20:56:45.000Z
agentTools:
  projectIndex: https://docs.noves.fi/llms.txt
---

# /{chain}/verdicts/participants/{submittingParticipantUid}/featuredApps

Returns verdict totals for the submitting participant UID, grouped by all registered Featured Apps.
            
<i>startTimestamp</i> is inclusive and <i>endTimestamp</i> is exclusive. Both are required at the `hour` grain, where the start is rounded down and the end is rounded up to UTC hour boundaries.
            
<i>totalVerdicts</i> counts distinct verdict update IDs submitted by the participant. Each Featured App's <i>verdictCount</i> counts distinct update IDs associated with that app. A verdict can involve more than one Featured App, so do not add Featured App counts to calculate <i>totalVerdicts</i>. Their sum can exceed <i>totalVerdicts</i>.
            
The response includes all registered Featured Apps with activity in the period, including asset issuers. Each <i>featuredAppName</i> contains the current Featured App display name.
            
Set <i>interval</i> to `round` to group by whole mining rounds instead. Round mode takes either <i>fromRound</i> with <i>toRound</i>, or <i>startTimestamp</i> with <i>endTimestamp</i> used as they were given, and answers with the requested and resolved round ranges in place of <i>period</i> and <i>totalVerdicts</i>. A round range may cover at most 5,000 rounds, and a range reaching past the rounds that are covered is refused rather than answered for a shorter window.

# OpenAPI definition

```json
{
  "openapi": "3.0.1",
  "info": {
    "title": "Canton API",
    "description": "Query public and private Canton updates, balances, prices, rewards, verdicts, and Featured App activity. Create stream subscriptions and alerts for ongoing delivery.",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://api.canton.noves.fi/"
    }
  ],
  "paths": {
    "/{chain}/verdicts/participants/{submittingParticipantUid}/featuredApps": {
      "get": {
        "tags": [
          "Verdicts"
        ],
        "summary": "/{chain}/verdicts/participants/{submittingParticipantUid}/featuredApps",
        "description": "Returns verdict totals for the submitting participant UID, grouped by all registered Featured Apps.\r\n            \r\n<i>startTimestamp</i> is inclusive and <i>endTimestamp</i> is exclusive. Both are required at the `hour` grain, where the start is rounded down and the end is rounded up to UTC hour boundaries.\r\n            \r\n<i>totalVerdicts</i> counts distinct verdict update IDs submitted by the participant. Each Featured App's <i>verdictCount</i> counts distinct update IDs associated with that app. A verdict can involve more than one Featured App, so do not add Featured App counts to calculate <i>totalVerdicts</i>. Their sum can exceed <i>totalVerdicts</i>.\r\n            \r\nThe response includes all registered Featured Apps with activity in the period, including asset issuers. Each <i>featuredAppName</i> contains the current Featured App display name.\r\n            \r\nSet <i>interval</i> to `round` to group by whole mining rounds instead. Round mode takes either <i>fromRound</i> with <i>toRound</i>, or <i>startTimestamp</i> with <i>endTimestamp</i> used as they were given, and answers with the requested and resolved round ranges in place of <i>period</i> and <i>totalVerdicts</i>. A round range may cover at most 5,000 rounds, and a range reaching past the rounds that are covered is refused rather than answered for a shorter window.",
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "description": "Canton chain name. Use a name returned by `GET /chains`.",
            "required": true,
            "style": "simple",
            "schema": {
              "type": "string",
              "default": "canton",
              "example": "canton"
            }
          },
          {
            "name": "submittingParticipantUid",
            "in": "path",
            "description": "Full Canton participant UID that submitted the verdicts.",
            "required": true,
            "style": "simple",
            "schema": {
              "type": "string",
              "default": "PAR::cantex::1220dd5cc6e969cd7d7c11e339fbd07fab5f6fa1f999dc09339228d17299d9d68941",
              "example": "PAR::cantex::1220dd5cc6e969cd7d7c11e339fbd07fab5f6fa1f999dc09339228d17299d9d68941"
            }
          },
          {
            "name": "startTimestamp",
            "in": "query",
            "description": "Inclusive requested start of the verdict record time window, as Unix seconds. Rounded down to a UTC hour at the `hour` grain, and used as given at the `round` grain.",
            "style": "form",
            "schema": {
              "maximum": 253402300799,
              "minimum": -62135596800,
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "endTimestamp",
            "in": "query",
            "description": "Exclusive requested end of the verdict record time window, as Unix seconds. Rounded up to a UTC hour at the `hour` grain, and used as given at the `round` grain.",
            "style": "form",
            "schema": {
              "maximum": 253402300799,
              "minimum": -62135596800,
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "interval",
            "in": "query",
            "description": "Verdict grouping: `hour` or `round`. Defaults to `hour`.",
            "style": "form",
            "schema": {
              "pattern": "^(?i:hour|round)$",
              "type": "string"
            }
          },
          {
            "name": "fromRound",
            "in": "query",
            "description": "First mining round to include. Inclusive, non-negative, and requires `interval=round` with no timestamps.",
            "style": "form",
            "schema": {
              "minimum": 0,
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "toRound",
            "in": "query",
            "description": "Last mining round to include. Inclusive, and defaults to fromRound when omitted, so send it to state the range you mean.",
            "style": "form",
            "schema": {
              "minimum": 0,
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "apiKey",
            "in": "header",
            "description": "API Key for Canton API. To generate an API Key, visit https://app.noves.fi",
            "required": true,
            "style": "simple",
            "schema": {
              "type": "string",
              "default": "demokey"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ParticipantFeaturedAppVerdictsResponseDto"
                    },
                    {
                      "$ref": "#/components/schemas/ParticipantFeaturedAppVerdictRoundResponseDto"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/ParticipantVerdictRoundErrorDto"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "502": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/ParticipantVerdictRoundUnavailableDto"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ParticipantFeaturedAppVerdictCountDto": {
        "required": [
          "featuredAppName",
          "featuredAppParty",
          "verdictCount"
        ],
        "type": "object",
        "properties": {
          "featuredAppParty": {
            "minLength": 1,
            "type": "string",
            "description": "Full Canton party ID that identifies the Featured App."
          },
          "featuredAppName": {
            "minLength": 1,
            "type": "string",
            "description": "Current Featured App display name."
          },
          "verdictCount": {
            "type": "integer",
            "description": "Number of distinct verdict update IDs associated with this Featured App and participant during the period.",
            "format": "int64"
          }
        },
        "additionalProperties": false,
        "description": "Verdict counts for one submitting participant and Featured App."
      },
      "ParticipantFeaturedAppVerdictRoundResponseDto": {
        "required": [
          "featuredApps",
          "requestedRange",
          "resolvedRange",
          "submittingParticipantUid"
        ],
        "type": "object",
        "properties": {
          "submittingParticipantUid": {
            "minLength": 1,
            "type": "string",
            "description": "Full Canton participant UID that submitted the verdicts."
          },
          "requestedRange": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ParticipantVerdictRequestedRangeDto"
              }
            ],
            "description": "Mining round range as the request expressed it."
          },
          "resolvedRange": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ParticipantVerdictResolvedRangeDto"
              }
            ],
            "description": "Whole mining rounds the request resolved to, and the instants those rounds span."
          },
          "featuredApps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParticipantFeaturedAppVerdictCountDto"
            },
            "description": "Featured App counts with verdict activity over the resolved rounds, ordered by verdict count descending."
          }
        },
        "additionalProperties": false,
        "description": "Verdict totals for one submitting participant over whole mining rounds, grouped by Featured App."
      },
      "ParticipantFeaturedAppVerdictsResponseDto": {
        "required": [
          "featuredApps",
          "period",
          "submittingParticipantUid",
          "totalVerdicts"
        ],
        "type": "object",
        "properties": {
          "submittingParticipantUid": {
            "minLength": 1,
            "type": "string",
            "description": "Full Canton participant UID that submitted the verdicts."
          },
          "period": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ParticipantIssuerVerdictPeriodDto"
              }
            ],
            "description": "UTC hour range represented by the response."
          },
          "totalVerdicts": {
            "type": "integer",
            "description": "Number of distinct verdict update IDs submitted by the participant during the period.",
            "format": "int64"
          },
          "featuredApps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParticipantFeaturedAppVerdictCountDto"
            },
            "description": "Featured App counts with verdict activity during the period, ordered by verdict count descending."
          }
        },
        "additionalProperties": false,
        "description": "Verdict totals for one submitting participant, grouped by Featured App."
      },
      "ParticipantIssuerVerdictPeriodDto": {
        "required": [
          "completeFrom",
          "completeThrough",
          "endTime",
          "requestedEndTime",
          "requestedStartTime",
          "startTime",
          "timestampsRounded",
          "timeZone"
        ],
        "type": "object",
        "properties": {
          "startTime": {
            "type": "string",
            "description": "Inclusive start of the response window (ISO 8601).",
            "format": "date-time"
          },
          "endTime": {
            "type": "string",
            "description": "Exclusive end of the response window (ISO 8601).",
            "format": "date-time"
          },
          "requestedStartTime": {
            "type": "string",
            "description": "Requested start before UTC hour rounding (ISO 8601).",
            "format": "date-time"
          },
          "requestedEndTime": {
            "type": "string",
            "description": "Requested end before UTC hour rounding (ISO 8601).",
            "format": "date-time"
          },
          "timestampsRounded": {
            "type": "boolean",
            "description": "True when either requested timestamp was rounded."
          },
          "completeFrom": {
            "type": "string",
            "description": "Inclusive start of the range with complete data.",
            "format": "date-time"
          },
          "completeThrough": {
            "type": "string",
            "description": "Exclusive end of the range with complete data.",
            "format": "date-time"
          },
          "timeZone": {
            "minLength": 1,
            "type": "string",
            "description": "Time zone used for period boundaries."
          }
        },
        "additionalProperties": false,
        "description": "Requested and aligned UTC hour range for participant verdict totals."
      },
      "ParticipantVerdictRequestedRangeDto": {
        "required": [
          "endTimestamp",
          "fromRound",
          "selector",
          "startTimestamp",
          "toRound"
        ],
        "type": "object",
        "properties": {
          "selector": {
            "minLength": 1,
            "type": "string",
            "description": "Which selector the request used: `rounds` or `timestamps`."
          },
          "fromRound": {
            "type": "integer",
            "description": "Requested first mining round, or null when the request selected by timestamps.",
            "format": "int64"
          },
          "toRound": {
            "type": "integer",
            "description": "Requested last mining round, or null when the request selected by timestamps.",
            "format": "int64"
          },
          "startTimestamp": {
            "type": "integer",
            "description": "Requested start instant as Unix seconds, or null when the request selected by rounds.",
            "format": "int64"
          },
          "endTimestamp": {
            "type": "integer",
            "description": "Requested end instant as Unix seconds, or null when the request selected by rounds.",
            "format": "int64"
          }
        },
        "additionalProperties": false,
        "description": "The mining round range as the request expressed it. Exactly one selector carries values and the other carries nulls."
      },
      "ParticipantVerdictResolvedRangeDto": {
        "required": [
          "endTime",
          "endTimestamp",
          "fromRound",
          "startTime",
          "startTimestamp",
          "toRound"
        ],
        "type": "object",
        "properties": {
          "fromRound": {
            "type": "integer",
            "description": "First mining round the counts cover.",
            "format": "int64"
          },
          "toRound": {
            "type": "integer",
            "description": "Last mining round the counts cover.",
            "format": "int64"
          },
          "startTimestamp": {
            "type": "integer",
            "description": "Instant the first covered round opened, as Unix seconds.",
            "format": "int64"
          },
          "endTimestamp": {
            "type": "integer",
            "description": "Instant the last covered round closed, as Unix seconds.",
            "format": "int64"
          },
          "startTime": {
            "type": "string",
            "description": "Instant the first covered round opened (ISO 8601).",
            "format": "date-time"
          },
          "endTime": {
            "type": "string",
            "description": "Instant the last covered round closed (ISO 8601).",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "The effective window: the whole mining rounds the request resolved to, and the instants those rounds span. Counts describe this window, not the requested one."
      },
      "ParticipantVerdictRoundCoverageDto": {
        "required": [
          "complete",
          "reason"
        ],
        "type": "object",
        "properties": {
          "complete": {
            "type": "boolean",
            "description": "Always false here: a servable range is answered rather than refused."
          },
          "reason": {
            "minLength": 1,
            "enum": [
              "featured_app_registry_not_ready",
              "relay_bootstrap_incomplete",
              "cohort_materialization_stale",
              "issuer_not_materialized",
              "issuer_rebuild_pending",
              "source_changes_pending_recomputation",
              "outside_indexed_round_history",
              "outside_complete_round_frontier"
            ],
            "type": "string",
            "description": "A stable reason code for the refusal. The accepted values are published as this property's enumeration; treat an unrecognized one as a refusal you cannot act on rather than as an error."
          },
          "completeFromRound": {
            "type": "integer",
            "description": "First round that can be served now, or null when no servable range can be named.",
            "format": "int64",
            "nullable": true
          },
          "completeThroughRound": {
            "type": "integer",
            "description": "Last round that can be served now, or null when no servable range can be named.",
            "format": "int64",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Why a round range is not servable, and the bounds of the range that is."
      },
      "ParticipantVerdictRoundErrorDto": {
        "required": [
          "error"
        ],
        "type": "object",
        "properties": {
          "error": {
            "minLength": 1,
            "type": "string",
            "description": "Why the round range was rejected, in terms of the bound that was supplied."
          }
        },
        "additionalProperties": false,
        "description": "A rejected round range. The message names the round bound that could not be honored."
      },
      "ParticipantVerdictRoundUnavailableDto": {
        "required": [
          "coverage",
          "submittingParticipantUid"
        ],
        "type": "object",
        "properties": {
          "submittingParticipantUid": {
            "minLength": 1,
            "type": "string",
            "description": "Full Canton participant UID the request named."
          },
          "requestedRange": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ParticipantVerdictRequestedRangeDto"
              }
            ],
            "description": "The range as the request expressed it, when it could be read at all.",
            "nullable": true
          },
          "resolvedRange": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ParticipantVerdictResolvedRangeDto"
              }
            ],
            "description": "The rounds the range resolved to, or null when no window resolved.",
            "nullable": true
          },
          "coverage": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ParticipantVerdictRoundCoverageDto"
              }
            ],
            "description": "Why the range is not servable, and which rounds currently are."
          }
        },
        "additionalProperties": false,
        "description": "A round range that cannot be served yet, and the range that can. A range reaching past what is covered is refused rather than answered for a shorter window than it named."
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": {}
      },
      "ValidationProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "nullable": true
          }
        },
        "additionalProperties": {}
      }
    }
  }
}
```