# Get a campaign's Discord settings

`GET https://api.tryscouty.com/v1/campaigns/{campaignId}/discord-ops`

Reads how Scouty runs one campaign's Discord server, as the campaign builder shows it: how the server is set up, how many videos each creator posts, the time zone reminders and digests follow, whether reminders, the morning and night digests and view tracking are on, and after how many quiet days a creator is flagged to the team. It also lists the creators with a room and today's counted and due videos. Only campaigns Discord ops is on for.

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

## 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 Discord settings these are. |

## Request

### cURL

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

### JavaScript

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

## Responses

### 200 OK

```json
{
  "campaignId": 42,
  "settings": {
    "available": true,
    "setupMode": "bot",
    "setupCompletedAt": "2026-09-16T10:00:00.000Z",
    "setupError": null,
    "cadenceStatus": "confirmed",
    "cadenceCount": 3,
    "cadencePeriod": "day",
    "cadencePerDay": 3,
    "cadenceQuote": null,
    "cadenceSource": "client",
    "cadenceStartsOn": "2026-09-16",
    "timezone": "America/New_York",
    "remindersEnabled": true,
    "teamUpdatesAvailable": true,
    "digestsEnabled": true,
    "inactivityDays": 3,
    "viewTrackingEnabled": true
  },
  "templateUrl": null,
  "creators": [
    {
      "name": "Sample Creator",
      "username": "creator_handle",
      "countedToday": 2,
      "dueToday": 1
    }
  ]
}
```

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