---
title: "Check a brand against carrier review"
method: POST
path: "/v1/readiness/check"
tags: ["Readiness"]
---

# Check a brand against carrier review

`POST /v1/readiness/check`

## Request

- Base URL: `https://api.cadencercs.com`
- URL: `https://api.cadencercs.com/v1/readiness/check`
- Auth: none required

Also checks agent artwork when `logoUrl`/`bannerUrl` are given, which is the point: the only other place artwork is inspected is `PATCH /agents/{id}/google`, and that requires the irreversible `sync-google` — which is the step that *sends* the artwork. Checking here is the last moment a mistake is free.

Public and unauthenticated. Carrier review rejects on a small, predictable set of issues — missing privacy or consent disclosures, non-SMS "terms", brand/entity mismatch, too-new domains. A clean submission lands in days; one rejection costs weeks. Also generates the policy text a brand is missing.

## Request body

- ReadinessCheckRequest
  - `brand` string, required
  - `email` string, email, required
  - `entity` string
  - `website` string, required
  - `privacyUrl` string
  - `termsUrl` string
  - `optinUrl` string
  - `logoUrl` string
  - `bannerUrl` string
  - `useCase` string
  - `supportEmail` string

## Response `200`

Report, plus a share token for a linkable URL.

- object
  - `brand` string, required
  - `entity` string
  - `domain` string, required
  - `verdict` 'ready' | 'needs_work' | 'blocked', required
  - `summary` object, required
    - `passed` number
    - `failed` number
    - `warnings` number
    - `total` number
  - `checks` ReadinessCheck[], required
    - `id` string, required
    - `label` string, required
    - `status` 'pass' | 'fail' | 'warn' | 'unknown', required
    - `detail` string, required
    - `fix` string: How to resolve it. Present when not passing.
    - `blocking` boolean, required: A failing blocking check means the submission will very likely be rejected.
    - `permanent` boolean: **This one cannot be undone later.** A separate axis from `blocking`, deliberately: agent artwork is accepted by Google as a non-blocking warning and then freezes at `request-verification`, so filtering on `blocking === true` walks past it into a one-way door. If you automate a decision from this report, gate on `permanent` as well.
  - `artifacts` object[]: Policy text we generate for what the brand is missing.
    - `name` string, required
    - `filename` string, required
    - `description` string
    - `content` string, required: The generated document, ready to publish.
  - `discovered` object
    - `privacyUrl` string
    - `termsUrl` string
    - `optinUrl` string
    - `auto` string[]: URLs found by crawling rather than supplied.
  - `leadId` string
  - `shareToken` string: Use with `GET /v1/readiness/report/{token}`.

## Other responses

- `400`: Validation failed.
- `429`: Rate limited per IP.
- `500`: Unexpected server error. The body is always JSON.

---

[API](https://skmtc.dev/cadencercs/apis/cadence-api.md) · [All operations](https://skmtc.dev/cadencercs/apis/cadence-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cadencercs/apis/cadence-api/revisions/9438443c2081?raw)
