# List a campaign's native searches

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

Lists the native searches on one campaign, newest first, at most 20: where each one is, and how many posts and profiles it scanned, how many creators fit the campaign, how many usable emails it found and verified, and how many invites went out, were scheduled, were answered and turned into applications. It never names who a search found.

- Scope: `campaigns:read`
- Kind: read
- MCP tool: `scouty_list_searches`

## Authorization

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

## Path parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `campaignId` | `integer` | Required | The campaign whose native searches to list. |

## Request

### cURL

```bash
curl -s https://api.tryscouty.com/v1/campaigns/42/searches \
  -H "Authorization: Bearer $SCOUTY_TOKEN"
```

### JavaScript

```js
const response = await fetch("https://api.tryscouty.com/v1/campaigns/42/searches", {
  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/searches",
    headers={"Authorization": f"Bearer {token}"},
)
print(response.json())
```

## Responses

### 200 OK

```json
{
  "searches": [
    {
      "id": 12,
      "campaignId": 42,
      "status": "finished",
      "stage": "email_verification",
      "stageLabel": "Search finished",
      "startedAt": "2026-10-02T15:00:00.000Z",
      "finishedAt": "2026-10-02T16:10:00.000Z",
      "stoppedReason": null,
      "counts": {
        "termsGenerated": 24,
        "postsScanned": 1800,
        "profilesScanned": 640,
        "passedFilters": 210,
        "emailsFound": 118,
        "emailsVerified": 96,
        "notContacted": 12,
        "emailsSent": 30,
        "emailsScheduled": 54,
        "replies": 4,
        "applications": 2
      }
    }
  ]
}
```

### 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 campaigns: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 |
|---|---|---|
| 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
