---
title: "Create a curated BOM product"
method: POST
path: "/api/admin/bom-products"
tags: ["admin-affiliate"]
---

# Create a curated BOM product

`POST /api/admin/bom-products`

## Request

- Base URL: `https://voltplan.app`
- URL: `https://voltplan.app/api/admin/bom-products`
- Auth: HTTP bearer

Creates a `bom_products` record with `active: true` and `url` derived from `rawUrl`. A bare 10-character ASIN becomes a product URL on the country's Amazon marketplace (`buildProductUrl`); any other URL gets that marketplace's affiliate tag (`applyRegionalTag`). `universal` uses the `de` marketplace. Enum and URL validation is left to PocketBase, so violations surface as 500.

## Request body

- AdminBomProductCreateRequest
  - `kind` 'cable' | 'ring_terminal' | 'heat_shrink' | 'wire_stripper' | 'cutter' | 'crimp_tool' | 'heat_gun' | 'fuse' | 'fuse_holder', required
  - `country` 'universal' | 'de' | 'us' | 'uk' | 'fr' | 'es' | 'it' | 'au', required
  - `rawUrl` string, required: 10-character ASIN or product URL; stored as `url` after expansion.
  - `brand` string
  - `title` string
  - `gauge_mm2` number: Cross-section in mm²; exact match for `cable`, `ring_terminal`, `heat_shrink`.
  - `gauge_min_mm2` number: Lower bound in mm² for range kinds (`wire_stripper`, `cutter`, `crimp_tool`).
  - `gauge_max_mm2` number: Upper bound in mm² for range kinds (`wire_stripper`, `cutter`, `crimp_tool`).
  - `amp` number: Fuse rating in amps; unset for an assortment.
  - `fuse_type` 'Blade (ATC/ATO)' | 'MAXI Blade' | 'ANL' | 'Class T' | 'NH / Industrial' | ''
  - `color` 'red' | 'black' | 'any' | 'set' | ''
  - `tier` 'budget' | 'standard' | 'pro' | ''

## Response `200`

Record created.

- AdminBomProductCreateResponse
  - `success` unknown, required
  - `id` string, required: Id of the created `bom_products` record.

## Other responses

- `400`: `kind`, `country` or `rawUrl` is missing or empty.
- `403`: Admin access required. Returned for a missing, invalid or expired bearer token as well as for a valid token whose user lacks `is_admin=true`; admin endpoints never answer 401.
- `500`: Malformed JSON body, non-string `rawUrl`, PocketBase validation error (e.g. unknown `kind`, invalid URL), or admin credentials not configured; `error` carries the thrown message.

---

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