---
title: "Create this brand and its agents at Google"
method: POST
path: "/v1/brands/{id}/sync-google"
tags: ["Google & carriers"]
---

# Create this brand and its agents at Google

`POST /v1/brands/{id}/sync-google`

## Request

- Base URL: `https://api.cadencercs.com`
- URL: `https://api.cadencercs.com/v1/brands/{id}/sync-google`
- Auth: HTTP bearer

Deliberately **not** gated on the readiness check: an agent that merely exists reaches allowlisted test devices only, involves no carrier, and cannot be rejected by one. The readiness gate stays on `/submit`, where the risk actually is.

What this does cost is permanence, so it refuses until confirmed.

## Path parameters

- `id` string, required

## Request body

- object
  - `dryRun` boolean: **Rehearse it.** Validates everything, contacts Google only to read, creates nothing, and returns the exact payload each agent would be created with plus the fields that can never change. Needs no `confirm`, and works without Google credentials — what it cannot check from a sandbox it says it cannot check rather than reporting a pass. Do this first: it is the same information as the refusal below without having to trust the refusal.
  - `confirm` 'irreversible': Required for the real call. Without it, and without `dryRun`, the request is refused with 409 and nothing happens.

## Response `200`

With `dryRun: true`, what would happen and nothing else. Otherwise, created at Google.

- union
  - object
    - `dryRun` true, required
    - `wouldSucceed` boolean, required: False when anything below would be rejected.
    - `brand` object
      - `action` 'create' | 'adopt' | 'reuse' | 'unknown': `adopt` means a brand of this name already exists at Google and would be reused rather than duplicated.
      - `rbmBrandId` string, nullable
      - `note` string
    - `agents` object[], required
      - `agentId` string
      - `displayName` string
      - `action` 'create' | 'skip' | 'would_fail'
      - `wouldSend` object: The exact payload, built by the same code path that would send it.
      - `problems` string[]
      - `permanentFields` object
        - `hostingRegion` string
        - `agentUseCase` string
        - `billingCategory` string
    - `blockers` string[]
    - `permanentWarnings` string[]: Permanent findings from the brand's last readiness check.
    - `permanent` string[]: What this call makes unchangeable, in plain language.
    - `limitation` string: Present when Google could not be consulted — from a sandbox key, for instance.
    - `nextStep` string
  - object
    - `rbmBrandId` string, required
    - `agents` object[], required
      - `agentId` string, required
      - `rbmAgentId` string, required
    - `reach` string: What this bought — test devices, or carrier review.
    - `nextStep` string

## Other responses

- `400`: An agent's spec can't be created at Google.
- `401`: Not signed in, and no account-linked API key was sent.
- `404`: No such brand on this account.
- `409`: Not confirmed. Nothing happened. If the brand's last readiness check flagged anything `permanent` and still unresolved, the body repeats it here — this is the last refusal before the artwork reaches Google.
- `500`: Unexpected server error. The body is always JSON.
- `502`: Google rejected the request.
- `503`: This deployment isn't configured to talk to Google RBM.

---

[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)
