---
title: "Preview or apply reviewed CaseEngine firm launch packs in batches of up to 50."
method: POST
path: "/v1/agency-program"
---

# Preview or apply reviewed CaseEngine firm launch packs in batches of up to 50.

`POST /v1/agency-program`

## Request

- Base URL: `https://www.kaicalls.com/api`
- URL: `https://www.kaicalls.com/api/v1/agency-program`
- Auth: HTTP bearer

Admin membership and workspaces:write + agents:write are required. Each firm commits atomically and replays safely. Applies quiet hours and detection, persists approved training signals and queues synthesis. Sends no messages and changes no live routing, billing, source integrations or campaign approvals.

## Request body

- object
  - `action` 'preview' | 'apply', required
  - `approved` boolean: Must be true for apply after reviewing all firm facts.
  - `entries` object[], required
    - `businessId` string, uuid, required
    - `expectedRevision` string, nullable, required: Current revision, or null for a firm without a launch pack.
    - `profile` object, required
      - `timezone` string, required
      - `practiceAreas` string[], required
      - `serviceArea` string, required
      - `hours` string, required
      - `intakeInstructions` string, required
      - `dni` 'callrail' | 'kai' | 'other' | 'none', required
      - `lsa` 'google_lsa' | 'lsa_commander' | 'none', required
      - `reviewUrl` string, required: Public HTTPS review link, or empty string.

## Response `200`

Preview changes or per-firm applied/replayed/blocked/conflict/failed results. Inspect every outcome before retrying.

## Other responses

- `400`: Invalid launch pack or approval missing.
- `401`: Authentication required.
- `403`: Missing scope or admin membership.
- `413`: Body too large.

---

[API](https://skmtc.dev/kaicalls/apis/kaicalls-public-api.md) · [All operations](https://skmtc.dev/kaicalls/apis/kaicalls-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kaicalls/apis/kaicalls-public-api/revisions/e607fc6cf36e?raw)
