> ## Documentation Index
> Fetch the complete documentation index at: https://docs.omnicommerce.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Brand kits

> Manage brand kits and image-source websites through the API and SDKs.

Brand kits store brand styling, content guidelines, parent brands, and approved image-source websites. API changes use the same saved kits and websites as the app.

Use `branding:read` to list/get kits and `branding:write` to create, edit, or delete them. API keys and OAuth tokens resolve their organization automatically. Browser session requests must supply `organizationId`.

| Action | REST | TypeScript | Python |
| - | - | - | - |
| List/search | `GET /api/v1/brand-kits?q=Poly` | `brandKits.list` | `brand_kits.list` |
| Create | `POST /api/v1/brand-kits` | `brandKits.create` | `brand_kits.create` |
| Get | `GET /api/v1/brand-kits/{brandKitId}` | `brandKits.get` | `brand_kits.get` |
| Edit | `PATCH /api/v1/brand-kits/{brandKitId}` | `brandKits.update` | `brand_kits.update` |
| Delete | `DELETE /api/v1/brand-kits/{brandKitId}` | `brandKits.delete` | `brand_kits.delete` |

## Create or edit

```typescript theme={null}
import { OmniClient } from "@omni-commerce/sdk";

const omni = new OmniClient({ apiKey: process.env.OMNI_API_KEY });
const { data: kit } = await omni.brandKits.create({
  name: "Poly",
  imageSourceUrls: ["https://www.hp.com/us-en/poly.html"],
  brandKit: {
    colors: { primary: "#000000" },
    personality: { tone: "Direct" },
    contentGuidelines: "Use the manufacturer's model names.",
  },
});

await omni.brandKits.update({
  brandKitId: kit.id,
  imageSourceUrls: ["https://manufacturer.example/products"],
});
```

```python theme={null}
from omnicommerce import Omni

with Omni(api_key="omni_sk_...") as omni:
    kit = omni.brand_kits.create(
        name="Poly",
        image_source_urls=["https://www.hp.com/us-en/poly.html"],
        brand_kit={"personality": {"tone": "Direct"}},
    )["data"]
    omni.brand_kits.update(
        brand_kit_id=kit["id"],
        image_source_urls=["https://manufacturer.example/products"],
    )
```

`brandKit` accepts every canonical kit field, including colors, typography, components, logo/icon URLs, personality, guidelines, aliases, and parent-kit IDs. Nested objects merge; arrays replace. Omitted fields are preserved on update and use defaults on create. `parentBrandKitIds` accepts at most one parent from the same organization.

`imageSourceUrls` accepts HTTP(S) URLs or domain/path scopes such as `manufacturer.example/products`. Responses normalize them to host/path values. Use scopes that contain the relevant product pages; a specific landing-page path can exclude other product pages. An empty array clears the websites. Logo and icon images must use HTTP(S) URLs.

Renaming a kit keeps its source websites attached. Deleting it removes its saved websites. Historical enrichment jobs retain their source snapshots until an explicit retry replaces them.

List supports `q`, `limit` (1–1,000, default 20), and `offset`, returning `items`, `total`, and `hasMore`. Python provides the same operations through `AsyncOmni` as well.

## Retry failed images with the updated kit

Use `catalog:write` for retry requests and `catalog:read` for progress. Pass a bulk import handle, a source import UUID, or `review_<batch UUID>` for a job opened in the Review page.

```typescript theme={null}
const queued = await omni.products.retryBulkImport({
  jobIds: ["review_2197d8f3-591b-4ee4-a855-c8d55f2639ea"],
  stages: "images",
  brandKitIds: [kit.id],
});

for (const result of queued.data.results) {
  if (!result.success) console.error(result.jobId, result.error);
}
for (const retryJobId of queued.data.retryJobIds) {
  const progress = await omni.products.getBulkImportRetry({ retryJobId });
  console.log(progress.data.status, progress.data.reviews);
}
```

```python theme={null}
with Omni(api_key="omni_sk_...") as omni:
    queued = omni.products.retry_bulk_import(
        job_ids=["review_2197d8f3-591b-4ee4-a855-c8d55f2639ea"],
        stages="images",
        brand_kit_ids=[kit["id"]],
    )["data"]
    for retry_job_id in queued["retryJobIds"]:
        progress = omni.products.get_bulk_import_retry(retry_job_id=retry_job_id)["data"]
        print(progress["status"], progress["reviews"])
```

See [bulk import retries](https://docs.omnicommerce.ai/guides/bulk-product-import.md#retry-failed-work) for batch limits, completion semantics, and recovery.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.