---
title: "Post Blast Radius"
method: POST
path: "/api/v1/classification/blast-radius"
tags: ["classification"]
---

# Post Blast Radius

`POST /api/v1/classification/blast-radius`

## Request

- Base URL: `https://app.goodleads.club` (the document declares no server; this is the origin it was published from)
- URL: `https://app.goodleads.club/api/v1/classification/blast-radius`
- Auth: API key in header `X-API-Key`

Blast-radius preflight for a proposed taxonomy diff.

Tenet #31 enforcement: every keyword / taxonomy proposal must ship
with three numbers (records newly classified, records rebucketed,
records confidence-tier shifted). This endpoint produces those
numbers by loading the current FusionEngine, applying the proposed
diff in-memory, classifying a representative sample, and diffing
against current labels.

Response shape mirrors `/api/v1/enrichment/preview` — same
`total / eligible / by_segment / sample / cost_implication` skeleton
so reviewers read both with the same mental model.

Scope discipline for v1:
  - add_keyword is fully modelled.
  - split / merge / add_sub return a partial response with
    `requires_offline_review=true` and the sample populated —
    enough to file a Tier-2 finding with legible-but-partial
    numbers; full modelling lands when PR 1's taxonomy IP tables
    are populated.

## Request body

- BlastRadiusRequest
  - `action` string, required: Diff type — one of ['add_keyword', 'add_sub', 'merge', 'split']. add_keyword is fully modelled; split / merge / add_sub return a partial response with requires_offline_review=true for v1.
  - `target` object, required: What the diff changes. For add_keyword: {keyword, tier, sector_label, formation_code (optional)}. Other actions accept arbitrary shape so the stub path can pass them through to the proposal.
  - `state` string, nullable: Optional state scope (CO/FL/VA/NY); omit for cross-state preflight

## Response `200`

Successful Response

- BlastRadiusResponse: Response mirrors `/api/v1/enrichment/preview` so reviewers read both with the same mental model — `total`, `eligible`, `by_segment`, `sample`, `cost_implication` map 1:1.
  - `state` string, nullable, required
  - `total` integer, required
  - `eligible` integer, nullable, required
  - `by_segment` object, nullable, required
  - `sample` BlastRadiusSampleRecord[], required
    - `glid` string, required
    - `name` string, required
    - `current` string, required
    - `proposed` string, required
  - `cost_implication` string, required
  - `runtime_warning` string, nullable
  - `diff_applied` object, required
  - `requires_offline_review` boolean

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/goodleads/apis/formation-gtm-api.md) · [All operations](https://skmtc.dev/goodleads/apis/formation-gtm-api/llms.txt) · [OpenAPI document](https://skmtc.dev/goodleads/apis/formation-gtm-api/revisions/2068d13a82cf?raw)
