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

# Get Production Test Report

> Get a production test challenge report with per-provider participation statistics.

Returns challenge info with overall participation statistics and a per-provider breakdown of stamp claims.

## Request

<ParamField header="Authorization" type="string" required>
  `Bearer <API_KEY>` from Console > Developers > Workspace API Keys.
</ParamField>

### Path parameters

<ParamField path="client_id" type="string" required>
  Client identifier of the app.
</ParamField>

<ParamField path="challenge_id" type="string" required>
  The tpas-backend challenge ID. This is the `id` inside the `challenge` object returned by the list endpoint (`GET /apps/{client_id}/production-tests`) — not the request `id`.
</ParamField>

## Response

<ResponseField name="challenge" type="object">
  The challenge object from tpas-backend.

  <Expandable title="challenge fields">
    <ResponseField name="id" type="string">
      Challenge ID.
    </ResponseField>

    <ResponseField name="title" type="string">
      Challenge title.
    </ResponseField>

    <ResponseField name="description" type="string | null">
      Challenge description.
    </ResponseField>

    <ResponseField name="expiresAt" type="string">
      ISO 8601 timestamp when the challenge expires.
    </ResponseField>

    <ResponseField name="createdAt" type="string">
      ISO 8601 timestamp when the challenge was created.
    </ResponseField>

    <ResponseField name="completedAt" type="string | null">
      ISO 8601 timestamp when the challenge was completed. `null` if still active.
    </ResponseField>

    <ResponseField name="isActive" type="boolean">
      Whether the challenge is currently active.
    </ResponseField>

    <ResponseField name="challengeMode" type="string">
      The challenge mode (e.g. `"stamp"`).
    </ResponseField>

    <ResponseField name="sponsor" type="any | null">
      Optional sponsor information.
    </ResponseField>

    <ResponseField name="sources" type="any[] | null">
      Optional source configuration.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="stats" type="object">
  Aggregated participation statistics for the challenge.

  <Expandable title="stats fields">
    <ResponseField name="totalParticipations" type="number">
      Total number of participation attempts (successful and unsuccessful).
    </ResponseField>

    <ResponseField name="totalClaims" type="number">
      Total number of successfully claimed stamps. Compare this to the `maxStampClaims` value to determine if the challenge has reached its limit.
    </ResponseField>

    <ResponseField name="providerBreakdown" type="object[]">
      Per-provider breakdown of stamp claims.

      <Expandable title="providerBreakdown item fields">
        <ResponseField name="providerId" type="string">
          Provider ID (e.g. `bankidse`, `mitid`).
        </ResponseField>

        <ResponseField name="providerName" type="string">
          Human-readable provider name.
        </ResponseField>

        <ResponseField name="claimCount" type="number">
          Number of stamps claimed via this provider.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<Note>
  The report is a point-in-time snapshot. There is no `isComplete` flag — poll this endpoint and compare `stats.totalClaims` to your configured `maxStampClaims` to determine if the challenge has reached its stamp limit.
</Note>

<RequestExample>
  ```bash theme={null}
  curl -H "Authorization: Bearer sk_workspace_test_..." \
    "https://sandbox.api.hopae.com/connect/v1/apps/FK5b0KSM/production-tests/ch_9a1b2c3d-4e5f-6789-abcd-ef0123456789/report"
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  {
    "challenge": {
      "id": "ch_9a1b2c3d-4e5f-6789-abcd-ef0123456789",
      "title": "BankID SE Production Test",
      "description": "Testing BankID SE integration in production",
      "expiresAt": "2026-04-15T23:59:59.000Z",
      "createdAt": "2026-04-08T09:00:00.000Z",
      "completedAt": null,
      "isActive": true,
      "challengeMode": "stamp",
      "sponsor": null,
      "sources": null
    },
    "stats": {
      "totalParticipations": 4,
      "totalClaims": 2,
      "providerBreakdown": [
        {
          "providerId": "bankidse",
          "providerName": "BankID SE",
          "claimCount": 2
        }
      ]
    }
  }
  ```
</ResponseExample>
