{
  "swagger": "2.0",
  "info": {
    "title": "Containerized extractor service, Ingest service, Native extractor service, Streaming session service",
    "version": "0.1507.0",
    "description": "Send your API key as a bearer token: `Authorization: Bearer <api key>`."
  },
  "tags": [
    {
      "name": "ContainerizedExtractorService",
      "x-displayName": "Containerized extractor service",
      "description": "Manages containerized extractors backed by self-hosted images in the internal registry."
    },
    {
      "name": "IngestService",
      "x-displayName": "Ingest service",
      "description": "Starts V2 ingest jobs and returns the RID used to track asynchronous progress."
    },
    {
      "name": "NativeExtractorService",
      "x-displayName": "Native extractor service",
      "description": "Workspace-facing surface for enabling and converging native catalog extractors."
    },
    {
      "name": "StreamingSessionService",
      "x-displayName": "Streaming session service",
      "description": "Provides read access to streaming sessions and their sources.",
      "x-errors": [
        {
          "status": 400,
          "errorCode": "INVALID_ARGUMENT",
          "errorName": "NominalIngestV2:StreamingSessionErrorFilterTooComplex",
          "message": "A streaming search filter may contain at most 1000 nodes and 32 nested levels."
        }
      ]
    }
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/extractors/v2": {
      "post": {
        "operationId": "ContainerizedExtractorService_CreateContainerizedExtractor",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/CreateContainerizedExtractorResponse"
            },
            "x-example": {
              "extractor": {
                "rid": "<rid>",
                "workspaceRid": "<workspace rid>",
                "name": "<name>",
                "description": "<description>",
                "createdAt": "2026-01-01T00:00:00Z",
                "isArchived": true,
                "activeContainerImage": {
                  "rid": "<rid>",
                  "tag": "<tag>",
                  "sizeBytes": "1",
                  "status": "CONTAINER_IMAGE_STATUS_PENDING",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "extractorRid": "<extractor rid>",
                  "inputs": [
                    {
                      "environmentVariable": "<environment variable>",
                      "name": "<name>",
                      "description": "<description>",
                      "fileFilters": [
                        {
                          "suffix": {
                            "suffix": "<suffix>"
                          }
                        }
                      ],
                      "required": true
                    }
                  ],
                  "parameters": [
                    {
                      "environmentVariable": "<environment variable>",
                      "name": "<name>",
                      "description": "<description>",
                      "required": true
                    }
                  ],
                  "fileOutputFormat": "FILE_OUTPUT_FORMAT_PARQUET",
                  "defaultTimestampMetadata": {
                    "seriesName": "<series name>",
                    "timestampType": {
                      "relative": {
                        "timeUnit": "<time unit>",
                        "offset": "2026-01-01T00:00:00Z"
                      }
                    }
                  },
                  "exitCodeMappings": [
                    {
                      "exitCode": 1,
                      "code": "<code>",
                      "message": "<message>",
                      "retryable": true
                    }
                  ],
                  "resources": {
                    "cpuCores": 1,
                    "memoryGib": 1,
                    "diskGib": 1
                  }
                },
                "origin": "EXTRACTOR_ORIGIN_CUSTOMER",
                "catalogId": "<catalog id>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ]
              }
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "description": "Request to create a new self-hosted containerized extractor in a workspace. Schema fields (inputs / parameters / output format / timestamp metadata) are supplied with each container image via RegistryService.CreateImage and not on the extractor itself.",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreateContainerizedExtractorRequest"
            },
            "x-example": {
              "workspaceRid": "<workspace rid>",
              "name": "<name>"
            }
          }
        ],
        "tags": [
          "ContainerizedExtractorService"
        ],
        "summary": "Create containerized extractor",
        "description": "Create a new extractor in a workspace. Container images are attached separately via RegistryService.CreateImage."
      }
    },
    "/extractors/v2/native": {
      "get": {
        "operationId": "NativeExtractorService_ListNativeExtractors",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/ListNativeExtractorsResponse"
            },
            "x-example": {
              "extractors": [
                {
                  "catalogId": "<catalog id>",
                  "availableVersions": [
                    "<available versions>"
                  ],
                  "installation": {
                    "rid": "<rid>",
                    "workspaceRid": "<workspace rid>",
                    "name": "<name>",
                    "description": "<description>",
                    "createdAt": "2026-01-01T00:00:00Z",
                    "isArchived": true,
                    "activeContainerImage": {
                      "rid": "<rid>",
                      "tag": "<tag>",
                      "sizeBytes": "1",
                      "status": "CONTAINER_IMAGE_STATUS_PENDING",
                      "createdAt": "2026-01-01T00:00:00Z",
                      "extractorRid": "<extractor rid>",
                      "inputs": [
                        {
                          "environmentVariable": "<environment variable>",
                          "name": "<name>",
                          "description": "<description>",
                          "fileFilters": [
                            {
                              "suffix": {
                                "suffix": "<suffix>"
                              }
                            }
                          ],
                          "required": true
                        }
                      ],
                      "parameters": [
                        {
                          "environmentVariable": "<environment variable>",
                          "name": "<name>",
                          "description": "<description>",
                          "required": true
                        }
                      ],
                      "fileOutputFormat": "FILE_OUTPUT_FORMAT_PARQUET",
                      "defaultTimestampMetadata": {
                        "seriesName": "<series name>",
                        "timestampType": {
                          "relative": {
                            "timeUnit": "<time unit>",
                            "offset": "2026-01-01T00:00:00Z"
                          }
                        }
                      },
                      "exitCodeMappings": [
                        {
                          "exitCode": 1,
                          "code": "<code>",
                          "message": "<message>",
                          "retryable": true
                        }
                      ],
                      "resources": {
                        "cpuCores": 1,
                        "memoryGib": 1,
                        "diskGib": 1
                      }
                    },
                    "origin": "EXTRACTOR_ORIGIN_CUSTOMER",
                    "catalogId": "<catalog id>",
                    "properties": {
                      "<key>": "<value>"
                    },
                    "labels": [
                      "<labels>"
                    ]
                  },
                  "desiredVersion": "<desired version>",
                  "displayName": "<display name>",
                  "description": "<description>"
                }
              ],
              "nextPageToken": "<next page token>"
            }
          }
        },
        "parameters": [
          {
            "name": "workspaceRid",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "pageSize",
            "in": "query",
            "required": true,
            "type": "integer",
            "format": "int32",
            "minimum": 1,
            "maximum": 1000,
            "x-constraints": [
              "From 1 to 1,000."
            ]
          },
          {
            "name": "nextPageToken",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "tags": [
          "NativeExtractorService"
        ],
        "summary": "List native extractors",
        "description": "Lists every catalog entry the deployment carries with this workspace's installation state."
      }
    },
    "/extractors/v2/native/{catalogId}/disable": {
      "post": {
        "operationId": "NativeExtractorService_DisableNativeExtractor",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/DisableNativeExtractorResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "catalogId",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/DisableNativeExtractorBody"
            },
            "x-example": {
              "workspaceRid": "<workspace rid>"
            }
          }
        ],
        "tags": [
          "NativeExtractorService"
        ],
        "summary": "Disable native extractor",
        "description": "Archives the workspace's extractor, which is the installation; re-enabling unarchives it."
      }
    },
    "/extractors/v2/native/{catalogId}/enable": {
      "post": {
        "operationId": "NativeExtractorService_EnableNativeExtractor",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/EnableNativeExtractorResponse"
            },
            "x-example": {
              "extractor": {
                "catalogId": "<catalog id>",
                "availableVersions": [
                  "<available versions>"
                ],
                "installation": {
                  "rid": "<rid>",
                  "workspaceRid": "<workspace rid>",
                  "name": "<name>",
                  "description": "<description>",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "isArchived": true,
                  "activeContainerImage": {
                    "rid": "<rid>",
                    "tag": "<tag>",
                    "sizeBytes": "1",
                    "status": "CONTAINER_IMAGE_STATUS_PENDING",
                    "createdAt": "2026-01-01T00:00:00Z",
                    "extractorRid": "<extractor rid>",
                    "inputs": [
                      {
                        "environmentVariable": "<environment variable>",
                        "name": "<name>",
                        "description": "<description>",
                        "fileFilters": [
                          {
                            "suffix": {
                              "suffix": "<suffix>"
                            }
                          }
                        ],
                        "required": true
                      }
                    ],
                    "parameters": [
                      {
                        "environmentVariable": "<environment variable>",
                        "name": "<name>",
                        "description": "<description>",
                        "required": true
                      }
                    ],
                    "fileOutputFormat": "FILE_OUTPUT_FORMAT_PARQUET",
                    "defaultTimestampMetadata": {
                      "seriesName": "<series name>",
                      "timestampType": {
                        "relative": {
                          "timeUnit": "<time unit>",
                          "offset": "2026-01-01T00:00:00Z"
                        }
                      }
                    },
                    "exitCodeMappings": [
                      {
                        "exitCode": 1,
                        "code": "<code>",
                        "message": "<message>",
                        "retryable": true
                      }
                    ],
                    "resources": {
                      "cpuCores": 1,
                      "memoryGib": 1,
                      "diskGib": 1
                    }
                  },
                  "origin": "EXTRACTOR_ORIGIN_CUSTOMER",
                  "catalogId": "<catalog id>",
                  "properties": {
                    "<key>": "<value>"
                  },
                  "labels": [
                    "<labels>"
                  ]
                },
                "desiredVersion": "<desired version>",
                "displayName": "<display name>",
                "description": "<description>"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "catalogId",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/EnableNativeExtractorBody"
            },
            "x-example": {
              "workspaceRid": "<workspace rid>"
            }
          }
        ],
        "tags": [
          "NativeExtractorService"
        ],
        "summary": "Enable native extractor",
        "description": "Enables a catalog entry in a workspace and converges it to the deployment's current desired version, materializing the workspace-local extractor and importing its container image. Idempotent: calling it on an already-enabled entry re-converges to the current desired version (this is also how a stale installation picks up a newly published version)."
      }
    },
    "/extractors/v2/search": {
      "post": {
        "operationId": "ContainerizedExtractorService_SearchContainerizedExtractors",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/SearchContainerizedExtractorsResponse"
            },
            "x-example": {
              "extractors": [
                {
                  "rid": "<rid>",
                  "workspaceRid": "<workspace rid>",
                  "name": "<name>",
                  "description": "<description>",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "isArchived": true,
                  "activeContainerImage": {
                    "rid": "<rid>",
                    "tag": "<tag>",
                    "sizeBytes": "1",
                    "status": "CONTAINER_IMAGE_STATUS_PENDING",
                    "createdAt": "2026-01-01T00:00:00Z",
                    "extractorRid": "<extractor rid>",
                    "inputs": [
                      {
                        "environmentVariable": "<environment variable>",
                        "name": "<name>",
                        "description": "<description>",
                        "fileFilters": [
                          {
                            "suffix": {
                              "suffix": "<suffix>"
                            }
                          }
                        ],
                        "required": true
                      }
                    ],
                    "parameters": [
                      {
                        "environmentVariable": "<environment variable>",
                        "name": "<name>",
                        "description": "<description>",
                        "required": true
                      }
                    ],
                    "fileOutputFormat": "FILE_OUTPUT_FORMAT_PARQUET",
                    "defaultTimestampMetadata": {
                      "seriesName": "<series name>",
                      "timestampType": {
                        "relative": {
                          "timeUnit": "<time unit>",
                          "offset": "2026-01-01T00:00:00Z"
                        }
                      }
                    },
                    "exitCodeMappings": [
                      {
                        "exitCode": 1,
                        "code": "<code>",
                        "message": "<message>",
                        "retryable": true
                      }
                    ],
                    "resources": {
                      "cpuCores": 1,
                      "memoryGib": 1,
                      "diskGib": 1
                    }
                  },
                  "origin": "EXTRACTOR_ORIGIN_CUSTOMER",
                  "catalogId": "<catalog id>",
                  "properties": {
                    "<key>": "<value>"
                  },
                  "labels": [
                    "<labels>"
                  ]
                }
              ],
              "nextPageToken": "<next page token>"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "description": "Search extractors within a workspace, with cursor-based pagination. Filter fields are intended to be added here over time; calling with only the workspace_rid set returns the default listing.",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SearchContainerizedExtractorsRequest"
            },
            "x-example": {
              "workspaceRid": "<workspace rid>",
              "pageSize": 1
            }
          }
        ],
        "tags": [
          "ContainerizedExtractorService"
        ],
        "summary": "Search containerized extractors",
        "description": "Search extractors within a workspace, with cursor-based pagination."
      }
    },
    "/extractors/v2/{rid}": {
      "get": {
        "operationId": "ContainerizedExtractorService_GetContainerizedExtractor",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/GetContainerizedExtractorResponse"
            },
            "x-example": {
              "extractor": {
                "rid": "<rid>",
                "workspaceRid": "<workspace rid>",
                "name": "<name>",
                "description": "<description>",
                "createdAt": "2026-01-01T00:00:00Z",
                "isArchived": true,
                "activeContainerImage": {
                  "rid": "<rid>",
                  "tag": "<tag>",
                  "sizeBytes": "1",
                  "status": "CONTAINER_IMAGE_STATUS_PENDING",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "extractorRid": "<extractor rid>",
                  "inputs": [
                    {
                      "environmentVariable": "<environment variable>",
                      "name": "<name>",
                      "description": "<description>",
                      "fileFilters": [
                        {
                          "suffix": {
                            "suffix": "<suffix>"
                          }
                        }
                      ],
                      "required": true
                    }
                  ],
                  "parameters": [
                    {
                      "environmentVariable": "<environment variable>",
                      "name": "<name>",
                      "description": "<description>",
                      "required": true
                    }
                  ],
                  "fileOutputFormat": "FILE_OUTPUT_FORMAT_PARQUET",
                  "defaultTimestampMetadata": {
                    "seriesName": "<series name>",
                    "timestampType": {
                      "relative": {
                        "timeUnit": "<time unit>",
                        "offset": "2026-01-01T00:00:00Z"
                      }
                    }
                  },
                  "exitCodeMappings": [
                    {
                      "exitCode": 1,
                      "code": "<code>",
                      "message": "<message>",
                      "retryable": true
                    }
                  ],
                  "resources": {
                    "cpuCores": 1,
                    "memoryGib": 1,
                    "diskGib": 1
                  }
                },
                "origin": "EXTRACTOR_ORIGIN_CUSTOMER",
                "catalogId": "<catalog id>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ]
              }
            }
          }
        },
        "parameters": [
          {
            "name": "rid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "workspaceRid",
            "in": "query",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "ContainerizedExtractorService"
        ],
        "summary": "Get containerized extractor",
        "description": "Fetch a single extractor by RID."
      },
      "patch": {
        "operationId": "ContainerizedExtractorService_UpdateContainerizedExtractor",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UpdateContainerizedExtractorResponse"
            },
            "x-example": {
              "extractor": {
                "rid": "<rid>",
                "workspaceRid": "<workspace rid>",
                "name": "<name>",
                "description": "<description>",
                "createdAt": "2026-01-01T00:00:00Z",
                "isArchived": true,
                "activeContainerImage": {
                  "rid": "<rid>",
                  "tag": "<tag>",
                  "sizeBytes": "1",
                  "status": "CONTAINER_IMAGE_STATUS_PENDING",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "extractorRid": "<extractor rid>",
                  "inputs": [
                    {
                      "environmentVariable": "<environment variable>",
                      "name": "<name>",
                      "description": "<description>",
                      "fileFilters": [
                        {
                          "suffix": {
                            "suffix": "<suffix>"
                          }
                        }
                      ],
                      "required": true
                    }
                  ],
                  "parameters": [
                    {
                      "environmentVariable": "<environment variable>",
                      "name": "<name>",
                      "description": "<description>",
                      "required": true
                    }
                  ],
                  "fileOutputFormat": "FILE_OUTPUT_FORMAT_PARQUET",
                  "defaultTimestampMetadata": {
                    "seriesName": "<series name>",
                    "timestampType": {
                      "relative": {
                        "timeUnit": "<time unit>",
                        "offset": "2026-01-01T00:00:00Z"
                      }
                    }
                  },
                  "exitCodeMappings": [
                    {
                      "exitCode": 1,
                      "code": "<code>",
                      "message": "<message>",
                      "retryable": true
                    }
                  ],
                  "resources": {
                    "cpuCores": 1,
                    "memoryGib": 1,
                    "diskGib": 1
                  }
                },
                "origin": "EXTRACTOR_ORIGIN_CUSTOMER",
                "catalogId": "<catalog id>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ]
              }
            }
          }
        },
        "parameters": [
          {
            "name": "rid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UpdateContainerizedExtractorBody"
            },
            "x-example": {
              "workspaceRid": "<workspace rid>"
            }
          }
        ],
        "tags": [
          "ContainerizedExtractorService"
        ],
        "summary": "Update containerized extractor",
        "description": "Partial update of an existing extractor. Use the `is_archived` field to archive / unarchive."
      }
    },
    "/extractors/v2/{rid}/archive": {
      "post": {
        "operationId": "ContainerizedExtractorService_ArchiveContainerizedExtractor",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/ArchiveContainerizedExtractorResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "rid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ArchiveContainerizedExtractorBody"
            },
            "x-example": {
              "workspaceRid": "<workspace rid>"
            }
          }
        ],
        "tags": [
          "ContainerizedExtractorService"
        ],
        "summary": "Archive containerized extractor",
        "description": "Archive an extractor so it is hidden from default search results and rejects new ingests."
      }
    },
    "/ingest/v2": {
      "post": {
        "operationId": "IngestService_Ingest",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/IngestResponse"
            },
            "x-example": {
              "ingestJobRid": "<ingest job rid>"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "description": "Request to submit a V2 ingest job.",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/IngestRequest"
            },
            "x-example": {
              "datasetRid": "<dataset rid>"
            }
          }
        ],
        "tags": [
          "IngestService"
        ],
        "summary": "Ingest",
        "description": "Submit a V2 ingest job."
      }
    },
    "/ingest/v2/streaming-sessions/search": {
      "post": {
        "operationId": "StreamingSessionService_SearchStreamingSessions",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/SearchStreamingSessionsResponse"
            },
            "x-example": {
              "streamingSessions": [
                {
                  "streamingSessionRid": "<streaming session rid>",
                  "datasetRid": "<dataset rid>",
                  "status": "STREAMING_SESSION_STATUS_IN_PROGRESS",
                  "source": {
                    "mesh": {
                      "sourceDatasetRid": "<source dataset rid>",
                      "sourceOrgRid": "<source org rid>",
                      "originSourceLabel": "<origin source label>"
                    }
                  },
                  "dataBounds": {
                    "start": "2026-01-01T00:00:00Z",
                    "end": "2026-01-01T00:00:00Z"
                  },
                  "pointsCount": "1",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "lastSeenAt": "2026-01-01T00:00:00Z",
                  "completedAt": "2026-01-01T00:00:00Z"
                }
              ],
              "nextPageToken": "<next page token>"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SearchStreamingSessionsRequest"
            },
            "x-example": {
              "pageSize": 1,
              "pageToken": "<page token>",
              "filter": {
                "datasetRids": {
                  "datasetRids": [
                    "<dataset rids>"
                  ]
                }
              },
              "sort": {
                "field": "STREAMING_SESSION_SORT_FIELD_CREATED_AT",
                "isDescending": true
              }
            }
          }
        ],
        "tags": [
          "StreamingSessionService"
        ],
        "summary": "Search streaming sessions",
        "description": "Searches streaming sessions visible to the caller."
      }
    },
    "/ingest/v2/streaming-sources/search": {
      "post": {
        "operationId": "StreamingSessionService_SearchStreamingSources",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/SearchStreamingSourcesResponse"
            },
            "x-example": {
              "streamingSources": [
                {
                  "source": {
                    "mesh": {
                      "sourceDatasetRid": "<source dataset rid>",
                      "sourceOrgRid": "<source org rid>",
                      "originSourceLabel": "<origin source label>"
                    }
                  },
                  "datasetRid": "<dataset rid>",
                  "sessionCount": "1",
                  "totalPointsCount": "1",
                  "earliestCreatedAt": "2026-01-01T00:00:00Z",
                  "latestLastSeenAt": "2026-01-01T00:00:00Z",
                  "mergedDataBounds": {
                    "start": "2026-01-01T00:00:00Z",
                    "end": "2026-01-01T00:00:00Z"
                  },
                  "anyInProgress": true
                }
              ],
              "nextPageToken": "<next page token>"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SearchStreamingSourcesRequest"
            },
            "x-example": {
              "pageSize": 1,
              "pageToken": "<page token>",
              "filter": {
                "datasetRids": {
                  "datasetRids": [
                    "<dataset rids>"
                  ]
                }
              },
              "lastSeenAfter": "2026-01-01T00:00:00Z"
            }
          }
        ],
        "tags": [
          "StreamingSessionService"
        ],
        "summary": "Search streaming sources",
        "description": "Searches streaming sources visible to the caller, aggregated by (source, dataset) and ordered by latest activity descending."
      }
    }
  },
  "definitions": {
    "ArchiveContainerizedExtractorResponse": {
      "type": "object"
    },
    "AvroIngestOptions": {
      "type": "object",
      "description": "Avro ingest options."
    },
    "ContainerizedExtractor": {
      "type": "object",
      "properties": {
        "rid": {
          "type": "string",
          "description": "Unique resource identifier for this extractor."
        },
        "workspaceRid": {
          "type": "string",
          "description": "Workspace that owns this extractor."
        },
        "name": {
          "type": "string",
          "description": "User-supplied name. Need not be unique within a workspace."
        },
        "description": {
          "type": "string",
          "description": "Free-form description shown in the UI."
        },
        "createdAt": {
          "type": "string",
          "format": "date-time",
          "description": "Timestamp at which this extractor was first registered."
        },
        "isArchived": {
          "type": "boolean",
          "description": "True once the extractor has been archived. Archived extractors are hidden from default search results and reject new ingests; flip back to false on UpdateContainerizedExtractor to restore."
        },
        "activeContainerImage": {
          "$ref": "#/definitions/ContainerImage",
          "description": "The container image currently selected to run this extractor. Unset until the first image for this extractor reaches READY status; ingest requests that arrive before then will fail. The schema fields (inputs, parameters, output_file_format, default_timestamp_metadata) live on this nested image."
        },
        "origin": {
          "$ref": "#/definitions/ExtractorOrigin",
          "description": "Provenance: CUSTOMER for workspace-authored extractors (the default), FIRST_PARTY for Nominal-published extractors installed from the catalog. Read-only: native-extractor rows are created and upgraded by catalog reconciliation, never through the public write APIs."
        },
        "catalogId": {
          "type": "string",
          "description": "Stable catalog identifier (e.g. \"ardupilot-dataflash\"). Set only when origin is FIRST_PARTY. The version currently active is carried by the installation record and by the active container image's tag, not duplicated here."
        },
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Free-form name/value pairs associated with this extractor. At most 64 pairs; names are 1-255 chars and values are up to 1024 chars.",
          "maxProperties": 64,
          "x-constraints": [
            "At most 64 entries."
          ]
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": "Labels applied to this extractor, filterable through SearchContainerizedExtractors. At most 64 labels of 1-255 chars each.",
          "maxItems": 64,
          "x-constraints": [
            "At most 64 items.",
            "Each item: 1 to 255 characters."
          ]
        }
      },
      "description": "A containerized extractor that processes input files using a self-hosted container image.\n\nSchema fields (inputs, parameters, output format, timestamp metadata) live on the underlying ContainerImage rows; clients should read them off `active_container_image`. The extractor itself carries only identity, workspace ownership, user metadata (labels/properties), and lifecycle state.",
      "required": [
        "rid",
        "workspaceRid"
      ]
    },
    "ArchiveContainerizedExtractorBody": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string"
        }
      },
      "required": [
        "workspaceRid"
      ],
      "example": {
        "workspaceRid": "<workspace rid>"
      }
    },
    "UpdateContainerizedExtractorBody": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "isArchived": {
          "type": "boolean",
          "description": "Set to true to archive, false to unarchive. Leave unset to leave archive state unchanged."
        },
        "activeContainerImageRid": {
          "type": "string",
          "description": "RID of the container image to set as the active one for this extractor. Must reference a ContainerImage that is owned by the same workspace, was built for this extractor, and has reached READY status. Leave unset to leave the active image unchanged."
        },
        "properties": {
          "$ref": "#/definitions/PropertyUpdateWrapper",
          "description": "Absent metadata is unchanged; present collections replace it, including empty collections. Uses the resource metadata limits above.",
          "x-constraints": [
            "properties must contain at most 64 pairs, with names of 1-255 characters and values up to 1024 characters."
          ]
        },
        "labels": {
          "$ref": "#/definitions/LabelUpdateWrapper",
          "description": "Uses the resource metadata limits above.",
          "x-constraints": [
            "labels must contain at most 64 entries of 1-255 characters each."
          ]
        }
      },
      "description": "Partial update. Only fields explicitly set on the request are modified; unset fields are left unchanged on the existing extractor. Archive state can be changed by setting `is_archived`; use ArchiveContainerizedExtractor when archiving through the dedicated endpoint. The active container image is selected by setting `active_container_image_rid`.",
      "required": [
        "workspaceRid"
      ],
      "example": {
        "workspaceRid": "<workspace rid>"
      }
    },
    "ContainerizedIngestItem": {
      "type": "object",
      "properties": {
        "extractorRid": {
          "type": "string"
        },
        "sources": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/IngestSource"
          }
        },
        "arguments": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "timestampMetadata": {
          "$ref": "#/definitions/ingest.v2.TimestampMetadata"
        }
      },
      "description": "One containerized extractor invocation. Input sources are bound to environment variables.",
      "required": [
        "extractorRid"
      ]
    },
    "CreateContainerizedExtractorRequest": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Free-form name/value pairs to associate with the new extractor. Uses the resource metadata limits above.",
          "maxProperties": 64,
          "x-constraints": [
            "At most 64 entries."
          ]
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": "Labels to apply to the new extractor. Uses the resource metadata limits above.",
          "maxItems": 64,
          "x-constraints": [
            "At most 64 items.",
            "Each item: 1 to 255 characters."
          ]
        }
      },
      "description": "Request to create a new self-hosted containerized extractor in a workspace. Schema fields (inputs / parameters / output format / timestamp metadata) are supplied with each container image via RegistryService.CreateImage and not on the extractor itself.",
      "required": [
        "workspaceRid",
        "name"
      ],
      "example": {
        "workspaceRid": "<workspace rid>",
        "name": "<name>"
      }
    },
    "CreateContainerizedExtractorResponse": {
      "type": "object",
      "properties": {
        "extractor": {
          "$ref": "#/definitions/ContainerizedExtractor"
        }
      }
    },
    "CsvFormat": {
      "type": "object",
      "properties": {
        "wide": {
          "$ref": "#/definitions/WideFormat"
        },
        "long": {
          "$ref": "#/definitions/LongFormat"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "wide",
            "long"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "wide": {
          "tagColumns": {
            "key": "string"
          },
          "excludeColumns": [
            "string"
          ]
        }
      }
    },
    "CsvIngestOptions": {
      "type": "object",
      "properties": {
        "format": {
          "$ref": "#/definitions/CsvFormat"
        },
        "headerRow": {
          "type": "integer",
          "format": "int32",
          "description": "One-based record number of the header, defaulting to 1; must be positive. Records are counted from 1, a multiline record counts as one, and blank lines are ignored.",
          "minimum": 0,
          "exclusiveMinimum": true,
          "x-constraints": [
            "Greater than 0."
          ]
        },
        "dataRow": {
          "type": "integer",
          "format": "int32",
          "description": "One-based record number of the first data record, defaulting to header_row + 1; must be greater than header_row. Records that fall between header_row and data_row are skipped.",
          "minimum": 0,
          "exclusiveMinimum": true,
          "x-constraints": [
            "Greater than 0."
          ]
        },
        "unitsRow": {
          "type": "integer",
          "format": "int32",
          "description": "One-based record number holding each column's unit; must not be header_row and must precede data_row, so reading a units row requires setting data_row past it. Cells match columns by position, so the record needs a placeholder cell for the timestamp column, and a column whose cell is empty gets no unit. Absent means no units row. FileIngestOptions.units overrides a unit read here, per channel.",
          "minimum": 0,
          "exclusiveMinimum": true,
          "x-constraints": [
            "Greater than 0."
          ]
        }
      },
      "description": "CSV ingest options.\n\ndata_row must be greater than header_row. units_row must not be header_row. units_row must be less than data_row, which defaults to header_row + 1.",
      "required": [
        "format"
      ]
    },
    "CustomSourceAttribution": {
      "type": "object",
      "properties": {
        "sourceName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1024,
          "x-constraints": [
            "1 to 1,024 characters."
          ]
        }
      },
      "description": "A caller-named streaming source."
    },
    "DataConnectorSourceAttribution": {
      "type": "object",
      "properties": {
        "dataConnectorRid": {
          "type": "string",
          "maxLength": 1024,
          "x-constraints": [
            "At most 1,024 characters."
          ]
        }
      },
      "description": "A streaming source fed by a data connector.",
      "required": [
        "dataConnectorRid"
      ]
    },
    "DataflashIngestItem": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/IngestSource"
        }
      },
      "description": "One ArduPilot dataflash log conversion. Worker-mcap converts the log into an avro stream that is then ingested into the dataset.",
      "required": [
        "source"
      ]
    },
    "DisableNativeExtractorResponse": {
      "type": "object"
    },
    "EnableNativeExtractorResponse": {
      "type": "object",
      "properties": {
        "extractor": {
          "$ref": "#/definitions/NativeExtractor"
        }
      }
    },
    "ExactStreamingSourceFilter": {
      "type": "object",
      "properties": {
        "datasetRid": {
          "type": "string",
          "maxLength": 1024,
          "x-constraints": [
            "At most 1,024 characters."
          ]
        },
        "source": {
          "$ref": "#/definitions/StreamingSourceAttribution"
        }
      },
      "description": "Matches a single streaming source: the sessions on `dataset_rid` with exactly the given `source` attribution. An absent `source` matches only unattributed sessions, not every source.",
      "required": [
        "datasetRid"
      ]
    },
    "ExtractorOrigin": {
      "type": "string",
      "enum": [
        "EXTRACTOR_ORIGIN_UNSPECIFIED",
        "EXTRACTOR_ORIGIN_CUSTOMER",
        "EXTRACTOR_ORIGIN_FIRST_PARTY"
      ],
      "default": "EXTRACTOR_ORIGIN_UNSPECIFIED",
      "description": "Provenance of a containerized extractor: authored by a customer workspace, or published by Nominal through the native extractor catalog and materialized into the workspace by catalog reconciliation.",
      "example": "EXTRACTOR_ORIGIN_CUSTOMER"
    },
    "FileIngestItem": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/IngestSource"
        },
        "ingest": {
          "$ref": "#/definitions/FileIngestOptions"
        }
      },
      "description": "Direct file ingest work.",
      "required": [
        "source",
        "ingest"
      ]
    },
    "FileIngestOptions": {
      "type": "object",
      "properties": {
        "timestampMetadata": {
          "$ref": "#/definitions/ingest.v2.TimestampMetadata"
        },
        "units": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Unit per channel. Overrides the unit read from CsvIngestOptions.units_row for the channels named here; channels absent from this map keep their units-row unit."
        },
        "channelPrefix": {
          "type": "string"
        },
        "channelNameOverrides": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Renames individual columns to explicit channel names. Composes with channel_prefix: final name = channel_prefix + channel_name_overrides.getOrDefault(column, column). At most 1000 entries may be provided. Resolved channel names must be unique across columns; renaming a column onto another column's name fails the ingest."
        },
        "csv": {
          "$ref": "#/definitions/CsvIngestOptions"
        },
        "parquet": {
          "$ref": "#/definitions/ParquetIngestOptions"
        },
        "avro": {
          "$ref": "#/definitions/AvroIngestOptions"
        }
      },
      "description": "Direct file ingest mode.\n\nSet exactly one of `csv`, `parquet`, `avro`.",
      "required": [
        "timestampMetadata"
      ],
      "x-oneofs": [
        {
          "fields": [
            "csv",
            "parquet",
            "avro"
          ],
          "required": true
        }
      ],
      "example": {
        "timestampMetadata": {
          "column": "string",
          "type": {
            "relative": {
              "timeUnit": "string",
              "offset": "2026-01-01T00:00:00Z"
            }
          }
        },
        "units": {
          "key": "string"
        },
        "channelPrefix": "string",
        "channelNameOverrides": {
          "key": "string"
        },
        "csv": {
          "format": {
            "wide": {
              "tagColumns": {
                "key": "string"
              },
              "excludeColumns": [
                "string"
              ]
            }
          },
          "headerRow": 1,
          "dataRow": 1,
          "unitsRow": 1
        }
      }
    },
    "FileStoreIngestSource": {
      "type": "object",
      "properties": {
        "fileRevisionRid": {
          "type": "string",
          "description": "Resolved File Store content target to ingest."
        }
      },
      "description": "File Store source. The resolved file RID supplies provider-specific pinning and dereference metadata."
    },
    "GcsIngestSource": {
      "type": "object",
      "properties": {
        "path": {
          "type": "string"
        }
      },
      "required": [
        "path"
      ]
    },
    "GetContainerizedExtractorResponse": {
      "type": "object",
      "properties": {
        "extractor": {
          "$ref": "#/definitions/ContainerizedExtractor"
        }
      }
    },
    "IngestItem": {
      "type": "object",
      "properties": {
        "tags": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Tags applied only to this ingest item. These override request-level tags on conflict."
        },
        "file": {
          "$ref": "#/definitions/FileIngestItem"
        },
        "log": {
          "$ref": "#/definitions/LogIngestItem"
        },
        "containerized": {
          "$ref": "#/definitions/ContainerizedIngestItem"
        },
        "video": {
          "$ref": "#/definitions/VideoIngestItem"
        },
        "pointCloud": {
          "$ref": "#/definitions/PointCloudIngestItem"
        },
        "mcap": {
          "$ref": "#/definitions/McapIngestItem"
        },
        "dataflash": {
          "$ref": "#/definitions/DataflashIngestItem"
        }
      },
      "description": "One unit of ingest work submitted under a single ingest job.\n\nSet exactly one of `file`, `log`, `containerized`, `video`, `pointCloud`, `mcap`, `dataflash`.",
      "x-oneofs": [
        {
          "fields": [
            "file",
            "log",
            "containerized",
            "video",
            "pointCloud",
            "mcap",
            "dataflash"
          ],
          "required": true
        }
      ],
      "example": {
        "tags": {
          "key": "string"
        },
        "file": {
          "source": {
            "s3": {
              "path": "string"
            }
          },
          "ingest": {
            "timestampMetadata": {
              "column": "string",
              "type": {
                "relative": {
                  "timeUnit": "string",
                  "offset": "2026-01-01T00:00:00Z"
                }
              }
            },
            "units": {
              "key": "string"
            },
            "channelPrefix": "string",
            "channelNameOverrides": {
              "key": "string"
            },
            "csv": {
              "format": {
                "wide": {
                  "tagColumns": {
                    "key": "string"
                  },
                  "excludeColumns": [
                    "string"
                  ]
                }
              },
              "headerRow": 1,
              "dataRow": 1,
              "unitsRow": 1
            }
          }
        }
      }
    },
    "IngestRequest": {
      "type": "object",
      "properties": {
        "datasetRid": {
          "type": "string",
          "description": "Existing dataset that all items in this job will ingest into."
        },
        "runsToExpand": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/IngestItem"
          },
          "description": "Units of ingest work to submit under one ingest job RID.",
          "minItems": 1,
          "x-constraints": [
            "At least 1 item."
          ]
        },
        "tags": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Tags applied to every item in this ingest job. Item-level tags override these values."
        }
      },
      "description": "Request to submit a V2 ingest job.",
      "required": [
        "datasetRid"
      ],
      "example": {
        "datasetRid": "<dataset rid>"
      }
    },
    "IngestResponse": {
      "type": "object",
      "properties": {
        "ingestJobRid": {
          "type": "string",
          "description": "RID for the submitted ingest job."
        }
      },
      "description": "Response from submitting a V2 ingest job.",
      "required": [
        "ingestJobRid"
      ]
    },
    "IngestSource": {
      "type": "object",
      "properties": {
        "s3": {
          "$ref": "#/definitions/S3IngestSource"
        },
        "gcs": {
          "$ref": "#/definitions/GcsIngestSource"
        },
        "presignedFile": {
          "$ref": "#/definitions/PresignedFileIngestSource"
        },
        "fileStore": {
          "$ref": "#/definitions/FileStoreIngestSource",
          "description": "Initially supported for direct file ingest only."
        }
      },
      "description": "Source file location.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "s3",
            "gcs",
            "presignedFile",
            "fileStore"
          ],
          "required": true
        }
      ],
      "example": {
        "s3": {
          "path": "string"
        }
      }
    },
    "ListNativeExtractorsResponse": {
      "type": "object",
      "properties": {
        "extractors": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/NativeExtractor"
          }
        },
        "nextPageToken": {
          "type": "string",
          "description": "Set when more entries remain; pass it back verbatim to fetch the next page."
        }
      }
    },
    "LogIngestItem": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/IngestSource"
        },
        "channel": {
          "type": "string"
        },
        "timestampMetadata": {
          "$ref": "#/definitions/ingest.v2.TimestampMetadata"
        },
        "messageField": {
          "type": "string",
          "description": "JSON field whose value becomes the log message. Defaults to the journald MESSAGE field."
        }
      },
      "description": "Single-channel log or journal ingest work.",
      "required": [
        "source"
      ]
    },
    "LongFormat": {
      "type": "object",
      "properties": {
        "channelColumn": {
          "type": "string",
          "description": "Defaults to \"channel\"."
        },
        "valueColumn": {
          "type": "string",
          "description": "Defaults to \"value\"."
        },
        "tagsColumn": {
          "type": "string",
          "description": "Defaults to \"tags\"."
        }
      },
      "description": "Long format: each row or record contains one channel, timestamp, and value sample."
    },
    "McapChannelLocator": {
      "type": "object",
      "properties": {
        "topic": {
          "type": "string"
        },
        "id": {
          "type": "integer",
          "format": "int32"
        }
      },
      "description": "Locates the video's channel within an mcap file. Topics are not guaranteed unique, so an mcap file with duplicate topics must be located by id.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "topic",
            "id"
          ],
          "required": true
        }
      ],
      "example": {
        "topic": "string"
      }
    },
    "McapChannelSelection": {
      "type": "object",
      "properties": {
        "includeTopics": {
          "$ref": "#/definitions/McapTopicNames"
        },
        "excludeTopics": {
          "$ref": "#/definitions/McapTopicNames"
        }
      },
      "description": "Selects mcap channels by topic name. All channels are ingested when neither list is set.\n\nSet at most one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "includeTopics",
            "excludeTopics"
          ],
          "required": false
        }
      ],
      "example": {
        "includeTopics": {
          "topics": [
            "string"
          ]
        }
      }
    },
    "McapIngestItem": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/IngestSource"
        },
        "channels": {
          "$ref": "#/definitions/McapChannelSelection",
          "description": "Which mcap channels to ingest, selected by topic name. All channels when unset."
        },
        "ignoreInvalidTopics": {
          "type": "boolean",
          "description": "Skip topics whose schemas cannot be decoded instead of failing the conversion."
        }
      },
      "description": "One mcap file conversion. Worker-mcap converts the file's protobuf channels into an avro stream that is then ingested into the dataset.",
      "required": [
        "source"
      ]
    },
    "McapTimestampManifest": {
      "type": "object",
      "properties": {
        "channelLocator": {
          "$ref": "#/definitions/McapChannelLocator"
        }
      },
      "description": "Frame timestamps are embedded in the mcap file that carries the video frames, rather than supplied as a sidecar manifest.",
      "required": [
        "channelLocator"
      ]
    },
    "McapTopicNames": {
      "type": "object",
      "properties": {
        "topics": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "MeshSourceAttribution": {
      "type": "object",
      "properties": {
        "sourceDatasetRid": {
          "type": "string",
          "maxLength": 1024,
          "x-constraints": [
            "At most 1,024 characters."
          ]
        },
        "sourceOrgRid": {
          "type": "string",
          "maxLength": 1024,
          "x-constraints": [
            "At most 1,024 characters."
          ]
        },
        "originSourceLabel": {
          "type": "string",
          "description": "Label for this data's source on the originating deployment, as that deployment reported it. Opaque: Nominal stores and returns it without interpreting it. It is part of the session's identity, so writes carrying different labels resolve to different sessions.",
          "minLength": 1,
          "maxLength": 1024,
          "x-constraints": [
            "1 to 1,024 characters."
          ]
        }
      },
      "description": "A streaming source replicated from a dataset in another organization over mesh.",
      "required": [
        "sourceDatasetRid",
        "sourceOrgRid"
      ]
    },
    "NativeExtractor": {
      "type": "object",
      "properties": {
        "catalogId": {
          "type": "string",
          "description": "Stable catalog identifier, e.g. \"ardupilot-dataflash\"."
        },
        "availableVersions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Versions the deployment's catalog currently carries, ascending."
        },
        "installation": {
          "$ref": "#/definitions/ContainerizedExtractor",
          "description": "The workspace-local extractor materialized for this entry, set when enabled. Ingest requests target it exactly like a customer-authored extractor, and the catalog version it is installed at is its active image's tag."
        },
        "desiredVersion": {
          "type": "string",
          "description": "The single version every workspace on this deployment converges to for this catalog entry. Enable always targets this version; there is no per-workspace pin. Unset only if the deployment has not yet synced this catalog entry."
        },
        "displayName": {
          "type": "string",
          "description": "Human-readable name from the manifest of the desired version — or of the newest available version when none is desired yet — e.g. \"ArduPilot DataFlash\". Enable gives the installation this same name, so an entry in the catalog and the extractor it installs read alike. Falls back to catalog_id when the mirrored manifest cannot be parsed."
        },
        "description": {
          "type": "string",
          "description": "Free-form summary from that same manifest, when it declares one."
        }
      },
      "description": "One catalog entry as seen from a workspace: what the deployment carries, plus this workspace's installation of it (if enabled)."
    },
    "DisableNativeExtractorBody": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string"
        }
      },
      "description": "Archives the workspace's extractor, which is the installation. Registered images and past ingests are untouched; re-enabling unarchives the same extractor.",
      "required": [
        "workspaceRid"
      ],
      "example": {
        "workspaceRid": "<workspace rid>"
      }
    },
    "EnableNativeExtractorBody": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string"
        }
      },
      "required": [
        "workspaceRid"
      ],
      "example": {
        "workspaceRid": "<workspace rid>"
      }
    },
    "NoTimestampManifest": {
      "type": "object",
      "properties": {
        "startingTimestamp": {
          "type": "string",
          "format": "date-time"
        },
        "scaleParameter": {
          "$ref": "#/definitions/ScaleParameter"
        }
      },
      "required": [
        "startingTimestamp"
      ]
    },
    "ParquetFormat": {
      "type": "object",
      "properties": {
        "wide": {
          "$ref": "#/definitions/WideFormat"
        },
        "long": {
          "$ref": "#/definitions/LongFormat"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "wide",
            "long"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "wide": {
          "tagColumns": {
            "key": "string"
          },
          "excludeColumns": [
            "string"
          ]
        }
      }
    },
    "ParquetIngestOptions": {
      "type": "object",
      "properties": {
        "format": {
          "$ref": "#/definitions/ParquetFormat"
        },
        "isArchive": {
          "type": "boolean"
        }
      },
      "description": "Parquet ingest options.",
      "required": [
        "format"
      ]
    },
    "PointCloudIngestItem": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/IngestSource"
        },
        "ingest": {
          "$ref": "#/definitions/PointCloudIngestOptions"
        }
      },
      "description": "Dataset-backed point cloud ingest work.",
      "required": [
        "source",
        "ingest"
      ]
    },
    "PointCloudIngestOptions": {
      "type": "object",
      "properties": {
        "sensorMetadata": {
          "$ref": "#/definitions/PointCloudSensorMetadata"
        },
        "channel": {
          "type": "string"
        }
      },
      "required": [
        "channel"
      ]
    },
    "PointCloudSensorMetadata": {
      "type": "object",
      "properties": {
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "description": "Placeholder for point-cloud sensor metadata until the spatial metadata proto is promoted."
    },
    "PresignedFileIngestSource": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string"
        }
      },
      "required": [
        "url"
      ]
    },
    "S3IngestSource": {
      "type": "object",
      "properties": {
        "path": {
          "type": "string"
        }
      },
      "required": [
        "path"
      ]
    },
    "ScaleParameter": {
      "type": "object",
      "properties": {
        "trueFrameRate": {
          "type": "number",
          "format": "double"
        },
        "endingTimestamp": {
          "type": "string",
          "format": "date-time"
        },
        "scaleFactor": {
          "type": "number",
          "format": "double"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "trueFrameRate",
            "endingTimestamp",
            "scaleFactor"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "trueFrameRate": 1
      }
    },
    "SearchContainerizedExtractorsRequest": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string"
        },
        "includeArchived": {
          "type": "boolean",
          "description": "When true, archived extractors are also returned."
        },
        "pageSize": {
          "type": "integer",
          "format": "int32",
          "minimum": 1,
          "maximum": 1000,
          "x-constraints": [
            "From 1 to 1,000."
          ]
        },
        "nextPageToken": {
          "type": "string"
        },
        "fileExtension": {
          "type": "string",
          "description": "When set, restricts results to extractors whose active container image is READY and declares at least one FileExtractionInput whose file_filters include this suffix. Example values: \"csv\", \"parquet\", \"mcap\" — no leading dot, case-sensitive against FileSuffix.suffix.",
          "minLength": 1,
          "maxLength": 32,
          "x-constraints": [
            "1 to 32 characters."
          ]
        },
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "When non-empty, restricts results to extractors whose properties contain every one of these name/value pairs (exact match, AND semantics). Uses the resource metadata limits above.",
          "maxProperties": 64,
          "x-constraints": [
            "At most 64 entries."
          ]
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "description": "When non-empty, restricts results to extractors carrying all of these labels (exact match, AND semantics). Uses the resource metadata limits above.",
          "maxItems": 64,
          "x-constraints": [
            "At most 64 items.",
            "Each item: 1 to 255 characters."
          ]
        }
      },
      "description": "Search extractors within a workspace, with cursor-based pagination. Filter fields are intended to be added here over time; calling with only the workspace_rid set returns the default listing.",
      "required": [
        "workspaceRid",
        "pageSize"
      ],
      "example": {
        "workspaceRid": "<workspace rid>",
        "pageSize": 1
      }
    },
    "SearchContainerizedExtractorsResponse": {
      "type": "object",
      "properties": {
        "extractors": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/ContainerizedExtractor"
          }
        },
        "nextPageToken": {
          "type": "string"
        }
      }
    },
    "SearchStreamingSessionsRequest": {
      "type": "object",
      "properties": {
        "pageSize": {
          "type": "integer",
          "format": "int32",
          "description": "Defaults to 100.",
          "minimum": 1,
          "maximum": 1000,
          "x-constraints": [
            "From 1 to 1,000."
          ]
        },
        "pageToken": {
          "type": "string",
          "maxLength": 4096,
          "x-constraints": [
            "At most 4,096 characters."
          ]
        },
        "filter": {
          "$ref": "#/definitions/StreamingSessionSearchFilter",
          "description": "Absent matches every session visible to the caller. The filter tree may contain at most 1000 nodes and 32 levels of nesting."
        },
        "sort": {
          "$ref": "#/definitions/StreamingSessionSortOptions",
          "description": "Defaults to `created_at` descending."
        }
      },
      "example": {
        "pageSize": 1,
        "pageToken": "<page token>",
        "filter": {
          "datasetRids": {
            "datasetRids": [
              "<dataset rids>"
            ]
          }
        },
        "sort": {
          "field": "STREAMING_SESSION_SORT_FIELD_CREATED_AT",
          "isDescending": true
        }
      }
    },
    "SearchStreamingSessionsResponse": {
      "type": "object",
      "properties": {
        "streamingSessions": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/StreamingSession"
          }
        },
        "nextPageToken": {
          "type": "string"
        }
      }
    },
    "SearchStreamingSourcesRequest": {
      "type": "object",
      "properties": {
        "pageSize": {
          "type": "integer",
          "format": "int32",
          "description": "Defaults to 100.",
          "minimum": 1,
          "maximum": 1000,
          "x-constraints": [
            "From 1 to 1,000."
          ]
        },
        "pageToken": {
          "type": "string",
          "maxLength": 4096,
          "x-constraints": [
            "At most 4,096 characters."
          ]
        },
        "filter": {
          "$ref": "#/definitions/StreamingSourceSearchFilter",
          "description": "Absent matches every source visible to the caller. The filter tree may contain at most 1000 nodes and 32 levels of nesting."
        },
        "lastSeenAfter": {
          "type": "string",
          "format": "date-time",
          "description": "If present, only sessions last seen strictly after this instant are aggregated; groups whose sessions were all last seen at or before it are omitted."
        }
      },
      "example": {
        "pageSize": 1,
        "pageToken": "<page token>",
        "filter": {
          "datasetRids": {
            "datasetRids": [
              "<dataset rids>"
            ]
          }
        },
        "lastSeenAfter": "2026-01-01T00:00:00Z"
      }
    },
    "SearchStreamingSourcesResponse": {
      "type": "object",
      "properties": {
        "streamingSources": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/StreamingSource"
          }
        },
        "nextPageToken": {
          "type": "string"
        }
      }
    },
    "StreamingDatasetRidsFilter": {
      "type": "object",
      "properties": {
        "datasetRids": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1024
          },
          "maxItems": 1000,
          "uniqueItems": true,
          "x-constraints": [
            "At most 1,000 items.",
            "No duplicates.",
            "Each item: at most 1,024 characters."
          ]
        }
      },
      "description": "Matches the given datasets. An empty list matches every dataset."
    },
    "StreamingSession": {
      "type": "object",
      "properties": {
        "streamingSessionRid": {
          "type": "string"
        },
        "datasetRid": {
          "type": "string"
        },
        "status": {
          "$ref": "#/definitions/StreamingSessionStatus"
        },
        "source": {
          "$ref": "#/definitions/StreamingSourceAttribution",
          "description": "Absent for unattributed sessions."
        },
        "dataBounds": {
          "$ref": "#/definitions/TimeRange",
          "description": "The time range of the data ingested so far. Absent until the first points are recorded."
        },
        "pointsCount": {
          "type": "string",
          "format": "int64"
        },
        "createdAt": {
          "type": "string",
          "format": "date-time"
        },
        "lastSeenAt": {
          "type": "string",
          "format": "date-time",
          "description": "Time of the most recent heartbeat for this session."
        },
        "completedAt": {
          "type": "string",
          "format": "date-time",
          "description": "Time the session was completed. Absent while the session is in progress."
        }
      },
      "description": "A streaming ingest session on a dataset.",
      "required": [
        "streamingSessionRid",
        "datasetRid",
        "status",
        "createdAt",
        "lastSeenAt"
      ]
    },
    "StreamingSessionAndFilter": {
      "type": "object",
      "properties": {
        "filters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/StreamingSessionSearchFilter"
          },
          "minItems": 1,
          "maxItems": 100,
          "x-constraints": [
            "1 to 100 items."
          ]
        }
      },
      "description": "Matches when every child filter matches."
    },
    "StreamingSessionDataBoundsFilter": {
      "type": "object",
      "properties": {
        "start": {
          "type": "string",
          "format": "date-time"
        },
        "end": {
          "type": "string",
          "format": "date-time"
        }
      },
      "description": "Matches sessions whose data bounds overlap this window. Sessions with no data bounds do not match. If both ends are present, `start` must not be after `end`."
    },
    "StreamingSessionNotFilter": {
      "type": "object",
      "properties": {
        "filter": {
          "$ref": "#/definitions/StreamingSessionSearchFilter"
        }
      },
      "description": "Matches when the child filter does not.",
      "required": [
        "filter"
      ]
    },
    "StreamingSessionOrFilter": {
      "type": "object",
      "properties": {
        "filters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/StreamingSessionSearchFilter"
          },
          "minItems": 1,
          "maxItems": 100,
          "x-constraints": [
            "1 to 100 items."
          ]
        }
      },
      "description": "Matches when any child filter matches."
    },
    "StreamingSessionSearchFilter": {
      "type": "object",
      "properties": {
        "datasetRids": {
          "$ref": "#/definitions/StreamingDatasetRidsFilter"
        },
        "source": {
          "$ref": "#/definitions/ExactStreamingSourceFilter"
        },
        "dataBoundsOverlap": {
          "$ref": "#/definitions/StreamingSessionDataBoundsFilter"
        },
        "workspace": {
          "$ref": "#/definitions/StreamingWorkspaceFilter"
        },
        "and": {
          "$ref": "#/definitions/StreamingSessionAndFilter"
        },
        "or": {
          "$ref": "#/definitions/StreamingSessionOrFilter"
        },
        "not": {
          "$ref": "#/definitions/StreamingSessionNotFilter"
        }
      },
      "description": "Filter for streaming-session search.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "datasetRids",
            "source",
            "dataBoundsOverlap",
            "workspace",
            "and",
            "or",
            "not"
          ],
          "required": true
        }
      ],
      "example": {
        "datasetRids": {
          "datasetRids": [
            "string"
          ]
        }
      }
    },
    "StreamingSessionSortField": {
      "type": "string",
      "enum": [
        "STREAMING_SESSION_SORT_FIELD_UNSPECIFIED",
        "STREAMING_SESSION_SORT_FIELD_CREATED_AT",
        "STREAMING_SESSION_SORT_FIELD_DATA_BOUNDS_START"
      ],
      "default": "STREAMING_SESSION_SORT_FIELD_UNSPECIFIED",
      "description": "- STREAMING_SESSION_SORT_FIELD_CREATED_AT: Orders by the time the session was created.\n - STREAMING_SESSION_SORT_FIELD_DATA_BOUNDS_START: Orders by the start of the session's data bounds. Sessions with no data bounds are excluded from the results.",
      "example": "STREAMING_SESSION_SORT_FIELD_CREATED_AT"
    },
    "StreamingSessionSortOptions": {
      "type": "object",
      "properties": {
        "field": {
          "$ref": "#/definitions/StreamingSessionSortField"
        },
        "isDescending": {
          "type": "boolean"
        }
      }
    },
    "StreamingSessionStatus": {
      "type": "string",
      "enum": [
        "STREAMING_SESSION_STATUS_UNSPECIFIED",
        "STREAMING_SESSION_STATUS_IN_PROGRESS",
        "STREAMING_SESSION_STATUS_COMPLETED"
      ],
      "default": "STREAMING_SESSION_STATUS_UNSPECIFIED",
      "description": "- STREAMING_SESSION_STATUS_IN_PROGRESS: The session accepts heartbeats.\n - STREAMING_SESSION_STATUS_COMPLETED: The server completed the session once it had recorded a minimum number of points and either stopped receiving heartbeats or reached its maximum age. A completed session accepts no further heartbeats; resolving the same source starts a new session.",
      "example": "STREAMING_SESSION_STATUS_IN_PROGRESS"
    },
    "StreamingSource": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/StreamingSourceAttribution",
          "description": "Absent for unattributed sessions."
        },
        "datasetRid": {
          "type": "string"
        },
        "sessionCount": {
          "type": "string",
          "format": "int64",
          "description": "Number of sessions aggregated into this group."
        },
        "totalPointsCount": {
          "type": "string",
          "format": "int64",
          "description": "Sum of the points counts across the aggregated sessions."
        },
        "earliestCreatedAt": {
          "type": "string",
          "format": "date-time",
          "description": "Creation time of the oldest aggregated session."
        },
        "latestLastSeenAt": {
          "type": "string",
          "format": "date-time",
          "description": "Most recent heartbeat time across the aggregated sessions."
        },
        "mergedDataBounds": {
          "$ref": "#/definitions/TimeRange",
          "description": "Union of the data bounds across the aggregated sessions, if any session has data bounds."
        },
        "anyInProgress": {
          "type": "boolean",
          "description": "True if at least one aggregated session is in progress."
        }
      },
      "description": "Aggregate view of the streaming sessions sharing a single (source, dataset) pair.",
      "required": [
        "datasetRid",
        "earliestCreatedAt",
        "latestLastSeenAt"
      ]
    },
    "StreamingSourceAndFilter": {
      "type": "object",
      "properties": {
        "filters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/StreamingSourceSearchFilter"
          },
          "minItems": 1,
          "maxItems": 100,
          "x-constraints": [
            "1 to 100 items."
          ]
        }
      },
      "description": "Matches when every child filter matches."
    },
    "StreamingSourceAttribution": {
      "type": "object",
      "properties": {
        "mesh": {
          "$ref": "#/definitions/MeshSourceAttribution"
        },
        "dataConnector": {
          "$ref": "#/definitions/DataConnectorSourceAttribution"
        },
        "custom": {
          "$ref": "#/definitions/CustomSourceAttribution"
        }
      },
      "description": "Where a streaming session's data comes from.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "mesh",
            "dataConnector",
            "custom"
          ],
          "required": true
        }
      ],
      "example": {
        "mesh": {
          "sourceDatasetRid": "string",
          "sourceOrgRid": "string",
          "originSourceLabel": "string"
        }
      }
    },
    "StreamingSourceNotFilter": {
      "type": "object",
      "properties": {
        "filter": {
          "$ref": "#/definitions/StreamingSourceSearchFilter"
        }
      },
      "description": "Matches when the child filter does not.",
      "required": [
        "filter"
      ]
    },
    "StreamingSourceOrFilter": {
      "type": "object",
      "properties": {
        "filters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/StreamingSourceSearchFilter"
          },
          "minItems": 1,
          "maxItems": 100,
          "x-constraints": [
            "1 to 100 items."
          ]
        }
      },
      "description": "Matches when any child filter matches."
    },
    "StreamingSourceSearchFilter": {
      "type": "object",
      "properties": {
        "datasetRids": {
          "$ref": "#/definitions/StreamingDatasetRidsFilter"
        },
        "source": {
          "$ref": "#/definitions/ExactStreamingSourceFilter"
        },
        "workspace": {
          "$ref": "#/definitions/StreamingWorkspaceFilter"
        },
        "and": {
          "$ref": "#/definitions/StreamingSourceAndFilter"
        },
        "or": {
          "$ref": "#/definitions/StreamingSourceOrFilter"
        },
        "not": {
          "$ref": "#/definitions/StreamingSourceNotFilter"
        }
      },
      "description": "Filter for streaming-source search.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "datasetRids",
            "source",
            "workspace",
            "and",
            "or",
            "not"
          ],
          "required": true
        }
      ],
      "example": {
        "datasetRids": {
          "datasetRids": [
            "string"
          ]
        }
      }
    },
    "StreamingWorkspaceFilter": {
      "type": "object",
      "properties": {
        "workspaceRid": {
          "type": "string",
          "maxLength": 1024,
          "x-constraints": [
            "At most 1,024 characters."
          ]
        }
      },
      "description": "Matches sessions or sources whose dataset belongs to the workspace.",
      "required": [
        "workspaceRid"
      ]
    },
    "TimeRange": {
      "type": "object",
      "properties": {
        "start": {
          "type": "string",
          "format": "date-time"
        },
        "end": {
          "type": "string",
          "format": "date-time"
        }
      },
      "description": "A closed time range.\n\nstart must not be after end.",
      "required": [
        "start",
        "end"
      ]
    },
    "TimestampManifestFiles": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/IngestSource"
          },
          "minItems": 1,
          "x-constraints": [
            "At least 1 item."
          ]
        }
      },
      "description": "Sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video's frame timestamps are recorded across several files."
    },
    "ingest.v2.TimestampMetadata": {
      "type": "object",
      "properties": {
        "column": {
          "type": "string"
        },
        "type": {
          "$ref": "#/definitions/TimestampType"
        }
      },
      "description": "Timestamp metadata for ingest items that derive timestamps from an input column or field.",
      "required": [
        "column",
        "type"
      ]
    },
    "UpdateContainerizedExtractorResponse": {
      "type": "object",
      "properties": {
        "extractor": {
          "$ref": "#/definitions/ContainerizedExtractor"
        }
      }
    },
    "VideoIngestItem": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/IngestSource"
        },
        "ingest": {
          "$ref": "#/definitions/VideoIngestOptions"
        },
        "additionalSources": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/IngestSource"
          },
          "description": "Videos appended in order after `source`, ingested as one continuous recording on the channel. Each becomes its own dataset file. The first file starts at the no-manifest starting timestamp and each later file starts where the previous one ends. Requires a no_manifest timestamp manifest and sources other than File Store; at most 99, so 100 files in all.",
          "maxItems": 99,
          "x-constraints": [
            "At most 99 items."
          ]
        }
      },
      "description": "Dataset-file-backed video ingest work.",
      "required": [
        "source",
        "ingest"
      ]
    },
    "VideoIngestOptions": {
      "type": "object",
      "properties": {
        "timestampManifest": {
          "$ref": "#/definitions/VideoTimestampManifest"
        },
        "channel": {
          "type": "string"
        },
        "overwriteSegments": {
          "type": "boolean"
        }
      },
      "required": [
        "timestampManifest",
        "channel"
      ]
    },
    "VideoTimestampManifest": {
      "type": "object",
      "properties": {
        "noManifest": {
          "$ref": "#/definitions/NoTimestampManifest"
        },
        "timestampManifestFiles": {
          "$ref": "#/definitions/TimestampManifestFiles"
        },
        "mcap": {
          "$ref": "#/definitions/McapTimestampManifest"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "noManifest",
            "timestampManifestFiles",
            "mcap"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "noManifest": {
          "startingTimestamp": "2026-01-01T00:00:00Z",
          "scaleParameter": {
            "trueFrameRate": 1
          }
        }
      }
    },
    "WideFormat": {
      "type": "object",
      "properties": {
        "tagColumns": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "excludeColumns": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "description": "Wide format: each row or record contains one timestamp and many channels as columns."
    },
    "ContainerImage": {
      "type": "object",
      "properties": {
        "rid": {
          "type": "string"
        },
        "tag": {
          "type": "string",
          "description": "User-supplied tag, unique within (workspace, extractor)."
        },
        "sizeBytes": {
          "type": "string",
          "format": "int64",
          "description": "Size of the stored image in bytes once the image reaches READY."
        },
        "status": {
          "$ref": "#/definitions/ContainerImageStatus",
          "description": "Current lifecycle status (PENDING while pushing, READY after a successful push, FAILED otherwise)."
        },
        "createdAt": {
          "type": "string",
          "format": "date-time",
          "description": "When the image record was created."
        },
        "extractorRid": {
          "type": "string",
          "description": "The containerized extractor this image is built for."
        },
        "inputs": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/FileExtractionInput"
          },
          "description": "The input files this extractor requires, mapped to environment variables that store the path to each file."
        },
        "parameters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/FileExtractionParameter"
          },
          "description": "Parameters the extractor accepts."
        },
        "fileOutputFormat": {
          "$ref": "#/definitions/FileOutputFormat",
          "description": "Format of the output file produced by the extractor."
        },
        "defaultTimestampMetadata": {
          "$ref": "#/definitions/registry.v2.TimestampMetadata",
          "description": "Metadata about the intermediate parquet this extractor will produce. If not set, timestamp metadata must be provided at ingest time."
        },
        "exitCodeMappings": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/ExitCodeMapping"
          },
          "description": "Fallback exit-code-to-error mappings for extractors that cannot emit a structured /dev/termination-log document."
        },
        "resources": {
          "$ref": "#/definitions/ContainerResources",
          "description": "Compute resources this image's extractor container runs with. Unset fields fall back to the deployment-wide defaults."
        }
      },
      "description": "Container image registered through the V2 (extractor-linked) registry flow. V2 images carry no user-supplied `name` — extractor identity replaces it as the stable handle.",
      "required": [
        "rid"
      ]
    },
    "ContainerImageStatus": {
      "type": "string",
      "enum": [
        "CONTAINER_IMAGE_STATUS_UNSPECIFIED",
        "CONTAINER_IMAGE_STATUS_PENDING",
        "CONTAINER_IMAGE_STATUS_READY",
        "CONTAINER_IMAGE_STATUS_FAILED"
      ],
      "default": "CONTAINER_IMAGE_STATUS_UNSPECIFIED",
      "example": "CONTAINER_IMAGE_STATUS_PENDING"
    },
    "ContainerResources": {
      "type": "object",
      "properties": {
        "cpuCores": {
          "type": "integer",
          "format": "int64",
          "description": "CPU cores requested for the container.",
          "minimum": 1,
          "maximum": 32,
          "x-constraints": [
            "From 1 to 32."
          ]
        },
        "memoryGib": {
          "type": "integer",
          "format": "int64",
          "description": "Memory in GiB, applied as both the request and the limit.",
          "minimum": 1,
          "maximum": 128,
          "x-constraints": [
            "From 1 to 128."
          ]
        },
        "diskGib": {
          "type": "integer",
          "format": "int64",
          "description": "Size in GiB of each of the ephemeral input and output volumes.",
          "minimum": 1,
          "maximum": 512,
          "x-constraints": [
            "From 1 to 512."
          ]
        }
      },
      "description": "Compute resources granted to the container this image runs. Every field is optional; an unset field falls back to the deployment-wide default configured on combined-service. The upper bounds are a platform ceiling, not a guarantee the cluster can satisfy the request — an unschedulable pod fails the ingest with EXTRACTOR_UNSCHEDULABLE. RegistryService re-checks them server-side, because the first-party catalog flow calls CreateImage in-process and never reaches protovalidate."
    },
    "ExitCodeMapping": {
      "type": "object",
      "properties": {
        "exitCode": {
          "type": "integer",
          "format": "int32",
          "description": "The container process exit code this mapping applies to."
        },
        "code": {
          "type": "string",
          "description": "Machine-readable error code. Extractor-defined codes must fall outside the reserved platform namespace."
        },
        "message": {
          "type": "string",
          "description": "Human-readable error message."
        },
        "retryable": {
          "type": "boolean",
          "description": "Whether the platform may retry the ingest for this failure."
        }
      },
      "description": "Maps a container exit code to a structured error, for extractors that cannot emit a structured /dev/termination-log document. Applied as a fallback error tier at ingest time.",
      "required": [
        "code",
        "message"
      ]
    },
    "FileExtractionInput": {
      "type": "object",
      "properties": {
        "environmentVariable": {
          "type": "string",
          "description": "The environment variable that stores the path to the input file."
        },
        "name": {
          "type": "string",
          "description": "Name of the input file which users will be prompted with."
        },
        "description": {
          "type": "string",
          "description": "Description of the input file which users will be prompted with."
        },
        "fileFilters": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/FileFilter"
          },
          "description": "Optionally filter files for file selection."
        },
        "required": {
          "type": "boolean",
          "description": "Whether the input file is required for the extractor to run."
        }
      },
      "description": "Defines an input file to be provided to the extractor.",
      "required": [
        "environmentVariable",
        "name"
      ]
    },
    "FileExtractionParameter": {
      "type": "object",
      "properties": {
        "environmentVariable": {
          "type": "string",
          "description": "The environment variable that stores the argument."
        },
        "name": {
          "type": "string",
          "description": "Name of the parameter which users will be prompted with."
        },
        "description": {
          "type": "string",
          "description": "Description of the parameter which users will be prompted with."
        },
        "required": {
          "type": "boolean",
          "description": "Whether the parameter is required for the extractor to run."
        }
      },
      "description": "Defines an input parameter to be provided to the extractor.",
      "required": [
        "environmentVariable",
        "name"
      ]
    },
    "FileFilter": {
      "type": "object",
      "properties": {
        "suffix": {
          "$ref": "#/definitions/FileSuffix"
        }
      },
      "description": "Optional filter applied during file selection for a file input.",
      "x-oneofs": [
        {
          "fields": [
            "suffix"
          ],
          "required": true
        }
      ],
      "example": {
        "suffix": {
          "suffix": "string"
        }
      }
    },
    "FileOutputFormat": {
      "type": "string",
      "enum": [
        "FILE_OUTPUT_FORMAT_UNSPECIFIED",
        "FILE_OUTPUT_FORMAT_PARQUET",
        "FILE_OUTPUT_FORMAT_CSV",
        "FILE_OUTPUT_FORMAT_PARQUET_TAR",
        "FILE_OUTPUT_FORMAT_AVRO_STREAM",
        "FILE_OUTPUT_FORMAT_JSON_L",
        "FILE_OUTPUT_FORMAT_MANIFEST"
      ],
      "default": "FILE_OUTPUT_FORMAT_UNSPECIFIED",
      "description": "Output file format emitted by the extractor. Currently PARQUET, CSV, and PARQUET_TAR are the primary supported formats.",
      "example": "FILE_OUTPUT_FORMAT_PARQUET"
    },
    "FileSuffix": {
      "type": "object",
      "properties": {
        "suffix": {
          "type": "string"
        }
      },
      "description": "The expected suffix of the file. For example, \"parquet\", \"json\", \"csv\", etc.",
      "required": [
        "suffix"
      ]
    },
    "registry.v2.TimestampMetadata": {
      "type": "object",
      "properties": {
        "seriesName": {
          "type": "string",
          "description": "Name of the series within the output whose values are used as the row timestamp."
        },
        "timestampType": {
          "$ref": "#/definitions/TimestampType",
          "description": "How the values in `series_name` should be interpreted as timestamps."
        }
      },
      "description": "Describes how to derive a row timestamp from the extracted output.",
      "required": [
        "seriesName",
        "timestampType"
      ]
    },
    "LabelUpdateWrapper": {
      "type": "object",
      "properties": {
        "labels": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "title": "Wrapper classes to allow for optional fields on update requests"
    },
    "PropertyUpdateWrapper": {
      "type": "object",
      "properties": {
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      }
    },
    "AbsoluteTimestamp": {
      "type": "object",
      "properties": {
        "iso8601": {
          "$ref": "#/definitions/Iso8601Timestamp"
        },
        "epochOfTimeUnit": {
          "$ref": "#/definitions/EpochTimestamp"
        },
        "customFormat": {
          "$ref": "#/definitions/CustomTimestamp"
        }
      },
      "description": "Absolute timestamp parser variants.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "iso8601",
            "epochOfTimeUnit",
            "customFormat"
          ],
          "required": true
        }
      ],
      "example": {
        "iso8601": {}
      }
    },
    "CustomTimestamp": {
      "type": "object",
      "properties": {
        "format": {
          "type": "string",
          "description": "The format string should be in the format of the `DateTimeFormatter` class in Java."
        },
        "defaultYear": {
          "type": "integer",
          "format": "int32",
          "description": "Default year is accepted as an optional field for cases like IRIG time format. Will be overridden by year in time format."
        },
        "defaultDayOfYear": {
          "type": "integer",
          "format": "int32",
          "description": "Default day of year is accepted as an optional field for cases like IRIG time format. Will be overridden by day of year in time format.",
          "minimum": 1,
          "maximum": 366,
          "x-constraints": [
            "From 1 to 366."
          ]
        }
      },
      "description": "Absolute timestamps parsed with a user-supplied format string."
    },
    "EpochTimestamp": {
      "type": "object",
      "properties": {
        "timeUnit": {
          "type": "string",
          "description": "Unit in which epoch values are expressed (e.g. SECONDS, MILLISECONDS)."
        }
      },
      "description": "Absolute timestamps expressed as an integer count of some time unit since the Unix epoch."
    },
    "Iso8601Timestamp": {
      "type": "object",
      "description": "Absolute timestamps serialized in ISO-8601 form. No additional parser configuration is needed."
    },
    "RelativeTimestamp": {
      "type": "object",
      "properties": {
        "timeUnit": {
          "type": "string",
          "description": "Unit in which relative offsets are expressed. Aliases the classic REST TimeUnit alias."
        },
        "offset": {
          "type": "string",
          "format": "date-time",
          "description": "Starting timestamp to use when indexing the file."
        }
      },
      "description": "Relative timestamp parser: interprets each row's timestamp as an offset from a fixed origin."
    },
    "TimestampType": {
      "type": "object",
      "properties": {
        "relative": {
          "$ref": "#/definitions/RelativeTimestamp"
        },
        "absolute": {
          "$ref": "#/definitions/AbsoluteTimestamp"
        }
      },
      "description": "Selects between relative-offset and absolute-timestamp parsing strategies.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "relative",
            "absolute"
          ],
          "required": true
        }
      ],
      "example": {
        "relative": {
          "timeUnit": "string",
          "offset": "2026-01-01T00:00:00Z"
        }
      }
    }
  },
  "securityDefinitions": {
    "ApiKey": {
      "type": "apiKey",
      "in": "header",
      "name": "Authorization",
      "description": "Your API key as a bearer token: `Authorization: Bearer <api key>`."
    }
  },
  "security": [
    {
      "ApiKey": []
    }
  ]
}
