{
  "openapi": "3.1.0",
  "info": {
    "version": "1.7",
    "title": "API Specification",
    "contact": {
      "email": "support@skywatch.com",
      "url": "http://support.skywatch.com"
    }
  },
  "servers": [
    {
      "url": "https://api.skywatch.co/earthcache",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "archiveSearch",
      "x-displayName": "Archive Search",
      "description": "Search the archive for satellite imagery and retrieve search results."
    },
    {
      "name": "legacyPipelines",
      "x-displayName": "Pipelines",
      "description": "Create and manage pipelines for ordering and delivering geospatial data."
    },
    {
      "name": "pricing",
      "x-displayName": "Calculate Pricing",
      "description": "Calculate and retrieve pricing information for data requests."
    },
    {
      "name": "webhooks",
      "x-displayName": "Webhooks",
      "description": "Manage webhook subscriptions and callbacks for pipeline events."
    },
    {
      "name": "Locations",
      "description": "The Locations API is a RESTful API that abstracts spatial data provided as KML and GeoJSON into a manageable instance in the server that can be referenced by other APIs in our platform.\nThe platform can only handle spatial data that enclose a valid polygon.\n",
      "externalDocs": {
        "url": "http://wiki.gis.com/wiki/index.php/Feature_class",
        "description": "Definition of a Feature Class on the GIS wiki"
      }
    },
    {
      "name": "hubUsers",
      "x-displayName": "Hub Users",
      "description": "Manage users within your Hub organization, including roles and project assignments."
    },
    {
      "name": "hubPaymentMethods",
      "x-displayName": "Hub Payment Methods",
      "description": "View and manage payment methods for your Hub organization."
    },
    {
      "name": "hubProjects",
      "x-displayName": "Hub Projects",
      "description": "Create and manage projects to organize users, payment methods, and spending."
    },
    {
      "name": "hubOfferings",
      "x-displayName": "Hub Offerings",
      "description": "Search and explore available satellite imagery offerings and configurations."
    },
    {
      "name": "directView",
      "x-displayName": "DirectView & WMTS",
      "description": "Access browser-based imagery viewing and WMTS tile services for completed orders."
    }
  ],
  "security": [
    {
      "Api key": []
    }
  ],
  "paths": {
    "/archive/search": {
      "post": {
        "tags": [
          "archiveSearch"
        ],
        "operationId": "ArchiveSearchAPIPOST",
        "summary": "Search",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/search.resource"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/search_post.response"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/archive/search/{id}/search_results": {
      "get": {
        "tags": [
          "archiveSearch"
        ],
        "operationId": "ArchiveSearchAPIGET",
        "summary": "Search Results",
        "description": "Returns source products from the archive from the search referenced by the specified id",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "description": "id of search to retrieve results from",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "description": "maximum number of records to return",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32",
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "description": "pointer to the next item",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int32",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/search.response"
                }
              }
            }
          },
          "202": {
            "description": "In progress",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/in_progress.response"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/pipelines": {
      "get": {
        "parameters": [
          {
            "in": "query",
            "name": "per_page",
            "schema": {
              "type": "integer",
              "default": 500,
              "maximum": 500
            },
            "description": "The number of item per page"
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Reference to next page in the collection. Each page requested returns this reference for the next page.\n"
          },
          {
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            },
            "description": "Items ordering based on pipeline's created_at property"
          }
        ],
        "operationId": "PipelineList",
        "summary": "List Orders",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/200-list.response"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "408": {
            "description": "Authorization Check Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ],
        "description": "Retrieve a paginated list of all orders. Returns order details including status, cost, area, and delivery information. This endpoint supports filtering, sorting, and pagination to manage large result sets."
      },
      "post": {
        "operationId": "PipelineCreate",
        "summary": "Create Order",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/pipeline-create-body"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success - pipeline(s) created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx.response"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "408": {
            "description": "Authorization Check Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "415": {
            "description": "Unsupported media type",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ],
        "description": "Create a new imagery order. Specify the data source, area of interest, time interval, and processing parameters. The order will be queued for processing and you will receive notifications as it progresses through various stages."
      },
      "delete": {
        "description": "Delete multiple orders in a single request. Provide an array of pipeline IDs to delete. Only orders that have not started processing can be deleted. Returns a summary of successful and failed deletions.",
        "operationId": "PipelineDeleteMany",
        "summary": "Delete Multiple Orders",
        "parameters": [
          {
            "in": "query",
            "name": "ids",
            "description": "ids of pipelines to delete, separated by commas",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success - pipeline deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx-delete-many.response"
                }
              }
            }
          },
          "400": {
            "description": "Unable to delete",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/Cannot Delete.response"
                    },
                    {
                      "$ref": "#/components/schemas/Bad Request"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx-delete-many-pipelines.response"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx-delete-many-pipelines.response"
                }
              }
            }
          },
          "408": {
            "description": "Authorization Check Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ]
      }
    },
    "/pipelines/{id}": {
      "get": {
        "operationId": "PipelineGet",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Get Order Details",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx.response"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "408": {
            "description": "Authorization Check Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ],
        "description": "Retrieve detailed information about a specific order including current status, processing progress, cost breakdown, and deliverable files. Use this endpoint to poll for order completion or check on processing status."
      },
      "patch": {
        "operationId": "PipelineUpdate",
        "summary": "Update Order",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/pipeline-update"
                  },
                  {
                    "$ref": "#/components/schemas/supported-geojson"
                  }
                ]
              }
            },
            "application/geo+json": {
              "schema": {
                "$ref": "#/components/schemas/supported-geojson"
              }
            },
            "application/xml": {
              "example": "Refer to http://schemas.opengis.net/kml/2.3/ogckml23.xsd for specification\n"
            },
            "application/vnd.google-earth.kml+xml": {
              "example": "Refer to http://schemas.opengis.net/kml/2.3/ogckml23.xsd for specification\n"
            },
            "application/vnd.google-earth.kmz": {
              "example": "Refer to http://schemas.opengis.net/kml/2.3/ogckml23.xsd for specification\n"
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - pipeline updated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx.response"
                }
              }
            }
          },
          "201": {
            "description": "Success - pipeline updated and pipeline(s) created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx.response"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "408": {
            "description": "Authorization Check Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "415": {
            "description": "Unsupported media type",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ],
        "description": "Update an existing order configuration. You can modify certain parameters like the end date or processing options if the order has not yet started processing. Most parameters cannot be changed once processing begins."
      },
      "delete": {
        "description": "Delete a specific order. Only orders that have not started processing or are in a failed state can be deleted. Active or completed orders cannot be deleted to maintain audit trail.",
        "operationId": "PipelineDelete",
        "summary": "Delete Order",
        "responses": {
          "204": {
            "description": "Success - pipeline deleted"
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "408": {
            "description": "Authorization Check Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ]
      }
    },
    "/pipelines/{id}/interval_results": {
      "get": {
        "tags": [
          "legacyPipelines"
        ],
        "operationId": "pipelineIntervalResultList",
        "summary": "List Order Interval Results",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "legacy",
                "standard"
              ],
              "default": "legacy"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/200-list.response-2"
                    },
                    {
                      "$ref": "#/components/schemas/200-list-standard.response"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "description": "Retrieve interval-based results for a specific order. For recurring orders that collect data at regular intervals (e.g., daily, weekly), this endpoint returns results grouped by time interval. Each interval includes metadata about captured imagery, cloud cover, and processing status."
      }
    },
    "/pipelines/calculate": {
      "post": {
        "tags": [
          "pricing"
        ],
        "operationId": "PipelineCalculatorPOST",
        "summary": "Calculate cost of area and intervals and probability of collection",
        "description": "Calculate cost of area and intervals of a pipeline, and the probability of collection of any tasking intervals",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/pipeline_calculator.request"
              },
              "examples": {
                "example1": {
                  "summary": "Calculate cost for NYC area",
                  "value": {
                    "resolution": "very_high",
                    "location": {
                      "type": "Polygon",
                      "coordinates": [
                        [
                          [-73.95950959050467, 40.803232950312264],
                          [-73.98518739769608, 40.768306075577726],
                          [-73.97154148035514, 40.761912689996564],
                          [-73.94657494129676, 40.79741232310445],
                          [-73.95950959050467, 40.803232950312264]
                        ]
                      ]
                    },
                    "start_date": "2028-01-01",
                    "end_date": "2028-01-31",
                    "interval": "40d",
                    "tasking": true,
                    "return_probability_of_collection": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/pipeline_calculator.response"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/price/calculate": {
      "post": {
        "tags": [
          "pricing"
        ],
        "operationId": "PriceCalculatorPOST",
        "summary": "Calculate cost of area and intervals",
        "description": "Calculate cost of specified location and intervals, taking purchase minimums and prepurchase discounts into account",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/price_calculator.request"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/price_calculator.response"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/interval_results": {
      "get": {
        "tags": [
          "legacyPipelines"
        ],
        "summary": "List All Interval Results",
        "operationId": "intervalResultsList",
        "description": "Retrieve all interval results across all your orders. This provides a consolidated view of captured imagery from recurring orders, useful for monitoring ongoing collection campaigns. Results include capture time, cloud cover, quality metrics, and download links.",
        "parameters": [
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "pipeline_id",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "legacy",
                "standard"
              ],
              "default": "legacy"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/200-list.response-2"
                    },
                    {
                      "$ref": "#/components/schemas/200-list-standard.response"
                    }
                  ]
                }
              }
            }
          },
          "4XX": {
            "description": "Invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "5XX": {
            "description": "Server fault",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/outputs": {
      "get": {
        "operationId": "outputsList",
        "summary": "List Order Outputs",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/200-list.response-3"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ],
        "description": "Retrieve a list of all output files (deliverables) from your orders. Each output represents a processed imagery file ready for download. Outputs include metadata such as file size, format, coordinate system, and expiration date for download links. For new integrations, access deliverables through GET /accounts/orders/{order_id} instead."
      }
    },
    "/outputs/{id}": {
      "get": {
        "operationId": "OutputGet",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Get Output Details",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx.response-2"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/5xx.response"
                }
              }
            }
          }
        },
        "tags": [
          "legacyPipelines"
        ],
        "description": "Retrieve detailed information about a specific output file including download URL, file metadata, processing parameters applied, and coordinate reference system information. Download URLs are typically valid for 30 days. For new integrations, access deliverables through GET /accounts/orders/{order_id} instead."
      }
    },
    "/locations": {
      "get": {
        "tags": [
          "Locations"
        ],
        "summary": "List",
        "operationId": "locationsReadMany",
        "description": "Get a list of your `location` objects in GeoJSON format. To get all locations, use the endpoint without any filters.",
        "parameters": [
          {
            "in": "query",
            "name": "filters",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Get location by name, this returns only one location at a time\n"
                },
                "id": {
                  "type": "string",
                  "description": "Get location by id, this returns only one location at a time\n"
                }
              },
              "additionalProperties": false,
              "oneOf": [
                {
                  "required": [
                    "name"
                  ]
                },
                {
                  "required": [
                    "id"
                  ]
                }
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "description": "Max number of items returned in the response\n",
            "schema": {
              "type": "number",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "description": "Pointer to the next page\n",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "sort",
            "description": "Controls the order in which the objects are returned\n`asc` = ascending, `desc` = descending\nIt's case insensitive\n",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success - locations fetched",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "aoiSize": {
                            "type": "number"
                          },
                          "is_deleted": {
                            "type": "boolean"
                          }
                        }
                      }
                    },
                    "links": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "description": {
                            "type": "string"
                          },
                          "uri": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "properties": {
                        "cursor": {
                          "type": "object",
                          "properties": {
                            "self": {
                              "type": "string"
                            },
                            "next": {
                              "type": "string"
                            }
                          }
                        },
                        "per_page": {
                          "type": "number"
                        },
                        "sort": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                },
                "example": {
                  "errors": [
                    {
                      "message": "Bad request. Please refer API documentation for the right format"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Location not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                },
                "example": {
                  "errors": [
                    {
                      "message": "Location xxxx not found"
                    }
                  ]
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Locations"
        ],
        "summary": "Create",
        "operationId": "createLocation",
        "description": "Store a location defined in GeoJSON format. You can reference this location in other services, such as `Pipelines API`, to create multiple pipelines for the same location (Area of Interest)",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "FeatureCollection"
                    ]
                  },
                  "features": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "Feature"
                          ]
                        },
                        "name": {
                          "type": "string"
                        },
                        "properties": {
                          "type": "object"
                        },
                        "geometry": {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "Polygon"
                              ]
                            },
                            "coordinates": {
                              "type": "array",
                              "items": {
                                "type": "array",
                                "items": {
                                  "type": "array",
                                  "items": {
                                    "type": "number"
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success - location created",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "123456789"
                        },
                        "name": {
                          "type": "string",
                          "example": "New Name"
                        }
                      }
                    },
                    "links": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "description": {
                            "type": "string"
                          },
                          "uri": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            },
            "examples": {
              "example1": {
                "summary": "Example with ID and Name",
                "value": {
                  "data": {
                    "id": "123456789",
                    "name": "New Name"
                  },
                  "links": [
                    {
                      "description": "Location instance with id = 123456789",
                      "uri": "https://api.skywatch.co/earthcache/locations/123456789"
                    },
                    {
                      "description": "Location instance with name = 34",
                      "uri": "https://api.skywatch.co/earthcache/locations?name=New Name"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                },
                "example": {
                  "errors": [
                    {
                      "message": "string"
                    }
                  ]
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/locations/{id}": {
      "get": {
        "summary": "Fetch a location",
        "operationId": "locationsRead",
        "tags": [
          "Locations"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success - location fetched",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "123456789"
                        },
                        "name": {
                          "type": "string",
                          "example": "name"
                        },
                        "is_deleted": {
                          "type": "boolean",
                          "example": false
                        },
                        "aois": {
                          "type": "object",
                          "properties": {
                            "features": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "example": "Feature"
                                  },
                                  "properties": {
                                    "type": "object"
                                  },
                                  "geometry": {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "example": "Polygon"
                                      },
                                      "coordinates": {
                                        "type": "array",
                                        "items": {
                                          "type": "array",
                                          "items": {
                                            "type": "array",
                                            "items": {
                                              "type": "number",
                                              "example": -2.122218289218921
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "aoiSize": {
                          "type": "string",
                          "example": "205200.87km2"
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "readOneLocation": {
                    "summary": "Single location with polygons as GeoJSON",
                    "value": {
                      "data": {
                        "id": "123456789",
                        "name": "name",
                        "is_deleted": false,
                        "aois": {
                          "features": [
                            {
                              "type": "Feature",
                              "properties": {},
                              "geometry": {
                                "type": "Polygon",
                                "coordinates": [
                                  [
                                    -2.122218289218921,
                                    -15.231189704767242,
                                    -42.418212890625,
                                    -15.755249429439134,
                                    -41.8963623046875,
                                    -15.570127852659413,
                                    -42.396240234375,
                                    -14.891704754215477,
                                    -2.122218289218921,
                                    -15.231189704767242
                                  ]
                                ]
                              }
                            }
                          ]
                        },
                        "aoiSize": "205200.87km2"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Location not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                },
                "example": {
                  "errors": [
                    {
                      "message": "string"
                    }
                  ]
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      },
      "patch": {
        "summary": "Update a location",
        "operationId": "updateLocation",
        "tags": [
          "Locations"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Updated Name"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success - location updated",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "123456789"
                        },
                        "name": {
                          "type": "string",
                          "example": "Updated Name"
                        },
                        "is_deleted": {
                          "type": "boolean",
                          "example": false
                        },
                        "aois": {
                          "type": "object",
                          "properties": {
                            "features": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "example": "Feature"
                                  },
                                  "properties": {
                                    "type": "object"
                                  },
                                  "geometry": {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "example": "Polygon"
                                      },
                                      "coordinates": {
                                        "type": "array",
                                        "items": {
                                          "type": "array",
                                          "items": {
                                            "type": "array",
                                            "items": {
                                              "type": "number",
                                              "example": -2.122218289218921
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "aoiSize": {
                          "type": "string",
                          "example": "205200.87km2"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Location not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                },
                "example": {
                  "errors": [
                    {
                      "message": "string"
                    }
                  ]
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete a location",
        "operationId": "deleteLocation",
        "tags": [
          "Locations"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success - location deleted",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "Location '123456789' deleted successfully"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Location not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                },
                "example": {
                  "errors": [
                    {
                      "message": "string"
                    }
                  ]
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/subscriptions": {
      "post": {
        "tags": [
          "webhooks"
        ],
        "summary": "Subscribe (create subscription)",
        "operationId": "subscriptionsCreate",
        "description": "A subscription allows you to register a callback URI for events in the EarthCache platform.\n",
        "responses": {
          "201": {
            "description": "Success - subscription created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/2xx.response-3"
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error - invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/subscription-create"
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "webhooks"
        ],
        "summary": "List subscriptions",
        "operationId": "subscriptionsList",
        "description": "List subscriptions\n",
        "parameters": [
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/200-list.response-4"
                }
              }
            }
          }
        }
      }
    },
    "/subscriptions/{id}": {
      "post": {
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "webhooks"
        ],
        "summary": "Update subscription",
        "operationId": "subscriptionUpdate",
        "description": "Update subscription properties, such as `callback_uri` and `status`.\n",
        "responses": {
          "204": {
            "description": "Success - subscription updated; no content returned"
          },
          "404": {
            "description": "Not found - target subscription does not exist",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error - invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/subscription-update"
              }
            }
          }
        }
      },
      "delete": {
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "webhooks"
        ],
        "summary": "Unsubscribe (delete subscription)",
        "operationId": "subscriptionDelete",
        "description": "Unsubscribe from an existing subscription.\n",
        "responses": {
          "204": {
            "description": "Success - subscription deleted; no content returned"
          },
          "404": {
            "description": "Not found - target subscription does not exist",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error - invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/subscriptions/{id}/sample": {
      "post": {
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "event_name",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "pipeline-complete",
                "pipeline-complete-with-results",
                "pipeline-complete-no-results",
                "pipeline-create",
                "pipeline-interval-processing",
                "pipeline-interval-ordering",
                "pipeline-interval-failure",
                "pipeline-interval-tasking-order-committed",
                "pipeline-interval-tasking-order-cancelled"
              ]
            }
          }
        ],
        "tags": [
          "webhooks"
        ],
        "summary": "Subscriptions Samples",
        "operationId": "subscriptionsSamples",
        "description": "Send data samples to the subscription.\n",
        "responses": {
          "200": {
            "description": "Success - data sample sent.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "response": {
                          "type": "object",
                          "properties": {
                            "status_code": {
                              "type": "integer",
                              "description": "Status code for callback response"
                            },
                            "body": {
                              "type": "string",
                              "description": "Content for callback response"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found - target subscription does not exist",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error - invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/callbacks": {
      "get": {
        "tags": [
          "webhooks"
        ],
        "summary": "List",
        "operationId": "callbacksList",
        "description": "Returns a list of callback invocations over the last 3 months (which is the retention period).\n",
        "parameters": [
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/200-list.response-5"
                }
              }
            }
          },
          "4XX": {
            "description": "Client-side error - invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/4xx.response"
                }
              }
            }
          }
        }
      }
    },
    "/accounts/users": {
      "get": {
        "tags": [
          "hubUsers"
        ],
        "operationId": "listUsers",
        "summary": "List Users",
        "description": "Retrieve a list of all users in your Hub organization. Returns user details including roles, projects, and contact information.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "users": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/User"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/users/me": {
      "get": {
        "tags": [
          "hubUsers"
        ],
        "operationId": "getCurrentUser",
        "summary": "Get Current User",
        "description": "Retrieve details about the currently authenticated user, including role and project assignments.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/users/{user_id}": {
      "get": {
        "tags": [
          "hubUsers"
        ],
        "operationId": "getUser",
        "summary": "Get User Details",
        "description": "Retrieve detailed information about a specific user by user ID.",
        "parameters": [
          {
            "in": "path",
            "name": "user_id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "User identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/payment_methods": {
      "get": {
        "tags": [
          "hubPaymentMethods"
        ],
        "operationId": "listPaymentMethods",
        "summary": "List Payment Methods",
        "description": "Retrieve all payment methods available in your Hub organization, including monthly arrears and prepayment purchase orders.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "payment_methods": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PaymentMethod"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/payment_methods/{id}": {
      "get": {
        "tags": [
          "hubPaymentMethods"
        ],
        "operationId": "getPaymentMethod",
        "summary": "Get Payment Method Details",
        "description": "Retrieve detailed information about a specific payment method, including budget information and associated projects.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Payment method identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentMethod"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/projects": {
      "get": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "listProjects",
        "summary": "List Projects",
        "description": "Retrieve all projects in your Hub organization. Projects connect users to payment methods and enable budget tracking.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "projects": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Project"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      },
      "post": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "createProject",
        "summary": "Create Project",
        "description": "Create a new project. Requires Super Admin role. Projects must be associated with a payment method.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Project created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/projects/{id}": {
      "get": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "getProject",
        "summary": "Get Project Details",
        "description": "Retrieve detailed information about a specific project, including users, spending, and budget information.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Project identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      },
      "patch": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "updateProject",
        "summary": "Update Project",
        "description": "Update project details such as name, end date, or payment method. Requires Super Admin role.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Project identifier"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Project updated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      },
      "delete": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "deleteProject",
        "summary": "Delete Project",
        "description": "Delete a project. Projects can only be deleted if they have no active or pending orders. Requires Super Admin role.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Project identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "Project deleted",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/projects/{id}/users": {
      "post": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "addUserToProject",
        "summary": "Add User to Project",
        "description": "Add a user to a project, granting them access to create orders against the project. Requires Super Admin role.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Project identifier"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "user_id": {
                    "type": "string"
                  }
                },
                "required": [
                  "user_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User added",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/projects/{id}/users/{user_id}": {
      "delete": {
        "tags": [
          "hubProjects"
        ],
        "operationId": "removeUserFromProject",
        "summary": "Remove User from Project",
        "description": "Remove a user from a project. Users must have at least one project assignment. Requires Super Admin role.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Project identifier"
          },
          {
            "in": "path",
            "name": "user_id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "User identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "User removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/products/offerings": {
      "get": {
        "tags": [
          "hubOfferings"
        ],
        "operationId": "listOfferings",
        "summary": "List Offerings",
        "description": "Search available satellite imagery offerings. Filter by type (archive/tasking), resolution, sensor type, and availability window.",
        "parameters": [
          {
            "in": "query",
            "name": "offering_type",
            "schema": {
              "type": "string",
              "enum": [
                "archive",
                "tasking"
              ]
            },
            "description": "Filter by offering type"
          },
          {
            "in": "query",
            "name": "start_time",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Start of availability window (for tasking)"
          },
          {
            "in": "query",
            "name": "end_time",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "End of availability window (for tasking)"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Product"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/products/offerings/{offering_id}": {
      "get": {
        "tags": [
          "hubOfferings"
        ],
        "operationId": "getOffering",
        "summary": "Get Offering Details",
        "description": "Retrieve detailed information about a specific offering, including available configurations and processing options.",
        "parameters": [
          {
            "in": "path",
            "name": "offering_id",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Offering identifier (e.g., skywatch:sentinel-2:l2a)"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfferingDetailsResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/products/offerings/feasibility": {
      "post": {
        "tags": [
          "hubOfferings"
        ],
        "operationId": "checkFeasibility",
        "summary": "Check Tasking Feasibility",
        "description": "Check the feasibility of a tasking order for a specific offering, area, and time window. Returns collection probability and available satellite passes.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FeasibilityRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FeasibilityResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/accounts/orders/cost": {
      "post": {
        "tags": [
          "pricing"
        ],
        "operationId": "calculateOrderCost",
        "summary": "Calculate Order Cost",
        "description": "Calculate the cost for an archive or tasking order before creating it. Returns detailed pricing breakdown including unit costs and minimum charges.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CostRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CostResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/createview/{pipelineID}": {
      "get": {
        "tags": [
          "directView"
        ],
        "operationId": "getDirectViewURL",
        "summary": "Get DirectView URL",
        "description": "Create a DirectView webmap instance for a pipeline. Returns a URL to a webmap with your pipeline results displayed on the map. Authentication required via x-api-key header.",
        "parameters": [
          {
            "in": "path",
            "name": "pipelineID",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Pipeline identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "URL to the DirectView webmap"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/createxyz": {
      "post": {
        "tags": [
          "directView"
        ],
        "operationId": "createCustomTiles",
        "summary": "Create Custom DirectView Tiles",
        "description": "Generate customized XYZ tile URLs with control over band selection and histogram stretching. Returns detailed tile information organized by interval ID and capture date, including tile URLs, bounds, and zoom limits. Authentication required via x-api-key header.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pipelineID": {
                    "type": "string",
                    "description": "Pipeline identifier to generate tiles for"
                  },
                  "histogramStretch": {
                    "type": "string",
                    "description": "Histogram stretching method: 'minmax' (simple min/max), 'stdev' (mean ± 2 * std dev, customizable as 'stdev_3'), 'cumulativecutcount' (2-98% cutoff, customizable as 'cumulativecutcount_1_99'). Default: 'stdev'",
                    "example": "stdev"
                  },
                  "bandList": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "List of band names in desired order (e.g., ['red', 'green', 'blue']). Must match band names from SkyWatch Standard Product metadata.",
                    "example": ["red", "green", "blue"]
                  },
                  "timeLimit": {
                    "type": "string",
                    "description": "Time-limited access format: '7d' (7 days), '0.5M' (15 days), '1y8M12d16h30m15s' (custom duration), 'never' (no expiry). Coming soon.",
                    "example": "never"
                  }
                },
                "required": ["pipelineID"]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "integer",
                      "example": 200
                    },
                    "body": {
                      "type": "object",
                      "description": "Nested structure organized by interval ID and capture date",
                      "additionalProperties": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "url": {
                                "type": "string",
                                "format": "uri",
                                "description": "XYZ tile URL in format: https://directview.earthcache.com/tiles/{tilingType}/{encrypted_path}/{z}/{x}/{y}.png?scaling=[min,max]&bands=[r,g,b]"
                              },
                              "expires": {
                                "type": "string",
                                "description": "Expiration setting ('never' or timestamp)"
                              },
                              "bounds": {
                                "type": "array",
                                "items": {
                                  "type": "number"
                                },
                                "minItems": 4,
                                "maxItems": 4,
                                "description": "GeoJSON bounding box [minX, minY, maxX, maxY]",
                                "example": [-78.26, 44.16, -78.18, 44.20]
                              },
                              "zoomLimits": {
                                "type": "array",
                                "items": {
                                  "type": "integer"
                                },
                                "minItems": 2,
                                "maxItems": 2,
                                "description": "Minimum and maximum zoom levels [minZoom, maxZoom]",
                                "example": [12, 13]
                              },
                              "tilingType": {
                                "type": "string",
                                "description": "Tile matrix set identifier",
                                "example": "WebMercatorQuad"
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "403": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "404": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    },
    "/data/search": {
      "post": {
        "tags": [
          "archiveSearch"
        ],
        "operationId": "searchArchive",
        "summary": "Search Archive",
        "description": "Search the satellite imagery archive for available scenes matching your criteria. Returns scenes with metadata including cloud cover, resolution, and offering IDs.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/search.resource"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/search.response"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "401": {
            "$ref": "#/components/schemas/4xx.response"
          },
          "500": {
            "$ref": "#/components/schemas/5xx.response"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "Api key": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    },
    "schemas": {
      "Polygon": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "$id": "https://geojson.org/schema/Polygon.json",
        "title": "GeoJSON Polygon",
        "type": "object",
        "required": [
          "type",
          "coordinates"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "Polygon"
            ]
          },
          "coordinates": {
            "type": "array",
            "items": {
              "type": "array",
              "minItems": 4,
              "items": {
                "type": "array",
                "minItems": 2,
                "items": {
                  "type": "number"
                }
              }
            }
          },
          "bbox": {
            "type": "array",
            "minItems": 4,
            "items": {
              "type": "number"
            }
          }
        }
      },
      "search.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "location": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Polygon",
                "description": "Coordinates of location to be searched"
              },
              {
                "type": "object",
                "required": [
                  "ref"
                ],
                "additionalProperties": false,
                "properties": {
                  "ref": {
                    "type": "object",
                    "required": [
                      "uri"
                    ],
                    "properties": {
                      "uri": {
                        "type": "string",
                        "format": "uri",
                        "minLength": 1
                      }
                    }
                  }
                }
              }
            ]
          },
          "start_date": {
            "description": "Starting capture date of interest",
            "type": "string",
            "format": "date"
          },
          "end_date": {
            "description": "Ending capture date of interest",
            "type": "string",
            "format": "date"
          },
          "resolution": {
            "description": "Resolution of returned results",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "low",
                    "medium",
                    "high",
                    "very_high"
                  ]
                }
              },
              {
                "type": "string",
                "enum": [
                  "low",
                  "medium",
                  "high",
                  "very_high"
                ]
              }
            ]
          },
          "coverage": {
            "description": "Percentage of location covered by search result",
            "type": "number",
            "minimum": 0
          },
          "interval_length": {
            "description": "Length of interval in days to group search results by",
            "type": "number",
            "minimum": 0
          },
          "order_by": {
            "description": "Sort order of returned search results",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "resolution",
                    "cost",
                    "coverage",
                    "date",
                    "-resolution",
                    "-cost",
                    "-coverage",
                    "-date"
                  ]
                }
              },
              {
                "type": "string",
                "enum": [
                  "resolution",
                  "cost",
                  "coverage",
                  "date",
                  "-resolution",
                  "-cost",
                  "-coverage",
                  "-date"
                ]
              }
            ]
          },
          "off_nadir_angle": {
            "type": "array",
            "description": "Array containing two numerical values representing the minimum and maximum off-nadir angles, in degrees, within [-90, 90].",
            "items": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "minItems": 2,
            "maxItems": 2,
            "example": [
              -30,
              30
            ]
          }
        }
      },
      "search_post.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Id of the search request"
              },
              "location": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/Polygon",
                    "description": "Coordinates of location to be searched"
                  },
                  {
                    "type": "object",
                    "required": [
                      "ref"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "ref": {
                        "type": "object",
                        "required": [
                          "uri"
                        ],
                        "properties": {
                          "uri": {
                            "type": "string",
                            "format": "uri",
                            "minLength": 1
                          }
                        }
                      }
                    }
                  }
                ]
              },
              "start_date": {
                "description": "Starting capture date of interest",
                "type": "string",
                "format": "date"
              },
              "end_date": {
                "description": "Ending capture date of interest",
                "type": "string",
                "format": "date"
              },
              "resolution": {
                "description": "Resolution of returned results",
                "oneOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "low",
                        "medium",
                        "high"
                      ]
                    }
                  },
                  {
                    "type": "string",
                    "enum": [
                      "low",
                      "medium",
                      "high"
                    ]
                  }
                ]
              },
              "coverage": {
                "description": "Percentage of location covered by search result",
                "type": "number",
                "minimum": 0
              },
              "interval_length": {
                "description": "Length of interval in days to group search results by",
                "type": "number",
                "minimum": 0
              },
              "order_by": {
                "description": "Sort order of returned search results",
                "oneOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "resolution",
                        "cost",
                        "coverage",
                        "date",
                        "-resolution",
                        "-cost",
                        "-coverage",
                        "-date"
                      ]
                    }
                  },
                  {
                    "type": "string",
                    "enum": [
                      "resolution",
                      "cost",
                      "coverage",
                      "date",
                      "-resolution",
                      "-cost",
                      "-coverage",
                      "-date"
                    ]
                  }
                ]
              },
              "created_at": {
                "type": "string",
                "format": "date-time"
              },
              "off_nadir_angle": {
                "type": "array",
                "items": {
                  "type": "number",
                  "minimum": -90,
                  "maximum": 90
                },
                "minItems": 2,
                "maxItems": 2,
                "example": [
                  -30,
                  30
                ]
              }
            }
          }
        }
      },
      "4xx.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "errors"
        ],
        "additionalProperties": false,
        "properties": {
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 512
                }
              }
            }
          }
        }
      },
      "5xx.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "errors"
        ],
        "additionalProperties": false,
        "properties": {
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 512
                }
              }
            }
          }
        }
      },
      "supported-geojson-geometry": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "title": "Geometry",
        "description": "GeoJSON Geometry supported by EarthCache\u2122",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "coordinates"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of GeoJSON object.",
            "enum": [
              "Polygon"
            ]
          },
          "coordinates": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "array",
              "title": "Polygons",
              "minItems": 4,
              "items": {
                "type": "array",
                "title": "Long/Lat",
                "maxItems": 3,
                "minItems": 2,
                "items": [
                  {
                    "type": "number",
                    "title": "Longitude",
                    "minimum": -180,
                    "maximum": 180
                  },
                  {
                    "type": "number",
                    "title": "Latitude",
                    "minimum": -90,
                    "maximum": 90
                  },
                  {
                    "type": "number",
                    "title": "Altitude or elevation (ignored)"
                  }
                ]
              }
            }
          },
          "bbox": {
            "type": "array",
            "title": "Bounding Box",
            "minItems": 4,
            "maxItems": 4,
            "items": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          }
        }
      },
      "search.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id of the search result"
                },
                "location": {
                  "$ref": "#/components/schemas/supported-geojson-geometry",
                  "description": "Coordinates defining boundary of area of search result"
                },
                "intersection": {
                  "$ref": "#/components/schemas/supported-geojson-geometry",
                  "description": "Coordinates defining boundary of area of intersection of search result"
                },
                "start_time": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Start date and time of capture"
                },
                "end_time": {
                  "type": "string",
                  "format": "date-time",
                  "description": "End date and time of capture"
                },
                "preview_uri": {
                  "type": "string",
                  "format": "uri",
                  "description": "Preview image of search result"
                },
                "thumbnail_uri": {
                  "type": "string",
                  "format": "uri",
                  "description": "100 x 100 pixel thumbnail image of search result"
                },
                "resolution": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Resolution in metres of search result"
                },
                "source": {
                  "type": "string",
                  "description": "Name of source provider of search result"
                },
                "product_name": {
                  "type": "string",
                  "description": "Source provider product name of search result"
                },
                "location_coverage_percentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100,
                  "description": "Percentage that search result covers search location"
                },
                "area_sq_km": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Area in square km that search result covers search location"
                },
                "minimum_area_sq_km": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Minimum area in square km allowed to order"
                },
                "price_per_sq_km": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Price per square km"
                },
                "cost": {
                  "oneOf": [
                    {
                      "type": "string",
                      "description": "Appears as 'Upgrade your plan for price' on medium or high resolution search results for test plan users"
                    },
                    {
                      "type": "number",
                      "minimum": 0,
                      "description": "Cost if search location were to be processed and delivered from this search result"
                    }
                  ]
                },
                "result_cloud_cover_percentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100,
                  "description": "Percentage that search result is covered by clouds"
                },
                "off_nadir_angle": {
                  "type": "number",
                  "minimum": -90,
                  "maximum": 90,
                  "example": 12.5
                }
              }
            }
          },
          "pagination": {
            "type": "object",
            "required": [
              "per_page",
              "cursor",
              "total",
              "count"
            ],
            "additionalProperties": false,
            "properties": {
              "per_page": {
                "type": "integer"
              },
              "cursor": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "next": {
                    "type": "integer"
                  },
                  "self": {
                    "type": "integer",
                    "minimum": 0
                  }
                }
              },
              "total": {
                "type": "integer",
                "minimum": 0
              },
              "count": {
                "type": "integer",
                "minimum": 0
              }
            }
          }
        }
      },
      "in_progress.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "object",
            "required": [
              "message"
            ],
            "properties": {
              "message": {
                "type": "string",
                "minLength": 0
              }
            }
          }
        }
      },
      "supported-geojson-geometry-2": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "title": "Geometry",
        "description": "GeoJSON Geometry supported by EarthCache\u2122",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "coordinates"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of GeoJSON object.",
            "enum": [
              "Polygon"
            ]
          },
          "coordinates": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "array",
              "title": "Polygons",
              "minItems": 4,
              "items": {
                "type": "array",
                "title": "Long/Lat",
                "maxItems": 3,
                "minItems": 2,
                "items": [
                  {
                    "type": "number",
                    "title": "Longitude",
                    "minimum": -180,
                    "maximum": 180
                  },
                  {
                    "type": "number",
                    "title": "Latitude",
                    "minimum": -90,
                    "maximum": 90
                  },
                  {
                    "type": "number",
                    "title": "Altitude or elevation (ignored)"
                  }
                ]
              }
            }
          }
        }
      },
      "pipeline.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "Pipeline",
        "required": [
          "id",
          "start_date",
          "end_date",
          "resolution_low",
          "resolution_high",
          "cloud_cover_percentage",
          "interval",
          "result_delivery",
          "output",
          "status",
          "created_at",
          "updated_at"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "name": {
            "type": "string"
          },
          "start_date": {
            "type": "string",
            "format": "date"
          },
          "end_date": {
            "type": "string",
            "format": "date"
          },
          "budget_per_km2": {
            "type": "number",
            "minimum": 0
          },
          "max_cost": {
            "type": "number",
            "minimum": 0
          },
          "resolution_low": {
            "type": "number",
            "minimum": 0.3,
            "maximum": 30
          },
          "resolution_high": {
            "type": "number",
            "minimum": 0.3,
            "maximum": 30
          },
          "cloud_cover_percentage": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "min_aoi_coverage_percentage": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "interval": {
            "type": "string",
            "pattern": "[1-9]\\d{0,2}d"
          },
          "result_delivery": {
            "oneOf": [
              {
                "type": "string",
                "description": "Process and deliver the first available search result in the interval.",
                "enum": [
                  "first_available"
                ]
              },
              {
                "type": "object",
                "description": "Evaluate all available results in the interval according to the priorities.",
                "additionalProperties": false,
                "properties": {
                  "max_latency": {
                    "type": "string",
                    "description": "Period to collect available results before evaluation.",
                    "pattern": "\\d{1,3}d"
                  },
                  "priorities": {
                    "type": "array",
                    "$comment": "make sure to check in app side for conflicting enums",
                    "items": {
                      "type": "string",
                      "enum": [
                        "lowest_cost",
                        "highest_resolution",
                        "latest",
                        "midpoint",
                        "earliest"
                      ]
                    },
                    "uniqueItems": true,
                    "minItems": 1
                  }
                }
              },
              {
                "type": "object",
                "description": "Evaluate all available results in the interval according to the priorities.",
                "additionalProperties": false,
                "properties": {
                  "max_latency": {
                    "type": "string",
                    "description": "Period to collect available results before evaluation.",
                    "pattern": "\\d{1,3}d"
                  },
                  "priorities": {
                    "type": "array",
                    "$comment": "make sure to check in app side for conflicting enums",
                    "items": {
                      "type": "string",
                      "enum": [
                        "first_available"
                      ]
                    },
                    "uniqueItems": true,
                    "minItems": 1
                  }
                }
              }
            ]
          },
          "aoi": {
            "$ref": "#/components/schemas/supported-geojson-geometry-2"
          },
          "area_km2": {
            "type": "number",
            "exclusiveMinimum": 0
          },
          "output": {
            "type": "object",
            "required": [
              "id",
              "format",
              "mosaic"
            ],
            "additionalProperties": false,
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "format": {
                "type": "string",
                "enum": [
                  "geotiff"
                ]
              },
              "mosaic": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "stitched",
                      "off"
                    ]
                  },
                  {
                    "type": "object",
                    "required": [
                      "type"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "type": {
                        "type": "string",
                        "description": "Type of mosaic to produce. Only stitched is supported",
                        "enum": [
                          "stitched"
                        ]
                      },
                      "range": {
                        "type": "string",
                        "description": "The range, in days, within the interval that results are constrained to in the mosaic. Only \"1d\" or the interval length are supported. If not specified, default value is interval length",
                        "pattern": "\\d{1,3}d"
                      }
                    }
                  }
                ]
              }
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "title": "Tag",
              "required": [
                "label",
                "value"
              ],
              "additionalProperties": false,
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "value": {
                  "type": "string",
                  "minLength": 1
                }
              }
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "complete",
              "failed",
              "deactivating",
              "pending"
            ]
          },
          "status_reason": {
            "type": "object",
            "required": [
              "reason"
            ],
            "additionalProperties": false,
            "properties": {
              "reason": {
                "type": "string",
                "enum": [
                  "results",
                  "no_results",
                  "some_results",
                  "failed"
                ]
              },
              "description": {
                "type": "string",
                "minLength": 1
              }
            }
          },
          "search_id": {
            "type": "string",
            "description": "Id of the search that generated the search_results"
          },
          "search_results": {
            "oneOf": [
              {
                "type": "array",
                "description": "List of search results from search_id to generate pipeline from",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              {
                "type": "string",
                "description": "Search result from search_id to generate pipeline from",
                "format": "uuid"
              }
            ]
          },
          "sources": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "include"
                ],
                "properties": {
                  "include": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "Kompsat-2",
                        "Kompsat-3",
                        "Kompsat-3A",
                        "PlanetScope",
                        "Sentinel-1",
                        "Sentinel-2",
                        "SkySat",
                        "TripleSat",
                        "Pleiades",
                        "Spot",
                        "PlanetScope-SuperDove",
                        "Pleiades-Neo",
                        "Pleiades-Neo-HD15",
                        "USKY01",
                        "NewSat-70cm",
                        "Capella-SLC",
                        "RCM",
                        "Beijing-3N",
                        "Beijing-3A"
                      ]
                    },
                    "minItems": 1
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "required": [
                  "exclude"
                ],
                "properties": {
                  "exclude": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "Kompsat-2",
                        "Kompsat-3",
                        "Kompsat-3A",
                        "PlanetScope",
                        "Sentinel-1",
                        "Sentinel-2",
                        "SkySat",
                        "TripleSat",
                        "Pleiades",
                        "Spot",
                        "PlanetScope-SuperDove",
                        "Pleiades-Neo",
                        "Pleiades-Neo-HD15",
                        "USKY01",
                        "NewSat-70cm",
                        "Capella-SLC",
                        "RCM",
                        "Beijing-3N",
                        "Beijing-3A"
                      ]
                    },
                    "minItems": 1
                  }
                }
              }
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "off_nadir_angle": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "minItems": 2,
            "maxItems": 2,
            "example": [
              -30,
              30
            ]
          }
        }
      },
      "200-list.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/pipeline.resource"
            }
          },
          "pagination": {
            "type": "object",
            "required": [
              "per_page",
              "cursor",
              "total",
              "count"
            ],
            "additionalProperties": false,
            "properties": {
              "per_page": {
                "type": "integer"
              },
              "cursor": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "next": {
                    "type": "string"
                  },
                  "self": {
                    "type": "string"
                  }
                }
              },
              "total": {
                "type": "integer",
                "minimum": 0
              },
              "count": {
                "type": "integer",
                "minimum": 0
              }
            }
          }
        }
      },
      "pipeline-create-body": {
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "Optional parameter allows you to give your pipeline an identifying name"
          },
          "start_date": {
            "type": "string",
            "description": "Start date of your collection period",
            "format": "date"
          },
          "end_date": {
            "$comment": "App must set default based on start_date",
            "type": "string",
            "description": "End date of your collection period",
            "format": "date"
          },
          "budget_per_km2": {
            "type": "number",
            "description": "Control price by setting the amount you are willing to pay per square kilometre.  Use this OR max_cost",
            "minimum": 0,
            "default": 0
          },
          "max_cost": {
            "type": "number",
            "description": "Control price by setting the amount you are willing to pay in total for all results from this pipeline.  Use this OR budget",
            "minimum": 0
          },
          "cloud_cover_percentage": {
            "type": "number",
            "description": "Minimum cloud free area your result must have",
            "minimum": 0,
            "maximum": 100,
            "default": 100
          },
          "min_aoi_coverage_percentage": {
            "type": "number",
            "description": "Minimum coverage of your area your result must have",
            "minimum": 0,
            "maximum": 100
          },
          "resolution_low": {
            "type": "number",
            "minimum": 0.3,
            "maximum": 30,
            "default": 30
          },
          "resolution_high": {
            "$comment": "Application must validate resolution_low > resolution_high",
            "type": "number",
            "minimum": 0.3,
            "maximum": 30,
            "default": 10
          },
          "interval": {
            "type": "string",
            "pattern": "[1-9]\\d{0,2}d"
          },
          "result_delivery": {
            "description": "Configuration that determines which search result to process and deliver.",
            "oneOf": [
              {
                "type": "object",
                "description": "Evaluate all available results in the interval according to the priorities.",
                "additionalProperties": false,
                "properties": {
                  "max_latency": {
                    "type": "string",
                    "description": "Period to collect available results before evaluation.",
                    "pattern": "\\d{1,3}d",
                    "default": "0d"
                  },
                  "priorities": {
                    "type": "array",
                    "$comment": "check for conflicting enums in semantics validation",
                    "items": {
                      "type": "string",
                      "enum": [
                        "lowest_cost",
                        "highest_resolution",
                        "earliest",
                        "midpoint",
                        "latest"
                      ]
                    },
                    "uniqueItems": true,
                    "default": [
                      "latest",
                      "highest_resolution",
                      "lowest_cost"
                    ]
                  }
                }
              },
              {
                "type": "object",
                "description": "Evaluate all available results in the interval according to the priorities.",
                "additionalProperties": false,
                "properties": {
                  "max_latency": {
                    "type": "string",
                    "description": "Period to collect available results before evaluation.",
                    "pattern": "\\d{1,3}d",
                    "default": "0d"
                  },
                  "priorities": {
                    "type": "array",
                    "$comment": "check for conflicting enums in semantics validation",
                    "items": {
                      "type": "string",
                      "enum": [
                        "first_available"
                      ]
                    },
                    "uniqueItems": true,
                    "default": [
                      "first_available"
                    ]
                  }
                }
              },
              {
                "type": "string",
                "description": "Process and deliver the first available search result in the interval.",
                "enum": [
                  "first_available"
                ]
              }
            ],
            "default": {
              "max_latency": "0d",
              "priorities": [
                "latest",
                "highest_resolution",
                "lowest_cost"
              ]
            }
          },
          "aoi": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/supported-geojson-geometry-2"
              },
              {
                "type": "object",
                "required": [
                  "ref"
                ],
                "additionalProperties": false,
                "properties": {
                  "ref": {
                    "type": "object",
                    "required": [
                      "uri"
                    ],
                    "properties": {
                      "uri": {
                        "type": "string",
                        "format": "uri",
                        "minLength": 1
                      }
                    }
                  }
                }
              }
            ]
          },
          "output": {
            "type": "object",
            "required": [
              "id"
            ],
            "additionalProperties": false,
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "format": {
                "type": "string",
                "enum": [
                  "geotiff"
                ],
                "default": "geotiff"
              },
              "mosaic": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "stitched",
                      "unstitched",
                      "off"
                    ],
                    "default": "unstitched"
                  },
                  {
                    "type": "object",
                    "required": [
                      "type"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "type": {
                        "type": "string",
                        "description": "Type of mosaic to produce.",
                        "enum": [
                          "stitched",
                          "unstitched"
                        ]
                      },
                      "range": {
                        "type": "string",
                        "description": "The range, in days, within the interval that results are constrained to in the mosaic. Only \"1d\" or the interval length are supported. If not specified, default value is interval length",
                        "pattern": "[1-9]\\d{0,2}d"
                      }
                    }
                  }
                ]
              }
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "title": "Tag",
              "required": [
                "label",
                "value"
              ],
              "additionalProperties": false,
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "value": {
                  "type": "string",
                  "minLength": 1
                }
              }
            }
          },
          "status": {
            "$comment": "status.default = inactive if not aoi else active; throws an error if status = active and not aoi",
            "type": "string",
            "enum": [
              "active",
              "inactive"
            ]
          },
          "sources": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "include"
                ],
                "properties": {
                  "include": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "Kompsat-2",
                        "Kompsat-3",
                        "Kompsat-3A",
                        "PlanetScope",
                        "Sentinel-1",
                        "Sentinel-2",
                        "SkySat",
                        "TripleSat",
                        "Pleiades",
                        "Spot",
                        "PlanetScope-SuperDove",
                        "Pleiades-Neo",
                        "Pleiades-Neo-HD15",
                        "USKY01",
                        "NewSat-70cm",
                        "Capella-SLC",
                        "RCM",
                        "Beijing-3N",
                        "Beijing-3A"
                      ]
                    },
                    "minItems": 1
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "required": [
                  "exclude"
                ],
                "properties": {
                  "exclude": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "Kompsat-2",
                        "Kompsat-3",
                        "Kompsat-3A",
                        "PlanetScope",
                        "Sentinel-1",
                        "Sentinel-2",
                        "SkySat",
                        "TripleSat",
                        "Pleiades",
                        "Spot",
                        "PlanetScope-SuperDove",
                        "Pleiades-Neo",
                        "Pleiades-Neo-HD15",
                        "USKY01",
                        "NewSat-70cm",
                        "Capella-SLC",
                        "RCM",
                        "Beijing-3N",
                        "Beijing-3A"
                      ]
                    },
                    "minItems": 1
                  }
                }
              }
            ]
          },
          "search_id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the search that generated the search_results"
          },
          "search_results": {
            "oneOf": [
              {
                "type": "array",
                "description": "List of search results from search_id to generate pipeline from",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              {
                "type": "string",
                "description": "Search result from search_id to generate pipeline from",
                "format": "uuid"
              }
            ]
          },
          "off_nadir_angle": {
            "type": "array",
            "description": "Array containing two numerical values representing the minimum and maximum off-nadir angles, in degrees, within [-90, 90].",
            "items": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "minItems": 2,
            "maxItems": 2,
            "example": [
              -30,
              30
            ]
          }
        }
      },
      "2xx.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/pipeline.resource"
          },
          "links": {
            "type": "array",
            "title": "Links",
            "items": {
              "type": "object",
              "required": [
                "uri"
              ],
              "additionalProperties": false,
              "properties": {
                "uri": {
                  "type": "string",
                  "format": "uri-reference"
                }
              }
            }
          },
          "errors": {
            "type": "array",
            "title": "Errors",
            "description": "Errors list in case of partial success",
            "items": {
              "type": "object",
              "required": [
                "message"
              ],
              "additionalProperties": false,
              "properties": {
                "message": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 512
                }
              }
            }
          }
        }
      },
      "delete-many-pipeline-error": {
        "type": "object",
        "title": "Errors",
        "required": [
          "id",
          "message",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "message": {
            "type": "string",
            "minLength": 1
          },
          "status": {
            "type": "number",
            "minLength": 3
          }
        }
      },
      "2xx-delete-many.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "message",
          "successfully_deleted"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "successfully_deleted": {
            "type": "array",
            "description": "List of pipeline ids successfully deleted",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "errors": {
            "type": "array",
            "description": "List of pipelines that couldn't be deleted (if any)",
            "items": {
              "$ref": "#/components/schemas/delete-many-pipeline-error"
            }
          }
        }
      },
      "Cannot Delete.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "message",
          "errors"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "description": "List of pipelines that couldn't be deleted (if any)",
            "items": {
              "$ref": "#/components/schemas/delete-many-pipeline-error"
            }
          }
        }
      },
      "Bad Request": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "errors"
        ],
        "additionalProperties": false,
        "properties": {
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 512
                }
              }
            }
          }
        }
      },
      "4xx-delete-many-pipelines.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "message",
          "errors"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "description": "List of pipelines that couldn't be deleted (if any)",
            "items": {
              "$ref": "#/components/schemas/delete-many-pipeline-error"
            }
          }
        }
      },
      "pipeline-update": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "Pipeline",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1
          },
          "aoi": {
            "$ref": "#/components/schemas/supported-geojson-geometry-2"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "title": "Tag",
              "required": [
                "label",
                "value"
              ],
              "additionalProperties": false,
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "value": {
                  "type": "string",
                  "minLength": 1
                }
              }
            }
          },
          "status": {
            "$comment": "status.default = inactive if not aoi else active; throws an error if status = active and not aoi",
            "enum": [
              "active",
              "inactive"
            ]
          }
        }
      },
      "supported-geojson-feature": {
        "$schema": "http://json-schema.org/draft-06/schema#",
        "title": "Feature",
        "type": "object",
        "required": [
          "geometry",
          "properties"
        ],
        "properties": {
          "type": {
            "enum": [
              "Feature"
            ]
          },
          "geometry": {
            "$ref": "#/components/schemas/supported-geojson-geometry-2"
          }
        }
      },
      "supported-geojson": {
        "$schema": "http://json-schema.org/draft-06/schema#",
        "title": "GeoJSON Object",
        "type": "object",
        "description": "This object represents a geometry, feature, or collection of features.",
        "additionalProperties": true,
        "required": [
          "type"
        ],
        "oneOf": [
          {
            "type": "object",
            "title": "Feature Collection",
            "required": [
              "type",
              "features"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "FeatureCollection"
                ]
              },
              "features": {
                "title": "Features",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/supported-geojson-feature"
                }
              }
            }
          },
          {
            "$ref": "#/components/schemas/supported-geojson-feature"
          },
          {
            "$ref": "#/components/schemas/supported-geojson-geometry-2"
          }
        ]
      },
      "preview-bbox-geojson-geometry": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "title": "Geometry",
        "description": "Preview Bounding Box GeoJSON Geometry",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "coordinates"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of GeoJSON object.",
            "enum": [
              "Polygon"
            ]
          },
          "coordinates": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "array",
              "title": "Polygons",
              "minItems": 5,
              "items": {
                "type": "array",
                "title": "Long/Lat",
                "maxItems": 2,
                "minItems": 2,
                "items": [
                  {
                    "type": "number",
                    "title": "Longitude",
                    "minimum": -180,
                    "maximum": 180
                  },
                  {
                    "type": "number",
                    "title": "Latitude",
                    "minimum": -90,
                    "maximum": 90
                  }
                ]
              }
            }
          }
        }
      },
      "interval-result.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "IntervalResult - Legacy format",
        "description": "Result information regarding a specific interval.",
        "required": [
          "id",
          "output_id",
          "pipeline_id",
          "status",
          "interval",
          "created_at",
          "updated_at"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "output_id": {
            "type": "string",
            "minLength": 1
          },
          "pipeline_id": {
            "type": "string",
            "minLength": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "requested",
              "scheduled",
              "committed",
              "cancelled",
              "future",
              "failed",
              "waiting",
              "processing",
              "complete",
              "searching",
              "retrieving"
            ]
          },
          "message": {
            "type": "string"
          },
          "interval": {
            "type": "object",
            "required": [
              "start_date",
              "end_date"
            ],
            "properties": {
              "start_date": {
                "format": "date",
                "minLength": 1
              },
              "end_date": {
                "format": "date",
                "minLength": 1
              }
            }
          },
          "total_interval_cost": {
            "type": "number",
            "minimum": 0
          },
          "probability_of_collection": {
            "type": "object",
            "required": [
              "probability_percent"
            ],
            "properties": {
              "probability_percent": {
                "description": "The percentage probability that the data will be collected during the interval",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "probability_reason": {
                "description": "The reason the percentage probability of collection is low",
                "type": "string",
                "minLength": 1
              }
            }
          },
          "overall_metadata": {
            "description": "Metadata containing aggregated values of all of the delivered results",
            "type": "object",
            "required": [
              "scene_height",
              "scene_width",
              "filled_area_km2",
              "filled_area_percentage_of_aoi",
              "cloud_cover_percentage",
              "cloud_cover_percentage_of_aoi",
              "visible_area_km2",
              "visible_area_percentage",
              "visible_area_percentage_of_aoi"
            ],
            "properties": {
              "scene_height": {
                "description": "Height of the overall scene in pixels",
                "type": "number",
                "minimum": 0
              },
              "scene_width": {
                "description": "Width of the overall scene in pixels",
                "type": "number",
                "minimum": 0
              },
              "filled_area_km2": {
                "description": "Area of scene that is filled from the results, in square kilometers",
                "type": "number",
                "minimum": 0
              },
              "filled_area_percentage_of_aoi": {
                "description": "Percentage of the area of interest that is filled from the results",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "cloud_cover_percentage": {
                "description": "Percentage of the filled area that is covered by clouds",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "cloud_cover_percentage_of_aoi": {
                "description": "Percentage of the area of interest that is covered by clouds",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "visible_area_km2": {
                "description": "Area of scene that is visible, in square kilometers",
                "type": "number",
                "minimum": 0
              },
              "visible_area_percentage": {
                "description": "Percentage of the filled area that is visible",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "visible_area_percentage_of_aoi": {
                "description": "Percentage of the area of interest that is visible",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              }
            }
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "title": "Result",
              "properties": {
                "preview_url": {
                  "type": "string",
                  "format": "uri"
                },
                "visual_url": {
                  "type": "string",
                  "format": "uri"
                },
                "analytics_url": {
                  "type": "string",
                  "format": "uri"
                },
                "metadata_url": {
                  "type": "string",
                  "format": "uri"
                },
                "capture_time": {
                  "type": "string",
                  "format": "date-time"
                },
                "vector_files": {
                  "type": "array",
                  "title": "VectorFiles",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "name",
                      "description",
                      "uri"
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "minLength": 1
                      },
                      "description": {
                        "type": "string",
                        "minLength": 1
                      },
                      "uri": {
                        "type": "string",
                        "format": "uri",
                        "minLength": 1
                      }
                    }
                  }
                },
                "raster_files": {
                  "type": "array",
                  "title": "RasterFiles",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "name",
                      "description",
                      "uri"
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "minLength": 1
                      },
                      "description": {
                        "type": "string",
                        "minLength": 1
                      },
                      "uri": {
                        "type": "string",
                        "format": "uri",
                        "minLength": 1
                      }
                    }
                  }
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "processing_applied": {
                      "type": "object",
                      "properties": {
                        "atmospheric_correction_toa": {
                          "type": "boolean"
                        },
                        "pan_sharpening": {
                          "type": "boolean"
                        },
                        "cloud_masking": {
                          "type": "boolean"
                        },
                        "haze_masking": {
                          "type": "boolean"
                        }
                      }
                    },
                    "bands": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "no_data_value": {
                            "type": "number"
                          },
                          "data_type": {
                            "type": "string"
                          },
                          "unit": {
                            "type": "string"
                          },
                          "spectral_wavelength": {
                            "type": "number"
                          },
                          "raster_width": {
                            "type": "number"
                          },
                          "raster_height": {
                            "type": "number"
                          }
                        }
                      }
                    },
                    "resolution_x": {
                      "type": "number"
                    },
                    "resolution_y": {
                      "type": "number"
                    },
                    "map_crs": {
                      "type": "string"
                    },
                    "sensor_mode": {
                      "type": "string"
                    },
                    "source": {
                      "type": "string"
                    },
                    "valid_pixel_percentage": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "cloud_cover_percentage": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "name": {
                      "type": "string"
                    },
                    "size_in_mb": {
                      "type": "number",
                      "minimum": 0
                    },
                    "corner_coordinates": {
                      "type": "array",
                      "items": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "number"
                        }
                      }
                    }
                  }
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "updated_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "product_id": {
                  "type": "string",
                  "description": "Found in the `products` attribute"
                }
              }
            }
          },
          "alternate_search_results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "processing_status"
              ],
              "additionalProperties": false,
              "properties": {
                "index": {
                  "type": "integer",
                  "minimum": 0
                },
                "search_result_id": {
                  "type": "string",
                  "minLength": 36,
                  "maxLength": 36
                },
                "preview_url": {
                  "type": "string",
                  "format": "uri"
                },
                "preview_bbox": {
                  "$ref": "#/components/schemas/preview-bbox-geojson-geometry"
                },
                "capture_date": {
                  "type": "string",
                  "minLength": 10,
                  "maxLength": 10
                },
                "resolution": {
                  "type": "number",
                  "minimum": 0
                },
                "price_per_km2": {
                  "type": "number",
                  "minimum": 0
                },
                "max_interval_cost": {
                  "type": "number",
                  "minimum": 0
                },
                "aoi_coverage_percentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "filled_coverage_percentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "source": {
                  "type": "string",
                  "minLength": 1
                },
                "processing_status": {
                  "type": "string",
                  "minLength": 1
                }
              }
            },
            "additionalItems": false
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "products": {
            "type": "array",
            "items": {
              "type": "object",
              "title": "Product",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "output_id": {
                  "type": "string"
                },
                "tiles": {
                  "type": "array",
                  "title": "Tile names",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "deprecation_notice": {
            "type": "string",
            "description": "This format will be deprecated. Change your code to handle the new format."
          }
        }
      },
      "pagination.fragment": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "per_page",
          "cursor"
        ],
        "additionalProperties": false,
        "properties": {
          "per_page": {
            "type": "integer"
          },
          "cursor": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "next": {
                "type": "string"
              },
              "self": {
                "type": "string"
              }
            }
          }
        }
      },
      "200-list.response-2": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "Legacy format",
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/interval-result.resource"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/pagination.fragment"
          }
        }
      },
      "interval-result-standard.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "IntervalResult - Standard format [Alpha]",
        "description": "This schema is still in alpha stage, and new attributes may be added.",
        "required": [
          "id",
          "pipeline_id",
          "status",
          "interval",
          "created_at",
          "updated_at"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "pipeline_id": {
            "type": "string",
            "minLength": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "requested",
              "scheduled",
              "committed",
              "cancelled",
              "future",
              "failed",
              "waiting",
              "processing",
              "complete",
              "searching",
              "retrieving"
            ]
          },
          "message": {
            "type": "string"
          },
          "interval": {
            "type": "object",
            "required": [
              "start_date",
              "end_date"
            ],
            "properties": {
              "start_date": {
                "format": "date",
                "minLength": 1
              },
              "end_date": {
                "format": "date",
                "minLength": 1
              }
            }
          },
          "total_interval_cost": {
            "type": "number",
            "minimum": 0
          },
          "probability_of_collection": {
            "type": "object",
            "required": [
              "probability_percent"
            ],
            "properties": {
              "probability_percent": {
                "description": "The percentage probability that the data will be collected during the interval",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "probability_reason": {
                "description": "The reason the percentage probability of collection is low",
                "type": "string",
                "minLength": 1
              }
            }
          },
          "overall_metadata": {
            "description": "Metadata containing aggregated values of all of the delivered results",
            "type": "object",
            "required": [
              "scene_height",
              "scene_width",
              "filled_area_km2",
              "filled_area_percentage_of_aoi",
              "cloud_cover_percentage",
              "cloud_cover_percentage_of_aoi",
              "visible_area_km2",
              "visible_area_percentage",
              "visible_area_percentage_of_aoi"
            ],
            "properties": {
              "scene_height": {
                "description": "Height of the overall scene in pixels",
                "type": "number",
                "minimum": 0
              },
              "scene_width": {
                "description": "Width of the overall scene in pixels",
                "type": "number",
                "minimum": 0
              },
              "filled_area_km2": {
                "description": "Area of scene that is filled from the results, in square kilometers",
                "type": "number",
                "minimum": 0
              },
              "filled_area_percentage_of_aoi": {
                "description": "Percentage of the area of interest that is filled from the results",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "cloud_cover_percentage": {
                "description": "Percentage of the filled area that is covered by clouds",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "cloud_cover_percentage_of_aoi": {
                "description": "Percentage of the area of interest that is covered by clouds",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "visible_area_km2": {
                "description": "Area of scene that is visible, in square kilometers",
                "type": "number",
                "minimum": 0
              },
              "visible_area_percentage": {
                "description": "Percentage of the filled area that is visible",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "visible_area_percentage_of_aoi": {
                "description": "Percentage of the area of interest that is visible",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              }
            }
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "title": "Result",
              "properties": {
                "name": {
                  "type": "string"
                },
                "output_id": {
                  "type": "string",
                  "minLength": 1
                },
                "capture_time": {
                  "type": "string",
                  "format": "date-time"
                },
                "resolution_x": {
                  "type": "number"
                },
                "resolution_y": {
                  "type": "number"
                },
                "source": {
                  "type": "string"
                },
                "sensor_mode": {
                  "type": "string"
                },
                "sensor_type": {
                  "type": "string"
                },
                "tiles": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "title": "Tile",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "size_in_mb": {
                        "type": "number",
                        "minimum": 0
                      },
                      "cloud_cover_percentage": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "valid_pixel_percentage": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "created_at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "updated_at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "preview_file": {
                        "type": "string",
                        "format": "uri"
                      },
                      "visual_file": {
                        "type": "string",
                        "format": "uri"
                      },
                      "analytics_file": {
                        "type": "string",
                        "format": "uri"
                      },
                      "metadata_file": {
                        "type": "string",
                        "format": "uri"
                      },
                      "vector_files": {
                        "type": "array",
                        "title": "VectorFiles",
                        "items": {
                          "type": "object",
                          "additionalProperties": false,
                          "required": [
                            "name",
                            "description",
                            "uri"
                          ],
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1
                            },
                            "uri": {
                              "type": "string",
                              "format": "uri",
                              "minLength": 1
                            }
                          }
                        }
                      },
                      "raster_files": {
                        "type": "array",
                        "title": "RasterFiles",
                        "items": {
                          "type": "object",
                          "additionalProperties": false,
                          "required": [
                            "name",
                            "description",
                            "uri"
                          ],
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1
                            },
                            "uri": {
                              "type": "string",
                              "format": "uri",
                              "minLength": 1
                            }
                          }
                        }
                      },
                      "metadata_files": {
                        "type": "array",
                        "title": "MetaFiles",
                        "items": {
                          "type": "object",
                          "additionalProperties": false,
                          "required": [
                            "name",
                            "description",
                            "uri"
                          ],
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "description": {
                              "type": "string",
                              "minLength": 1
                            },
                            "uri": {
                              "type": "string",
                              "format": "uri",
                              "minLength": 1
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "alternate_search_results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "processing_status"
              ],
              "additionalProperties": false,
              "properties": {
                "index": {
                  "type": "integer",
                  "minimum": 0
                },
                "search_result_id": {
                  "type": "string",
                  "minLength": 36,
                  "maxLength": 36
                },
                "preview_url": {
                  "type": "string",
                  "format": "uri"
                },
                "preview_bbox": {
                  "$ref": "#/components/schemas/preview-bbox-geojson-geometry"
                },
                "capture_date": {
                  "type": "string",
                  "minLength": 10,
                  "maxLength": 10
                },
                "resolution": {
                  "type": "number",
                  "minimum": 0
                },
                "price_per_km2": {
                  "type": "number",
                  "minimum": 0
                },
                "max_interval_cost": {
                  "type": "number",
                  "minimum": 0
                },
                "aoi_coverage_percentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "filled_coverage_percentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "source": {
                  "type": "string",
                  "minLength": 1
                },
                "processing_status": {
                  "type": "string",
                  "minLength": 1
                }
              }
            },
            "additionalItems": false
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "200-list-standard.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "Standard format - Alpha",
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/interval-result-standard.resource"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/pagination.fragment"
          }
        }
      },
      "pipeline_calculator.request": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "$id": "specs/schemas/price_caclulator.request.json",
        "type": "object",
        "required": [
          "resolution",
          "location"
        ],
        "properties": {
          "resolution": {
            "description": "Resolution of data to be purchased",
            "type": "string",
            "enum": [
              "low",
              "medium",
              "high",
              "very_high"
            ]
          },
          "location": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/supported-geojson-geometry",
                "description": "Coordinates of location being purchased"
              },
              {
                "type": "object",
                "required": [
                  "ref"
                ],
                "additionalProperties": false,
                "properties": {
                  "ref": {
                    "type": "object",
                    "required": [
                      "uri"
                    ],
                    "properties": {
                      "uri": {
                        "type": "string",
                        "format": "uri",
                        "minLength": 1
                      }
                    }
                  }
                }
              }
            ]
          },
          "start_date": {
            "type": "string",
            "description": "Start date of your collection period",
            "format": "date"
          },
          "end_date": {
            "type": "string",
            "description": "End date of your collection period",
            "format": "date"
          },
          "interval": {
            "description": "Interval of each collection, in days",
            "type": "string",
            "pattern": "[1-9]\\d{0,2}d"
          },
          "tasking": {
            "description": "Is purchase for a tasking request?",
            "type": "boolean",
            "default": false
          },
          "return_probability_of_collection": {
            "description": "Return probability of collection for future intervals",
            "type": "boolean",
            "default": true
          },
          "output": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Output being generated for this location",
                "type": "string",
                "minLength": 1
              }
            }
          },
          "source": {
            "description": "Source of data to be purchased",
            "type": "string"
          }
        }
      },
      "pipeline_calculator.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "$id": "specs/schemas/price_calculator.response.json",
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "plan": {
                "type": "string",
                "description": "Name of plan requestor is on",
                "enum": [
                  "test",
                  "build",
                  "scale"
                ]
              },
              "resolution": {
                "description": "Resolution of data to be purchased",
                "type": "string",
                "enum": [
                  "low",
                  "medium",
                  "high",
                  "very_high"
                ]
              },
              "source": {
                "description": "Source of data to be purchased",
                "type": "string"
              },
              "area_km2": {
                "description": "Quantity of data to be purchased in square kilometers",
                "type": "number",
                "minimum": 0
              },
              "archive": {
                "description": "Price and costing information for archive data",
                "type": "object",
                "properties": {
                  "price_km2": {
                    "description": "Price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0
                  },
                  "minimum_area_km2": {
                    "description": "Minimum area that will be billed for requested resolution, in square kilometers",
                    "type": "number",
                    "minimum": 0
                  },
                  "discount_price_km2": {
                    "description": "Discounted price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "interval_quantity": {
                    "description": "Number of intervals requiring archive data",
                    "type": "number",
                    "minimum": 0
                  },
                  "interval_cost": {
                    "description": "Cost in USD of archive data for one interval to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  },
                  "max_cost": {
                    "description": "Maximum cost in USD of archive data for all intervals to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  }
                }
              },
              "tasking": {
                "description": "Price and costing information for tasking data",
                "type": "object",
                "properties": {
                  "price_km2": {
                    "description": "Price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0
                  },
                  "minimum_area_km2": {
                    "description": "Minimum area that will be billed for requested resolution, in square kilometers",
                    "type": "number",
                    "minimum": 0
                  },
                  "discount_price_km2": {
                    "description": "Discounted price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "interval_quantity": {
                    "description": "Number of intervals requiring tasking data",
                    "type": "number",
                    "minimum": 0
                  },
                  "interval_cost": {
                    "description": "Cost in USD of tasking data for one interval to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  },
                  "max_cost": {
                    "description": "Maximum cost in USD of tasking data for all intervals to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  },
                  "probability_of_collection": {
                    "description": "Probability of collection information for each tasking interval",
                    "type": "array",
                    "items": {
                      "type": "object",
                      "title": "Probability of Collection",
                      "required": [
                        "interval_start",
                        "interval_end",
                        "probability_percent"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "interval_start": {
                          "type": "string",
                          "description": "Interval start date",
                          "format": "date"
                        },
                        "interval_end": {
                          "type": "string",
                          "description": "Interval end date",
                          "format": "date"
                        },
                        "probability_percent": {
                          "description": "Precentage probability that collection will happen during interval",
                          "type": "number",
                          "minimum": 0
                        },
                        "probability_reason": {
                          "description": "Reason why probability of collection is low",
                          "type": "string",
                          "minLength": 1
                        }
                      }
                    }
                  }
                }
              },
              "max_cost": {
                "description": "Maximum cost in USD of all archive and tasking data to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                "type": "number",
                "minimum": 0
              },
              "prepurchase_balance": {
                "description": "Balance in USD of prepurchase amount remaining at the end of the last invoice period",
                "type": "number",
                "minimum": 0
              }
            }
          }
        }
      },
      "price_calculator.request": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "resolution",
          "location"
        ],
        "properties": {
          "resolution": {
            "description": "Resolution of data to be purchased",
            "type": "string",
            "enum": [
              "low",
              "medium",
              "high",
              "very_high"
            ]
          },
          "location": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Polygon",
                "description": "Coordinates of location being purchased"
              },
              {
                "type": "object",
                "required": [
                  "ref"
                ],
                "additionalProperties": false,
                "properties": {
                  "ref": {
                    "type": "object",
                    "required": [
                      "uri"
                    ],
                    "properties": {
                      "uri": {
                        "type": "string",
                        "format": "uri",
                        "minLength": 1
                      }
                    }
                  }
                }
              }
            ]
          },
          "start_date": {
            "type": "string",
            "description": "Start date of your collection period",
            "format": "date"
          },
          "end_date": {
            "type": "string",
            "description": "End date of your collection period",
            "format": "date"
          },
          "interval": {
            "description": "Interval of each collection, in days",
            "type": "string",
            "pattern": "[1-9]\\d{0,2}d"
          },
          "tasking": {
            "description": "Is purchase for a tasking request?",
            "type": "boolean",
            "default": false
          },
          "source": {
            "description": "Source of data to be purchased",
            "type": "string"
          }
        }
      },
      "price_calculator.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "$id": "specs/schemas/price_calculator.response.json",
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "plan": {
                "type": "string",
                "description": "Name of plan requestor is on",
                "enum": [
                  "test",
                  "build",
                  "scale"
                ]
              },
              "resolution": {
                "description": "Resolution of data to be purchased",
                "type": "string",
                "enum": [
                  "low",
                  "medium",
                  "high",
                  "very_high"
                ]
              },
              "source": {
                "description": "Source of data to be purchased",
                "type": "string"
              },
              "area_km2": {
                "description": "Quantity of data to be purchased in square kilometers",
                "type": "number",
                "minimum": 0
              },
              "archive": {
                "description": "Price and costing information for archive data",
                "type": "object",
                "properties": {
                  "price_km2": {
                    "description": "Price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0
                  },
                  "minimum_area_km2": {
                    "description": "Minimum area that will be billed for requested resolution, in square kilometers",
                    "type": "number",
                    "minimum": 0
                  },
                  "discount_price_km2": {
                    "description": "Discounted price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "interval_quantity": {
                    "description": "Number of intervals requiring archive data",
                    "type": "number",
                    "minimum": 0
                  },
                  "interval_cost": {
                    "description": "Cost in USD of archive data for one interval to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  },
                  "max_cost": {
                    "description": "Maximum cost in USD of archive data for all intervals to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  }
                }
              },
              "tasking": {
                "description": "Price and costing information for tasking data",
                "type": "object",
                "properties": {
                  "price_km2": {
                    "description": "Price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0
                  },
                  "minimum_area_km2": {
                    "description": "Minimum area that will be billed for requested resolution, in square kilometers",
                    "type": "number",
                    "minimum": 0
                  },
                  "discount_price_km2": {
                    "description": "Discounted price of specified resolution in USD per square kilometer",
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "interval_quantity": {
                    "description": "Number of intervals requiring tasking data",
                    "type": "number",
                    "minimum": 0
                  },
                  "interval_cost": {
                    "description": "Cost in USD of tasking data for one interval to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  },
                  "max_cost": {
                    "description": "Maximum cost in USD of tasking data for all intervals to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                    "type": "number",
                    "minimum": 0
                  }
                }
              },
              "max_cost": {
                "description": "Maximum cost in USD of all archive and tasking data to be purchased at requested resolution. Price includes discounts and minimum purchase requirements",
                "type": "number",
                "minimum": 0
              },
              "prepurchase_balance": {
                "description": "Balance in USD of prepurchase amount remaining at the end of the last invoice period",
                "type": "number",
                "minimum": 0
              }
            }
          }
        }
      },
      "price.response": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "$id": "specs/schemas/price.response.json",
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "plan": {
                "type": "string",
                "description": "Name of plan requestor is on",
                "enum": [
                  "test",
                  "build",
                  "scale"
                ]
              },
              "prepurchase_balance": {
                "description": "Balance in USD of prepurchase credit remaining as of last invoice",
                "type": "number",
                "minimum": 0
              },
              "prices": {
                "description": "Price information for requesting users plan",
                "type": "array",
                "items": {
                  "type": "object",
                  "title": "Price Information",
                  "required": [
                    "resolution",
                    "archive_price_km2",
                    "archive_minimum_area_km2"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "resolution": {
                      "description": "Resolution of data to be purchased",
                      "type": "string",
                      "enum": [
                        "low",
                        "medium",
                        "high",
                        "very_high"
                      ]
                    },
                    "source": {
                      "description": "Source of data to be purchased",
                      "type": "string"
                    },
                    "archive_discount_price_km2": {
                      "description": "Discounted price of specified resolution in USD per square kilometer if requestor has prepurchased archive data",
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "tasking_discount_price_km2": {
                      "description": "Discounted price of specified resolution in USD per square kilometer if requestor has prepurchased tasking data",
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "archive_price_km2": {
                      "description": "Archive price of specified resolution in USD per square kilometer",
                      "type": "number",
                      "minimum": 0
                    },
                    "archive_minimum_area_km2": {
                      "description": "Minimum area that will be billed for achive data of indicated resolution, in square kilometers",
                      "type": "number",
                      "minimum": 0
                    },
                    "tasking_price_km2": {
                      "description": "Tasking price of specified resolution in USD per square kilometer",
                      "type": "number",
                      "minimum": 0
                    },
                    "tasking_minimum_area_km2": {
                      "description": "Minimum area that will be billed for tasking data of indicated resolution, in square kilometers",
                      "type": "number",
                      "minimum": 0
                    }
                  }
                }
              }
            }
          }
        }
      },
      "output.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "title": "Output",
        "required": [
          "id",
          "name",
          "provider"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "private": {
            "type": "boolean"
          },
          "cover_image": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "url"
            ],
            "properties": {
              "url": {
                "type": "string",
                "minLength": 1,
                "format": "uri"
              },
              "alt_text": {
                "type": "string",
                "minLength": 0
              }
            }
          },
          "provider": {
            "type": "object",
            "required": [
              "name"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "logo_url": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "200-list.response-3": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/output.resource"
            }
          }
        }
      },
      "2xx.response-2": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/output.resource"
          }
        }
      },
      "subscription.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "id",
          "events",
          "callback_uri",
          "status",
          "created_at",
          "updated_at"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36
          },
          "events": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "pipeline-complete",
                "pipeline-complete-with-results",
                "pipeline-complete-no-results",
                "pipeline-create",
                "pipeline-interval-processing",
                "pipeline-interval-ordering",
                "pipeline-interval-failure",
                "pipeline-interval-tasking-order-committed",
                "pipeline-interval-tasking-order-cancelled"
              ]
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive"
            ]
          },
          "callback_uri": {
            "type": "string",
            "format": "uri"
          },
          "callback_headers": {
            "type": "object",
            "additionalProperties": false,
            "patternProperties": {
              "^[a-zA-z0-9_\\-]+$": {
                "type": "string",
                "minLength": 1
              }
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "200-list.response-4": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/subscription.resource"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/pagination.fragment"
          }
        }
      },
      "subscription-create": {
        "$schema": "http://json-schema.org/draft-07/schema",
        "type": "object",
        "required": [
          "events",
          "callback_uri"
        ],
        "additionalProperties": false,
        "properties": {
          "events": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "pipeline-complete",
                "pipeline-complete-with-results",
                "pipeline-complete-no-results",
                "pipeline-create",
                "pipeline-interval-processing",
                "pipeline-interval-ordering",
                "pipeline-interval-failure",
                "pipeline-interval-tasking-order-committed",
                "pipeline-interval-tasking-order-cancelled"
              ]
            }
          },
          "secret": {
            "type": "string",
            "description": "When your `secret` token is set, a hash signature is created with each payload. This hash signature is included with the headers of each request as `x-ec-signature-256`. \n\nThe intention is to calculate a hash of the payload received using your `secret` token, and check that the hash matches the one from EarthCache."
          },
          "callback_uri": {
            "type": "string"
          },
          "callback_headers": {
            "type": "object",
            "additionalProperties": false,
            "patternProperties": {
              "^[a-zA-z0-9_\\-]+$": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        }
      },
      "2xx.response-3": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/subscription.resource"
          }
        }
      },
      "subscription-update": {
        "$schema": "http://json-schema.org/draft-07/schema",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "events": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "pipeline-complete",
                "pipeline-complete-with-results",
                "pipeline-complete-no-results",
                "pipeline-create",
                "pipeline-interval-processing",
                "pipeline-interval-ordering",
                "pipeline-interval-failure",
                "pipeline-interval-tasking-order-committed",
                "pipeline-interval-tasking-order-cancelled"
              ]
            }
          },
          "secret": {
            "type": "string",
            "description": "When your `secret` token is set, a hash signature is created with each payload. This hash signature is included with the headers of each request as `x-ec-signature-256`. \n\nThe intention is to calculate a hash of the payload received using your `secret` token, and check that the hash matches the one from EarthCache. "
          },
          "callback_uri": {
            "type": "string",
            "minLength": 1,
            "format": "uri"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive"
            ]
          },
          "callback_headers": {
            "type": "object",
            "additionalProperties": false,
            "patternProperties": {
              "^[a-zA-z0-9_\\-]+$": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        }
      },
      "callback.resource": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "id",
          "subscription_id",
          "event",
          "created_at",
          "uri",
          "request",
          "response"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 36
          },
          "subscription_id": {
            "type": "string",
            "minLength": 1
          },
          "event": {
            "type": "string",
            "enum": [
              "pipeline-complete",
              "pipeline-complete-with-results",
              "pipeline-complete-no-results",
              "pipeline-create",
              "pipeline-interval-processing",
              "pipeline-interval-ordering",
              "pipeline-interval-failure",
              "pipeline-interval-tasking-order-committed",
              "pipeline-interval-tasking-order-cancelled"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "uri": {
            "type": "string",
            "format": "uri"
          },
          "request": {
            "type": "object",
            "required": [
              "body",
              "method"
            ],
            "additionalProperties": false,
            "properties": {
              "body": {
                "type": "string"
              },
              "headers": {
                "type": "object"
              },
              "method": {
                "type": "string",
                "example": "post"
              }
            }
          },
          "response": {
            "type": "object",
            "required": [
              "status"
            ],
            "additionalProperties": false,
            "properties": {
              "status": {
                "type": "integer",
                "minimum": 100,
                "maximum": 599,
                "example": 204
              },
              "body": {}
            }
          }
        }
      },
      "200-list.response-5": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/callback.resource"
            }
          },
          "pagination": {
            "type": "object",
            "required": [
              "per_page",
              "cursor"
            ],
            "additionalProperties": false,
            "properties": {
              "per_page": {
                "type": "integer"
              },
              "cursor": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "next": {
                    "type": "string"
                  },
                  "self": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the user"
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "User's email address"
          },
          "first_name": {
            "type": "string",
            "description": "User's first name"
          },
          "last_name": {
            "type": "string",
            "description": "User's last name"
          },
          "role": {
            "$ref": "#/components/schemas/UserRole"
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "List of project IDs the user has access to"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when the user was created"
          }
        },
        "required": [
          "id",
          "email",
          "role"
        ]
      },
      "UserRole": {
        "type": "string",
        "enum": [
          "super_admin",
          "creator",
          "reader"
        ],
        "description": "User role within the Hub organization. super_admin can manage all resources, creator can create orders, reader has view-only access."
      },
      "PaymentMethod": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the payment method"
          },
          "type": {
            "type": "string",
            "enum": [
              "credit_card",
              "invoice",
              "purchase_order"
            ],
            "description": "Type of payment method"
          },
          "name": {
            "type": "string",
            "description": "Display name for the payment method"
          },
          "is_default": {
            "type": "boolean",
            "description": "Whether this is the default payment method"
          },
          "last_four": {
            "type": "string",
            "description": "Last four digits of card (for credit cards)",
            "nullable": true
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "Expiration date (for credit cards)",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when the payment method was added"
          }
        },
        "required": [
          "id",
          "type",
          "name",
          "is_default"
        ]
      },
      "Project": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the project"
          },
          "name": {
            "type": "string",
            "description": "Project name"
          },
          "description": {
            "type": "string",
            "description": "Project description",
            "nullable": true
          },
          "payment_method_id": {
            "type": "string",
            "format": "uuid",
            "description": "Payment method associated with this project"
          },
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/User"
            },
            "description": "Users assigned to this project"
          },
          "total_spend": {
            "type": "number",
            "format": "double",
            "description": "Total amount spent on this project in USD"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when the project was created"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when the project was last updated"
          }
        },
        "required": [
          "id",
          "name",
          "payment_method_id"
        ]
      },
      "ProjectCreate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Project name",
            "minLength": 1
          },
          "description": {
            "type": "string",
            "description": "Project description"
          },
          "payment_method_id": {
            "type": "string",
            "format": "uuid",
            "description": "Payment method to associate with this project"
          }
        },
        "required": [
          "name",
          "payment_method_id"
        ]
      },
      "ProjectUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Updated project name"
          },
          "description": {
            "type": "string",
            "description": "Updated project description"
          },
          "payment_method_id": {
            "type": "string",
            "format": "uuid",
            "description": "Updated payment method"
          }
        }
      },
      "ProjectUserAdd": {
        "type": "object",
        "properties": {
          "user_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the user to add to the project"
          }
        },
        "required": [
          "user_id"
        ]
      },
      "Offering": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the offering"
          },
          "name": {
            "type": "string",
            "description": "Offering name"
          },
          "type": {
            "$ref": "#/components/schemas/OfferingType"
          },
          "provider": {
            "type": "string",
            "description": "Satellite imagery provider (e.g., Maxar, Planet, Airbus)"
          },
          "resolution": {
            "type": "number",
            "format": "double",
            "description": "Ground sample distance in meters"
          },
          "bands": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Available spectral bands"
          },
          "min_area_km2": {
            "type": "number",
            "format": "double",
            "description": "Minimum orderable area in square kilometers"
          },
          "price_per_km2": {
            "type": "number",
            "format": "double",
            "description": "Base price per square kilometer in USD"
          }
        },
        "required": [
          "id",
          "name",
          "type",
          "provider",
          "resolution"
        ]
      },
      "Product": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the product"
          },
          "partner_name": {
            "type": "string",
            "description": "Name of the partner providing the product"
          },
          "product_name": {
            "type": "string",
            "description": "Name of the product"
          },
          "resolution": {
            "type": "number",
            "format": "double",
            "description": "Ground sample distance in meters"
          },
          "bands": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Available spectral bands"
          },
          "offerings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferingDetail"
            },
            "description": "Available offerings for this product"
          },
          "properties": {
            "$ref": "#/components/schemas/ProductProperties",
            "description": "Additional product properties"
          },
          "subcategory": {
            "type": "string",
            "nullable": true,
            "description": "Product subcategory"
          }
        },
        "required": [
          "product_id",
          "partner_name",
          "product_name",
          "resolution",
          "bands",
          "offerings"
        ]
      },
      "OfferingDetail": {
        "type": "object",
        "properties": {
          "offering_id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the offering"
          },
          "offering_name": {
            "type": "string",
            "description": "Name of the offering"
          },
          "configurations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Configuration"
            },
            "description": "Available configurations for this offering"
          },
          "purchase_options": {
            "$ref": "#/components/schemas/PurchaseOptions",
            "description": "Available purchase options"
          },
          "on_platform": {
            "type": "boolean",
            "description": "Whether the offering is available on the platform"
          },
          "category": {
            "type": "string",
            "description": "Category of the offering (e.g., archive, tasking)"
          }
        },
        "required": [
          "offering_id",
          "offering_name",
          "configurations",
          "on_platform",
          "category"
        ]
      },
      "Configuration": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the configuration"
          },
          "name": {
            "type": "string",
            "description": "Name of the configuration"
          },
          "is_default": {
            "type": "boolean",
            "description": "Whether this is the default configuration"
          },
          "is_standard": {
            "type": "boolean",
            "description": "Whether this is a standard configuration"
          },
          "properties": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ConfigurationProperty"
                },
                "description": "Array of configuration properties"
              }
            },
            "description": "Configuration properties"
          },
          "parameters": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ConfigurationParameter"
                },
                "description": "Array of configuration parameters"
              }
            },
            "description": "Configuration parameters"
          }
        },
        "required": [
          "id"
        ]
      },
      "ConfigurationProperty": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the property"
          },
          "name": {
            "type": "string",
            "description": "Property name"
          },
          "value": {
            "description": "Property value (can be any type)"
          },
          "type": {
            "type": "string",
            "description": "Property data type"
          },
          "default": {
            "description": "Default value for the property"
          },
          "display": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string",
                "description": "Display label for the property"
              },
              "type": {
                "type": "string",
                "description": "Display type (e.g., text, select, number)"
              },
              "description": {
                "type": "string",
                "description": "Description of the property"
              },
              "design_component": {
                "type": "string",
                "description": "UI component to use for rendering (e.g., text, list)"
              },
              "tooltip": {
                "type": "string",
                "description": "Tooltip text for the property"
              },
              "placeholder": {
                "type": "string",
                "description": "Placeholder text for input fields"
              },
              "order": {
                "type": "integer",
                "description": "Display order"
              }
            },
            "description": "Display metadata for UI rendering"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "ConfigurationParameter": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the parameter"
          },
          "name": {
            "type": "string",
            "description": "Parameter name"
          },
          "value": {
            "description": "Parameter value (can be any type)"
          },
          "type": {
            "type": "string",
            "description": "Parameter data type"
          },
          "default": {
            "description": "Default value for the parameter"
          },
          "range": {
            "type": "object",
            "properties": {
              "min": {
                "type": "number",
                "description": "Minimum value"
              },
              "max": {
                "type": "number",
                "description": "Maximum value"
              },
              "step": {
                "type": "number",
                "description": "Step increment"
              }
            },
            "description": "Valid range for numeric parameters"
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Valid values for enum-like parameters"
          },
          "display": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string",
                "description": "Display label for the parameter"
              },
              "type": {
                "type": "string",
                "description": "Display type (e.g., slider, select, text)"
              },
              "tooltip": {
                "type": "string",
                "description": "Tooltip text for the parameter"
              },
              "placeholder": {
                "type": "string",
                "description": "Placeholder text for input fields"
              },
              "order": {
                "type": "integer",
                "description": "Display order"
              }
            },
            "description": "Display metadata for UI rendering"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "PurchaseOptions": {
        "type": "object",
        "description": "Available purchase options for the offering",
        "additionalProperties": true
      },
      "ProductProperties": {
        "type": "object",
        "description": "Additional properties for the product",
        "additionalProperties": true
      },
      "OfferingDetailsResponse": {
        "type": "object",
        "properties": {
          "offering_id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the offering"
          },
          "offering_name": {
            "type": "string",
            "description": "Name of the offering"
          },
          "description": {
            "type": "string",
            "description": "Description of the offering"
          },
          "properties": {
            "type": "object",
            "properties": {
              "samples": {
                "type": "array",
                "items": {},
                "description": "Sample images or data for the offering"
              }
            },
            "description": "Additional offering properties"
          },
          "configurations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Configuration"
            },
            "description": "Available configurations for this offering"
          },
          "supported_applications": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Applications that support this offering (e.g., explore, hub, api)"
          },
          "purchase_options": {
            "$ref": "#/components/schemas/PurchaseOptions",
            "description": "Available purchase options"
          },
          "category": {
            "type": "string",
            "description": "Category of the offering (e.g., archive, tasking)"
          },
          "min_date_range": {
            "type": "string",
            "nullable": true,
            "description": "Minimum date range for the offering"
          },
          "max_date_range": {
            "type": "string",
            "nullable": true,
            "description": "Maximum date range for the offering"
          },
          "is_default": {
            "type": "boolean",
            "description": "Whether this is the default offering"
          },
          "lead_time": {
            "type": "string",
            "nullable": true,
            "description": "Lead time for the offering"
          },
          "priority": {
            "type": "string",
            "description": "Priority level (e.g., standard, high)"
          }
        },
        "required": [
          "offering_id",
          "offering_name",
          "configurations",
          "category"
        ]
      },
      "OfferingType": {
        "type": "string",
        "enum": [
          "archive",
          "tasking"
        ],
        "description": "Type of imagery offering. archive for historical imagery, tasking for new collections."
      },
      "FeasibilityRequest": {
        "type": "object",
        "properties": {
          "offering_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the tasking offering to check"
          },
          "aoi": {
            "type": "object",
            "description": "Area of interest as GeoJSON Polygon or MultiPolygon"
          },
          "start_date": {
            "type": "string",
            "format": "date-time",
            "description": "Earliest acceptable collection time"
          },
          "end_date": {
            "type": "string",
            "format": "date-time",
            "description": "Latest acceptable collection time"
          },
          "max_cloud_cover": {
            "type": "number",
            "format": "double",
            "minimum": 0,
            "maximum": 100,
            "description": "Maximum acceptable cloud cover percentage"
          }
        },
        "required": [
          "offering_id",
          "aoi",
          "start_date",
          "end_date"
        ]
      },
      "FeasibilityResponse": {
        "type": "object",
        "properties": {
          "feasible": {
            "type": "boolean",
            "description": "Whether the tasking request is feasible"
          },
          "collection_windows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "start": {
                  "type": "string",
                  "format": "date-time"
                },
                "end": {
                  "type": "string",
                  "format": "date-time"
                },
                "confidence": {
                  "type": "string",
                  "enum": [
                    "high",
                    "medium",
                    "low"
                  ]
                }
              }
            },
            "description": "Potential collection time windows"
          },
          "estimated_delivery": {
            "type": "string",
            "format": "date-time",
            "description": "Estimated delivery date",
            "nullable": true
          },
          "message": {
            "type": "string",
            "description": "Additional information about feasibility",
            "nullable": true
          }
        },
        "required": [
          "feasible"
        ]
      },
      "CostRequest": {
        "type": "object",
        "properties": {
          "offering_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the offering"
          },
          "aoi": {
            "type": "object",
            "description": "Area of interest as GeoJSON Polygon or MultiPolygon"
          }
        },
        "required": [
          "offering_id",
          "aoi"
        ]
      },
      "CostResponse": {
        "type": "object",
        "properties": {
          "area_km2": {
            "type": "number",
            "format": "double",
            "description": "Total area in square kilometers"
          },
          "base_cost": {
            "type": "number",
            "format": "double",
            "description": "Base cost in USD"
          },
          "processing_cost": {
            "type": "number",
            "format": "double",
            "description": "Additional processing costs in USD"
          },
          "total_cost": {
            "type": "number",
            "format": "double",
            "description": "Total estimated cost in USD"
          },
          "currency": {
            "type": "string",
            "default": "USD"
          }
        },
        "required": [
          "area_km2",
          "base_cost",
          "total_cost"
        ]
      },
      "Order": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the order"
          },
          "offering_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the offering used for this order"
          },
          "project_id": {
            "type": "string",
            "format": "uuid",
            "description": "Project this order belongs to"
          },
          "aoi": {
            "type": "object",
            "description": "Area of interest as GeoJSON"
          },
          "status": {
            "$ref": "#/components/schemas/OrderStatus"
          },
          "total_cost": {
            "type": "number",
            "format": "double",
            "description": "Total order cost in USD"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Order creation timestamp"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Last update timestamp"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "description": "Order completion timestamp",
            "nullable": true
          },
          "metadata": {
            "type": "object",
            "description": "Additional order metadata",
            "nullable": true
          }
        },
        "required": [
          "id",
          "offering_id",
          "project_id",
          "aoi",
          "status",
          "total_cost"
        ]
      },
      "OrderStatus": {
        "type": "string",
        "enum": [
          "pending",
          "processing",
          "completed",
          "failed",
          "cancelled"
        ],
        "description": "Current status of the order"
      },
      "OrderCreate": {
        "type": "object",
        "properties": {
          "offering_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the offering to order"
          },
          "project_id": {
            "type": "string",
            "format": "uuid",
            "description": "Project to associate this order with"
          },
          "aoi": {
            "type": "object",
            "description": "Area of interest as GeoJSON Polygon or MultiPolygon"
          },
          "filters": {
            "type": "object",
            "description": "Additional filtering parameters (cloud cover, date range, etc.)",
            "nullable": true
          },
          "processing_options": {
            "type": "object",
            "description": "Processing options (orthorectification, pansharpening, etc.)",
            "nullable": true
          }
        },
        "required": [
          "offering_id",
          "project_id",
          "aoi"
        ]
      },
      "DirectViewResponse": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL to access DirectView in the browser"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the DirectView URL expires"
          }
        },
        "required": [
          "url",
          "expires_at"
        ]
      },
      "WMTSInfo": {
        "type": "object",
        "properties": {
          "capabilities_url": {
            "type": "string",
            "format": "uri",
            "description": "WMTS GetCapabilities endpoint"
          },
          "layer_name": {
            "type": "string",
            "description": "WMTS layer name for this order"
          },
          "tile_matrix_set": {
            "type": "string",
            "description": "Tile matrix set identifier"
          },
          "bounds": {
            "type": "object",
            "description": "Bounding box of the layer",
            "properties": {
              "minx": {
                "type": "number"
              },
              "miny": {
                "type": "number"
              },
              "maxx": {
                "type": "number"
              },
              "maxy": {
                "type": "number"
              }
            }
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "When WMTS access expires"
          }
        },
        "required": [
          "capabilities_url",
          "layer_name",
          "tile_matrix_set"
        ]
      }
    }
  }
}