---
title: "Update a Lead Capture pop-up"
method: PATCH
path: "/api/v1/lead-capture/forms/{formId}"
tags: ["Lead Capture"]
---

# Update a Lead Capture pop-up

`PATCH /api/v1/lead-capture/forms/{formId}`

## Request

- Base URL: `https://www.useboom.ai`
- URL: `https://www.useboom.ai/api/v1/lead-capture/forms/{formId}`
- Auth: HTTP bearer

Change a pop-up: restyle it with a template, edit any part of its config (design, copy, fields, trigger, game, prizes and codes), replace its allowed sites, or set it ACTIVE or PAUSED. A live pop-up must stay ready, so a change that would break it is refused with the reasons. Visitors see a change within about five minutes.

## Path parameters

- `formId` string, required: Pop-up id.

## Request body

- object
  - `template` 'bold_coupon' | 'warm_newsletter' | 'midnight' | 'editorial' | 'wheel' | 'cards' | 'plinko' | 'scratch': Restyle with a template first: its look, image, words and game, keeping the prizes, trigger, logo and phone country. `config` then applies on top.
  - `config` object: Any part of the config from lead_capture_forms_get, merged into the current one: objects merge key by key, while a list (such as `prizes`) or a plain value replaces what was there. A field the config does not have is refused, so check the spelling. Example: `{ "copy": { "headline": { "en": "Spin to win", "es": "Gira y gana" } }, "prizes": [{ "id": "p10", "label": { "en": "10% off" }, "code": "SAVE10", "weight": 1 }] }`.
  - `allowedOrigins` string[]: Replaces the whole list of allowed sites.
  - `status` 'PAUSED' | 'ACTIVE': ACTIVE shows it to visitors on the allowed sites; it is refused, with the reasons, until the pop-up is ready (at least one site, a prize per game, consent text for a phone).

## Response `200`

Success

- object
  - `id` string, required
  - `name` string, required
  - `status` 'PAUSED' | 'ACTIVE', required: ACTIVE shows it to visitors on the allowed sites; it is refused, with the reasons, until the pop-up is ready (at least one site, a prize per game, consent text for a phone).
  - `game` string, required: The game, or `none` for a plain form.
  - `allowedOrigins` string[], required
  - `installKey` string, required: Public; identifies the pop-up in the install tag.
  - `updatedAt` string, required: ISO timestamp.
  - `installTag` string, required: The script tag to paste at the end of the page body.
  - `buttonTag` string, required: A button that opens the pop-up when clicked, whatever its trigger; with the trigger set to `click` it is the only way it opens. The install tag must be on the page too.
  - `config` object, required: The full design, copy, fields, trigger, game and prizes. Send any part of it back as `config` to `lead_capture_forms_update`. Text fields are `{ "en": "…", "es": "…", "pt": "…" }`; `en` is required. `flow.order` is `form-first` (details, then the game) or `play-first` (the game, then details to claim the prize; needs a game). If the stored settings could no longer be read, this shows the defaults and `liveIssues` says so; a patch then starts from the defaults.
  - `liveIssues` string[], required: Why it could not go live as it stands, one `field: reason` per line. Empty when it is ready.

## Other responses

- `400`: Validation failed or the request cannot proceed.
- `401`: Missing, malformed, or revoked API key.
- `404`: The resource does not exist in this organization.
- `409`: Conflicts with the current state (duplicates, wrong lifecycle state).
- `422`: The request is well-formed but semantically invalid.
- `429`: Rate limit exceeded — retry after `Retry-After`.
- `500`: Internal server error.
- `503`: Transient error — retry with a narrower request.

## Changes

- **2026-11-03** `7c7a773b12ce`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/useboom/apis/boom-api/changes/api/v1/lead-capture/forms/:formId/patch.md)

---

[API](https://skmtc.dev/useboom/apis/boom-api.md) - [All operations](https://skmtc.dev/useboom/apis/boom-api/llms.txt) - [OpenAPI document](https://skmtc.dev/useboom/apis/boom-api/revisions/d596d92ed092?raw)
