---
title: "Validate an SMS campaign"
description: "Check whether an SMS campaign could send now and who it would reach, without sending anything: can_send, the blockers a send would be refused for, the reachable count, the skip breakdown (no_marketing_consent, quiet_hours_deferred, and the rest in skipped_by_reason), when a quiet-hours hold would let it start, and whether a sender's use case or a missing template variable would block the send. `GET /api/v1/sms/campaigns/{id}/validate`"
url: https://www.unitpost.com/docs/sms/get-sms-campaigns-id-validate
section: "SMS API reference"
updated: 2026-10-13
---
# Validate an SMS campaign

`GET /api/v1/sms/campaigns/{id}/validate`

Check whether an SMS campaign could send now and who it would reach, without sending anything: `can_send`, the `blockers` a send would be refused for, the `reachable` count, the skip breakdown (`no_marketing_consent`, `quiet_hours_deferred`, and the rest in `skipped_by_reason`), when a quiet-hours hold would let it start, and whether a sender's use case or a missing template variable would block the send. Rate-limited per workspace. Requires the `campaigns:read` capability.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | — |

## Response fields (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | — |
| `campaign_id` | string | yes | — |
| `can_send` | boolean | yes | — |
| `blockers` | object[] | yes | — |
| `total` | number | yes | — |
| `reachable` | number | yes | — |
| `skipped` | number | yes | — |
| `no_marketing_consent` | number | yes | — |
| `quiet_hours_deferred` | number | yes | — |
| `skipped_by_reason` | object[] | yes | — |
| `routing` | enum | yes | One of: `automatic`, `fixed`, `pool`. |
| `earliest_start` | object \| null | yes | — |
| `use_case_mismatch` | boolean | yes | — |
| `unresolved_variables` | string[] | yes | — |

## Responses

| Status | Description |
| --- | --- |
| 200 | The validation report. |
| 401 | Missing or invalid API key. |
| 403 | Insufficient scope, or SMS is not on this plan. |
| 404 | SMS campaign not found, or SMS is not enabled. |
| 409 | The campaign is archived (restore it first). |
| 429 | Too many validation requests. |

## Example request

```bash
curl -X GET 'https://www.unitpost.com/api/v1/sms/campaigns/cmp_123/validate' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0'
```

## Example response (200)

```json
{
  "object": "sms_campaign_validation",
  "campaign_id": "campaign_123",
  "can_send": false,
  "blockers": [
    {
      "code": "string",
      "message": "string"
    }
  ],
  "total": 1,
  "reachable": 0,
  "skipped": 0,
  "no_marketing_consent": 0,
  "quiet_hours_deferred": 0,
  "skipped_by_reason": [
    {
      "reason": "string",
      "count": 1,
      "remedy": "string"
    }
  ],
  "routing": "automatic",
  "earliest_start": {
    "at": "string",
    "reason": "quiet_hours",
    "countries": [
      "string"
    ]
  },
  "use_case_mismatch": false,
  "unresolved_variables": [
    "string"
  ]
}
```

## Links

- HTML reference (with Node.js, Python, Ruby, PHP, Go, Java, Rust, .NET and CLI examples): https://www.unitpost.com/docs/sms/get-sms-campaigns-id-validate
- OpenAPI 3.1 (full schemas): https://www.unitpost.com/api/v1/openapi.json
