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

# List Contract Participants

> Retrieve the AI trainers on a contract. workEmail appears only with PII consent plus the participants:email scope — personal emails are never shared.

Returns the AI trainers on a contract whose job is linked by this install. Use it to provision workspace members — or to re-resolve a [`workEmail`](/docs/developers/annotation-platforms/lifecycle-events#when-workemail-is-included) that was absent from a webhook payload.

**Requirements:** `participants:read` scope. The `workEmail` field additionally requires the `participants:email` scope **and** the install's PII consent — see [privacy and Work Email](/docs/developers/concepts/privacy-and-work-email).

## Request

<ParamField path="contractId" type="string" required>
  The contract ID, from [list contracts](/docs/developers/annotation-platforms/api-reference/contracts/list) or a `contract.started` event.
</ParamField>

## Response

<ResponseField name="contractId" type="string">
  The contract these participants belong to.
</ResponseField>

<ResponseField name="participants" type="object[]">
  The AI trainers on the contract.

  <Expandable title="Participant fields">
    <ResponseField name="opentrainUserId" type="string">
      Stable OpenTrain user ID — use it as your cross-reference key.
    </ResponseField>

    <ResponseField name="displayName" type="string | null">
      Display name, masked to first name + last initial (for example `"Maria S."`). Full last names never leave the platform.
    </ResponseField>

    <ResponseField name="country" type="string | null">
      Country.
    </ResponseField>

    <ResponseField name="profileUrl" type="string">
      Public OpenTrain profile URL.
    </ResponseField>

    <ResponseField name="workEmail" type="string">
      Platform-issued `@opentrain.work` Work Email. Present only when the install has PII consent and the token holds `participants:email`. Personal emails are never shared.
    </ResponseField>
  </Expandable>
</ResponseField>

## Errors

| Status | `code`         | Meaning                                                      |
| ------ | -------------- | ------------------------------------------------------------ |
| `401`  | `UNAUTHORIZED` | Missing, invalid, or revoked token                           |
| `403`  | `FORBIDDEN`    | Token lacks `participants:read`                              |
| `404`  | `NOT_FOUND`    | Contract not found, or its job is not linked by this install |

<RequestExample>
  ```bash curl theme={null}
  curl -sS https://app.opentrain.ai/api/partner/v1/contracts/<CONTRACT_ID>/participants \
    -H "Authorization: Bearer $OT_PARTNER_TOKEN"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "contractId": "<CONTRACT_ID>",
    "participants": [
      {
        "opentrainUserId": "<OPENTRAIN_USER_ID>",
        "displayName": "Maria S.",
        "country": "PH",
        "profileUrl": "https://app.opentrain.ai/profile/maria-s-annotation",
        "workEmail": "maria.1234@opentrain.work"
      }
    ]
  }
  ```
</ResponseExample>
