# Get a Contributor Network benchmark result

```http
GET /api/public/v1/contributor-network/benchmarks/{resultId}
```

**Scope**: `contributor-network.read`.

Returns one completed public result produced by a configured Contributor Network benchmark activity. Use the stable `resultId` returned by [List benchmark results](./list-benchmarks.md); an item ID is not a result ID, and one item can accumulate results from different activities over time.

This read endpoint never starts, retries, or consumes quota for a benchmark. Archiving an activity stops new scheduling but does not hide its retained completed results.

## Path parameter

| Parameter | Requirement |
| :--- | :--- |
| `resultId` | **Required string.** Stable, opaque benchmark-result ID. |

This endpoint accepts no query parameters. Unknown or repeated query parameters return `422 RESOURCE_FIELD_INVALID`.

## Visibility

The result must have status `done`, its Contributor Network item must be active, and the item's owning Competition must remain publicly visible and expose the result's benchmark activity.

Missing and unavailable results return the same `404 NOT_FOUND` response. Withdrawing an item removes its results from public reads without deleting the retained benchmark records.

## Example request

```bash
curl "https://api.sair.foundation/api/public/v1/contributor-network/benchmarks/$RESULT_ID" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Response

Returns `200 OK` with:

| Field | Type and description |
| :--- | :--- |
| `resultId` | **string.** Stable benchmark-result ID supplied in the path. |
| `activityId` | **string.** Frozen public activity that produced this result. |
| `itemId` | **string.** Active Contributor Network item evaluated by the activity. |
| `publicCode` | **string.** Item's immutable human-shareable code. |
| `competitionId` | **string.** Competition that owns both the item and activity. |
| `kind` | **string.** Item discriminator. It is `cheatsheet` for `CN-BMK-001`. |
| `title` | **string.** Immutable item title. |
| `author.sairId` | **string.** Public SAIR account ID. |
| `author.displayName` | **string.** Public display name snapshotted with the item. |
| `author.avatarUrl` | **string or null.** Public avatar URL, or `null` when absent. |
| `team` | **object or null.** Public team snapshot for the activity, currently `{ teamNumber }`, or `null` when the result is not team-associated. |
| `status` | **string.** Always `done`. In-progress and failed rows are not exposed by this endpoint. |
| `problemSet` | **string.** Frozen problem-set ID evaluated by the activity. |
| `perModel` | **`BenchmarkModelSummary[]`.** Metrics in the activity's configured model order. |
| `avgAccuracy` | **number.** Arithmetic mean of every returned model's `accuracy`, from `0` through `1`. |
| `scoredCorrect` | **integer.** Sum of `scoredCorrect` across the returned models. |
| `scoredTotal` | **integer.** Sum of `scoredTotal` across the returned models. |
| `viewerHasFavorited` | **boolean.** Whether the API key owner currently favorites the item. |
| `publishedAt` | **string.** ISO 8601 UTC item-publication time. |
| `completedAt` | **string.** Immutable ISO 8601 UTC time when this benchmark result became complete. |

### Per-model summary

| Field | Type and description |
| :--- | :--- |
| `modelId` | **string.** Exact frozen model ID. |
| `accuracy` | **number.** Raw accuracy from `0` through `1`. |
| `scoredCorrect` | **integer.** Correct scored cases. |
| `scoredTotal` | **integer.** Total scored cases. |
| `f1Score` | **number or null.** F1 score when declared by the activity. |
| `parseSuccessRate` | **number or null.** Parse-success rate from `0` through `1` when declared by the activity. |
| `totalCostUsd` | **number or null.** Total measured model cost in USD when declared by the activity. |
| `meanElapsedSeconds` | **number or null.** Mean measured elapsed seconds per case when declared by the activity. |

The activity definition determines which nullable metrics it publishes. `CN-BMK-001` publishes cost and elapsed-time metrics for both configured models. If a completed result cannot supply the required metrics, the request returns `500 BENCHMARK_RESULT_CORRUPT`. Do not interpret this error as a zero score or an empty result.

Successful responses use `Content-Type: application/json` and `Cache-Control: private, no-store` because `viewerHasFavorited` and item visibility can change.

## Errors

| HTTP | Code | When |
| :---: | :--- | :--- |
| `404` | `NOT_FOUND` | The result, item, Competition, or public benchmark activity is unavailable. |
| `422` | `RESOURCE_FIELD_INVALID` | The request contains an unknown or repeated query parameter. |
| `500` | `BENCHMARK_RESULT_CORRUPT` | The completed result does not satisfy its frozen activity schema. |
| `503` | `BENCHMARK_RESULTS_UNAVAILABLE` | Benchmark results are temporarily unavailable. |

See [Errors](../../errors.md) for shared errors.
