---
title: "Ingest Brand Kit"
method: POST
path: "/brand-kit/ingest"
tags: ["brand-kit"]
---

# Ingest Brand Kit

`POST /brand-kit/ingest`

## Request

- Base URL: `https://api.nicheangle.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.nicheangle.com/brand-kit/ingest`
- Auth: none declared

Drop-zone + URL/text ingest. See `app.services.brand_kit_ingest` for the
engine. Default fills empty fields + leaves populated ones alone (deepen).
`replace=True` refreshes an already-populated brand from the new source —
an explicit "re-learn this brand", overwriting detected identity fields.

`scope=visual` (Brand Kit Extractor funnel): a sub-second speed-lane materialize
that fills only the color + font fields from a URL (no Playwright/vision, no R2 logo
upload). Used by the claim-on-login step so a new user lands in the desk already
brand-aware. Falls through to the heavy path for any other scope.

## Query parameters

- `brand_id` string, nullable
- `scope` string, nullable

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- IngestReport: Returned alongside the BrandKit so the UI can show what the engine detected, what it skipped, and what was unchanged.
  - `kit` BrandKitResponse, required
    - `id` string, uuid, required
    - `brand_id` string
    - `name` string
    - `primary_bg` string, required
    - `secondary_bg` string, required
    - `text_primary` string, required
    - `text_secondary` string, required
    - `accent` string, required
    - `headline_font_family` string, required
    - `body_font_family` string, required
    - `font_size_scale` string, required
    - `logo_url` string, nullable, required
    - `wordmark_url` string, nullable, required
    - `headshot_url` string, nullable, required
    - `product_images` unknown[], required
      - unknown
    - `layout_style` string, required
    - `corner_radius` integer, required
    - `tagline` string, required
    - `boilerplate` string, required
    - `voice_notes` string, required
    - `external_url` string, nullable, required
    - `source_assets` unknown[]
      - unknown
    - `extraction_status` string, required
    - `forbidden_phrases` string[]
    - `signature_phrases` string[]
    - `endcard_mark_preference` string
    - `endcard_outro_text` string
    - `endcard_template` string
    - `endcard_image_url` string, nullable
    - `endcard_video_url` string, nullable
    - `video_voice_preference` string
    - `updated_at` string, date-time, required
  - `detected` string[]
  - `skipped` string[]
  - `errors` string[]
  - `duration_sec` number

## Other responses

- `422`: Validation Error

---

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