---
title: "Ingest an item + assets through the single governed chokepoint (editor/admin)."
method: POST
path: "/v1/op/items.ingest"
tags: ["kernel-ops"]
---

# Ingest an item + assets through the single governed chokepoint (editor/admin).

`POST /v1/op/items.ingest`

## Headers

- `x-api-key` string, nullable

## Request body

- ItemIngestInput
  - `type` 'satellite_capture' | 'derived_raster' | 'derived_vector' | 'derived_pointcloud' | 'derived_tabular' | 'clip' | 'mosaic' | 'document' | 'user_raster' | 'user_vector' | 'external_reference', required
  - `name` string, required
  - `stac_id` string, nullable
  - `collection` CollectionRef — Deterministic collection resolution. Precedence: id > auto > none (uncollected). For `auto`, the (source_type, source_id) pair is the find-or-create KEY — the caller controls grouping: e.g. uploads use a single project-level key ("upload","uploads") so they share one "Uploads" collection, while an order delivery uses ("order", order_id) so each order gets its own collection. A drone flight / soil survey would use ("flight", flight_id) / ("survey", survey_id).
    - `id` string, nullable
    - `auto_name` string, nullable
    - `source_type` string, nullable
    - `source_id` string, nullable
  - `geometry` object, nullable
  - `bbox` number[], nullable
  - `datetime` string, nullable
  - `start_datetime` string, nullable
  - `end_datetime` string, nullable
  - `cloud_cover` number, nullable
  - `gsd` number, nullable
  - `description` string, nullable
  - `properties` object
  - `stac_extensions` string[]
  - `lifecycle_state` 'active' | 'expiring' | 'archived' | 'expired' | 'deleted'
  - `expires_at` string, nullable
  - `source` SourceRef, required — Where an item came from — sets the item's source FK + the provenance edge.
    - `kind` 'order' | 'upload' | 'job' | 'external' | 'public' | 'mosaic', required
    - `id` string, nullable
    - `relation` string
  - `assets` AssetSpec[]
    - `key` string, required
    - `href` string, required
    - `media_type` string, required
    - `roles` string[]
    - `title` string, nullable
    - `file_size_bytes` integer, nullable
    - `band_count` integer, nullable
    - `data_type` string, nullable
    - `crs_epsg` integer, nullable
    - `pixel_width` integer, nullable
    - `pixel_height` integer, nullable
    - `band_names` string[], nullable
    - `band_wavelengths` number[], nullable
    - `statistics` object, nullable
    - `is_original` boolean
    - `web_href` string, nullable
    - `bundle_path` string, nullable
  - `created_by` string, nullable
  - `project_id` string, required

## Response `200`

Successful Response

- IngestResult
  - `item` object, required
  - `assets` object[]
  - `collection_id` string, nullable
  - `reused` boolean

## Other responses

- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `422` — Validation Error
- `500` — Internal Server Error

---

[API](https://skmtc.dev/geopera/apis/geopera-data-platform.md) · [All operations](https://skmtc.dev/geopera/apis/geopera-data-platform/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/geopera/geopera-data-platform/revisions/cb0130b2a40a/schema)
