# List creators on a campaign

`GET https://api.tryscouty.com/v1/campaigns/{campaignId}/applicants`

Lists every creator on one campaign, the same people the campaign's page in the Scouty dashboard shows, newest first and each person once: creators the team accepted or has still to accept, whether or not they have signed the contract, and creators in or through the activation flow. The signed field says whether they signed the contract, and activation where they are in the flow (null when they have not started it). A creator on the campaign only through activation has status "activating", and has memberId null when Scouty knows them only by phone. Creators who declined, were skipped, or were hidden from the dashboard are not listed. The total is signedCreators on scouty_list_campaigns.

- Scope: `creators:read`
- Kind: read
- MCP tool: `scouty_list_applicants`

## Authorization

Send `Authorization: Bearer $SCOUTY_TOKEN`. The token needs the `creators:read` scope.

## Path parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `campaignId` | `integer` | Required | The campaign to list creators on. |

## Query parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | `string` | Optional | Only creators who have signed the contract. Every creator on the campaign, activation included, when left out. One of `signed`. |
| `cursor` | `string` | Optional | The nextCursor from the previous page. |
| `limit` | `integer` | Optional | Creators per page, 1 to 100. 25 by default. |

## Pagination

This list comes a page at a time, in `creators`. Send `limit` (1 to 100, 25 by default) and pass the answer's `nextCursor` back as `cursor`. `nextCursor` is `null` on the last page.

## Request

### cURL

```bash
curl -s "https://api.tryscouty.com/v1/campaigns/42/applicants?status=signed&limit=25" \
  -H "Authorization: Bearer $SCOUTY_TOKEN"
```

### JavaScript

```js
const response = await fetch("https://api.tryscouty.com/v1/campaigns/42/applicants?status=signed&limit=25", {
  headers: {
    Authorization: `Bearer ${process.env.SCOUTY_TOKEN}`,
  },
});
console.log(await response.json());
```

### Python

```python
import os

import requests

token = os.environ["SCOUTY_TOKEN"]
response = requests.get(
    "https://api.tryscouty.com/v1/campaigns/42/applicants",
    headers={"Authorization": f"Bearer {token}"},
    params={"status": "signed", "limit": 25},
)
print(response.json())
```

## Responses

### 200 OK

```json
{
  "campaignId": 42,
  "creators": [
    {
      "memberId": 7,
      "name": "Sample Creator",
      "instagram": "creator_handle",
      "instagramUrl": "https://www.instagram.com/creator_handle",
      "tiktok": "creator_handle",
      "tiktokUrl": "https://www.tiktok.com/@creator_handle",
      "portfolioUrl": null,
      "followers": 12400,
      "status": "accepted",
      "appliedAt": "2026-09-18T14:02:00.000Z",
      "signed": true,
      "signedAt": "2026-09-19T09:30:00.000Z",
      "activation": {
        "state": "active",
        "stepTitle": "Join the Discord server",
        "timeLeft": "3 days left"
      }
    }
  ],
  "nextCursor": null
}
```

### 400 Bad Request

```json
{
  "error": {
    "code": "invalid_request",
    "message": "Those arguments are not the shape this capability takes: status."
  }
}
```

### 401 Unauthorized

```json
{
  "error": {
    "code": "missing_token",
    "message": "This API needs an Authorization header carrying a bearer token."
  }
}
```

### 403 Forbidden

```json
{
  "error": {
    "code": "insufficient_scope",
    "message": "This token does not carry the creators:read scope. Ask the team for one that does."
  }
}
```

### 404 Not Found

```json
{
  "error": {
    "code": "not_found",
    "message": "No such campaign."
  }
}
```

### 429 Too Many Requests

```json
{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Please wait for the current minute to end."
  }
}
```

## Errors

| Status | `error.code` | Meaning |
|---|---|---|
| 400 Bad Request | `invalid_request` | The request was not the shape this capability takes, or its body was not JSON. |
| 401 Unauthorized | `missing_token`, `invalid_token`, `token_revoked`, `token_expired`, `token_orphaned` | No token, or one that is not recognized, revoked or expired. |
| 403 Forbidden | `insufficient_scope`, `wrong_principal` | The token does not carry the scope this capability needs. |
| 404 Not Found | `not_found` | No such route, or no such campaign for this client. |
| 429 Too Many Requests | `rate_limited` | Too many requests this minute. Retry-After says how long is left. |

Full reference: https://docs.tryscouty.com/reference
