# Get a campaign

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

Reads one campaign in full: the campaign as a creator sees it, what still has to be filled in before it can go live, and whether a change is waiting for the team to review it.

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

## Authorization

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

## Path parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `campaignId` | `integer` | Required | The campaign's id, as scouty_list_campaigns reports it. |

## Request

### cURL

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

### JavaScript

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

## Responses

### 200 OK

```json
{
  "campaignId": 42,
  "brand": "Acme",
  "title": "Acme Spring launch",
  "status": "published",
  "editable": false,
  "applicationDeadline": "2026-10-31",
  "fields": {
    "title": "Acme Spring launch",
    "overview": "Short videos showing how you use the Acme water bottle on a normal day.",
    "payLine": "$150 per approved video, paid by Acme",
    "deliverables": [
      "One 30 to 60 second TikTok",
      "One Instagram Reel"
    ],
    "requirements": [
      "18 or older",
      "Based in the US"
    ],
    "marketCountryCodes": [
      "US"
    ],
    "applicationDeadline": "2026-10-31",
    "activationMode": "manual"
  },
  "missingForPublish": [],
  "pendingEdit": {
    "heldForReview": false,
    "waiting": false
  },
  "contract": {
    "uploaded": true,
    "signingRequired": true
  },
  "activation": {
    "flowPublished": true,
    "mode": "manual"
  }
}
```

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