---
title: "Bulk Upsert"
method: POST
path: "/api/v1/freepik-assets/bulk-upsert"
tags: ["freepikAssets"]
---

# Bulk Upsert

`POST /api/v1/freepik-assets/bulk-upsert`

Insert or update assets in one call, deduped on freepik_id.

Idempotent: re-running the same sourcing pass updates rows in place rather
than duplicating them. Null fields in the payload never overwrite stored values.

## Request body

- FreepikAssetBulkUpsertDTO
  - `assets` FreepikAssetItemDTO[], required — Batch to insert or update
    - `freepik_id` integer, nullable — Freepik resource id — dedupe key
    - `title` string, nullable
    - `type` string, nullable — photo / vector / psd
    - `orientation` string, nullable — square / horizontal / vertical
    - `width` integer, nullable
    - `height` integer, nullable
    - `preview_url` string, nullable
    - `detail_url` string, nullable
    - `author_name` string, nullable
    - `license` string, nullable — freemium / premium
    - `downloads` integer, nullable
    - `my_url` string, nullable — GCS URL of the licensed full-res file
    - `tags` string[], nullable — namespaced tags, e.g. niche:security
    - `description` string, nullable
    - `comments` string, nullable
    - `is_dark` boolean, nullable
    - `has_text` boolean, nullable
    - `analysis` object, nullable — {'provenance': {...}, 'vision': {...}}
    - `status` string, nullable — active / retired / removed_from_freepik
    - `licensed_at` string, date-time, nullable
    - `usage_count` integer, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/brandbooster/apis/fastapi.md) · [All operations](https://skmtc.dev/brandbooster/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/brandbooster/fastapi/revisions/ff7f2b621b41/schema)
