---
title: "Portfolio feasibility: for every area and every time window, what a campaign would actually yield, which window is best, and what it would cost. Buys nothing."
method: POST
path: "/v1/op/catalog.clear_coverage.campaign"
tags: ["kernel-ops"]
---

# Portfolio feasibility: for every area and every time window, what a campaign would actually yield, which window is best, and what it would cost. Buys nothing.

`POST /v1/op/catalog.clear_coverage.campaign`

## Headers

- `x-api-key` string, nullable

## Request body

- CampaignInput
  - `aois` CampaignAOI[], required
    - `aoi_id` string, required
    - `geometry` object, required
  - `epochs` CampaignEpoch[], required
    - `label` string, required — Caller's name for this window, e.g. '2026-Q1'
    - `start` string, required
    - `end` string, required
  - `scenes` SrcOperationsCatalogCampaignCoverageSceneRef[], required
    - `scene_id` string, required
    - `footprint` object, required
    - `thumbnail_url` string, required
    - `captured_at` string, nullable
    - `off_nadir_deg` number, nullable
    - `sun_elevation_deg` number, nullable
    - `vendor_cloud_pct` number, nullable
    - `sensor` string, nullable
    - `vendor` string, nullable
  - `target_coverage` number
  - `max_span_days` integer
  - `max_scenes` integer
  - `max_off_nadir_deg` number, nullable
  - `min_sun_elevation_deg` number, nullable
  - `vendors` string[], nullable
  - `date_priority` string

## Response `200`

Successful Response

- CampaignOutput
  - `cells` CellResult[], required
    - `aoi_id` string, required
    - `epoch` string, required
    - `outcome` string, required
    - `coverage` number, required
    - `best_single` number, required
    - `candidates` integer, required
    - `members` integer
    - `span_days` integer
    - `billed_multiplier` integer
    - `needs_review` boolean
    - `review_reason` string, nullable
    - `footprint_gap` number
    - `cloud_gap` number
    - `scene_ids` string[]
  - `by_epoch` EpochRollup[], required
    - `epoch` string, required
    - `achievable` integer, required
    - `single_capture` integer, required
    - `incomplete` integer, required
    - `nothing` integer, required
    - `achievable_pct` number, required
  - `best_epoch` string, nullable
  - `best_epoch_pct` number
  - `aois` integer
  - `scenes_analysed` integer
  - `scenes_from_cache` integer
  - `skipped` object[]

## 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)
