{
    "openapi": "3.0.3",
    "info": {
        "title": "PoreStore Automation API",
        "version": "1.0.0",
        "description": "Team-scoped API for direct image upload, asynchronous ingestion, supported analyses and results. The integration guide, parameter reference and result keys are at https://docs.porestore.com/api/."
    },
    "paths": {
        "/api/v1/teams/{team_slug}/analysis-jobs/": {
            "get": {
                "operationId": "v1_team_analysis_jobs_list",
                "description": "Lists every analysis job in the team. The list is not paginated and its order is not guaranteed.",
                "summary": "List jobs",
                "parameters": [
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisJobList"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "post": {
                "operationId": "v1_team_analysis_jobs_create",
                "description": "Queues the analysis on a ready image and returns 202 with the new job. Send `Idempotency-Key` so that a retry cannot submit a second job.",
                "summary": "Submit a job",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Optional team-scoped key (maximum 255 characters). An exact replay returns the original job; reusing it with a different request returns 409. Exact replays remain available after an analysis flag is disabled; a new submission must pass current availability."
                    },
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalysisSubmissionRequest"
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalysisSubmissionRequest"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalysisSubmissionRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisJob"
                                }
                            }
                        },
                        "description": ""
                    },
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisJob"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisUnavailableResponse"
                                }
                            }
                        },
                        "description": "An unavailable analysis returns error.code analysis_unavailable. 403 permission_denied is also used for a key that is not valid for a team the caller belongs to; a team the caller cannot access returns 404."
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/analysis-jobs/{job_id}/": {
            "get": {
                "operationId": "v1_team_analysis_jobs_retrieve",
                "description": "Returns one job, including its status and progress. Poll it until `status` is `completed`, `failed` or `cancelled`.",
                "summary": "Get a job",
                "parameters": [
                    {
                        "in": "path",
                        "name": "job_id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "The job's `id`.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisJob"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/analysis-jobs/{job_id}/cancel/": {
            "post": {
                "operationId": "v1_team_analysis_jobs_cancel",
                "description": "Cancels a job that has not started running (`pending` or `queued`), then returns it, `cancelled`. A job that has started cannot be cancelled: 409 `job_started`. A job that starts in the moment the cancel arrives is stopped by it.",
                "summary": "Cancel a job",
                "parameters": [
                    {
                        "in": "path",
                        "name": "job_id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "The job's `id`.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisJob"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisUnavailableResponse"
                                }
                            }
                        },
                        "description": "An unavailable analysis returns error.code analysis_unavailable. 403 permission_denied is also used for a key that is not valid for a team the caller belongs to; a team the caller cannot access returns 404."
                    },
                    "409": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/JobCancelRefusedResponse"
                                }
                            }
                        },
                        "description": ""
                    },
                    "503": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/JobCancelRefusedResponse"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/analysis-jobs/{job_id}/result/": {
            "get": {
                "operationId": "v1_team_analysis_jobs_result_retrieve",
                "description": "Returns a completed job's result, converted with the image's current voxel size. Returns 400 until the job is completed.",
                "summary": "Get a result",
                "parameters": [
                    {
                        "in": "path",
                        "name": "job_id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "The job's `id`.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisResult"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/analysis-types/": {
            "get": {
                "operationId": "v1_team_analysis_types_list",
                "description": "Lists the analyses the team can run now, each with a JSON Schema for its `parameters`. Read this before building a request: backends, compute tiers and released analyses change over time.",
                "summary": "List analysis types",
                "parameters": [
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalysisTypeList"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/images/": {
            "get": {
                "operationId": "v1_team_images_list",
                "description": "Lists every image in the team. The list is not paginated and its order is not guaranteed.",
                "summary": "List images",
                "parameters": [
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ImageList"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/images/{image_id}/": {
            "get": {
                "operationId": "v1_team_images_retrieve",
                "description": "Returns one image, including its ingestion status.",
                "summary": "Get an image",
                "parameters": [
                    {
                        "in": "path",
                        "name": "image_id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "The image's `id`.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Image"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "delete": {
                "operationId": "v1_team_images_destroy",
                "description": "Deletes an image and its stored data: the uploaded file and the image store, with any fields saved in it. Jobs already run on the image, and their results, are kept. This cannot be undone.",
                "summary": "Delete an image",
                "parameters": [
                    {
                        "in": "path",
                        "name": "image_id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "The image's `id`.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/uploads/": {
            "post": {
                "operationId": "v1_team_upload_sessions_create",
                "description": "Returns a presigned form that uploads the file straight to object storage. POST a multipart form to `url` with every entry of `fields`, then the file in a field called `file`. The form is valid for one hour and accepts one file of up to 4 GiB. Then complete the upload within 6 days of uploading the file: a later completion is refused, and an uploaded file no image was made from is deleted after 7 days.",
                "summary": "Create an upload session",
                "parameters": [
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UploadSessionRequest"
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "$ref": "#/components/schemas/UploadSessionRequest"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/UploadSessionRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "201": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UploadSession"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/api/v1/teams/{team_slug}/uploads/{upload_id}/complete/": {
            "post": {
                "operationId": "v1_team_upload_completion_create",
                "description": "Registers the uploaded file as an image and starts ingesting it. Send the same `filename` used to create the session, within 6 days of uploading the file; a later completion is refused. Returns the image with `status` `processing`; poll it until it is `ready` or `failed`.",
                "summary": "Complete an upload",
                "parameters": [
                    {
                        "in": "path",
                        "name": "team_slug",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Your team's Team ID, shown in team settings and on the API keys page. The guides write it as `{team_id}`.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "upload_id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "The upload session's `id`, returned when the session was created.",
                        "required": true
                    }
                ],
                "tags": [
                    "API v1"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UploadCompletionRequest"
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "$ref": "#/components/schemas/UploadCompletionRequest"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/UploadCompletionRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "ApiKeyAuth": []
                    },
                    {
                        "cookieAuth": []
                    },
                    {
                        "ApiKeyAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Image"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "AnalysisJob": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "format": "uuid"
                    },
                    "image_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "The image the job ran on. Null once that image has been deleted."
                    },
                    "analysis_type": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string",
                        "description": "`pending`, `queued`, `processing`, `completed`, `failed` or `cancelled`. A job is `queued` until its work starts running, and `processing` while it runs. New values may be added."
                    },
                    "queue_reason": {
                        "type": "string",
                        "nullable": true,
                        "description": "While the job is `pending` or `queued`, why it waits, when known: `behind_other_jobs` (the workers that run it are busy) or `scarce_hardware` (the hardware it needs is in short supply, which can take minutes to hours; a job that cannot start in time to finish within a day fails). Null otherwise. New values may be added."
                    },
                    "parameters": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "The normalised parameters the job ran with, including defaults and routing fields."
                    },
                    "progress_percentage": {
                        "type": "integer",
                        "description": "A coarse 0–100 indicator, not a run-time prediction."
                    },
                    "error_message": {
                        "type": "string",
                        "description": "Why the job failed or was cancelled. Empty otherwise."
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "started_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "When the job was picked up to run."
                    },
                    "completed_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "When the job finished."
                    },
                    "selected_compute_tier": {
                        "type": "string",
                        "nullable": true,
                        "description": "The key of the compute tier the job ran on. Null for analyses without tiers."
                    },
                    "solver_converged": {
                        "type": "boolean",
                        "nullable": true,
                        "description": "For iterative solvers, whether every convergence check passed. Null otherwise."
                    },
                    "solver_iterations_completed": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Iterations the solver ran."
                    },
                    "solver_wall_time_seconds": {
                        "type": "number",
                        "format": "double",
                        "nullable": true,
                        "description": "Always null for customer keys; staff keys may receive provider telemetry."
                    },
                    "solver_convergence_telemetry": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Per-check convergence history, where the solver reports it."
                    },
                    "solver_version": {
                        "type": "string",
                        "nullable": true,
                        "description": "Version of the solver that produced the result."
                    },
                    "worker_image_tag": {
                        "type": "string",
                        "nullable": true,
                        "description": "Provenance: the worker build that ran the job."
                    },
                    "worker_image_digest": {
                        "type": "string",
                        "nullable": true,
                        "description": "Provenance: the exact worker image that ran the job."
                    },
                    "worker_application_revision": {
                        "type": "string",
                        "nullable": true,
                        "description": "Provenance: the source revision of the worker that ran the job."
                    },
                    "compute_hardware": {
                        "type": "string",
                        "nullable": true,
                        "description": "Provenance: the GPU or CPU the job ran on, such as `NVIDIA A40`."
                    }
                },
                "required": [
                    "analysis_type",
                    "completed_at",
                    "compute_hardware",
                    "created_at",
                    "error_message",
                    "id",
                    "image_id",
                    "parameters",
                    "progress_percentage",
                    "queue_reason",
                    "selected_compute_tier",
                    "solver_converged",
                    "solver_convergence_telemetry",
                    "solver_iterations_completed",
                    "solver_version",
                    "solver_wall_time_seconds",
                    "started_at",
                    "status",
                    "worker_application_revision",
                    "worker_image_digest",
                    "worker_image_tag"
                ]
            },
            "AnalysisJobList": {
                "type": "object",
                "properties": {
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/AnalysisJob"
                        }
                    }
                },
                "required": [
                    "results"
                ]
            },
            "AnalysisResult": {
                "type": "object",
                "properties": {
                    "job_id": {
                        "type": "string",
                        "format": "uuid"
                    },
                    "metrics": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "The result. Its `solution` holds the analysis's outputs in the image's units."
                    }
                },
                "required": [
                    "job_id",
                    "metrics"
                ]
            },
            "AnalysisSubmissionRequest": {
                "type": "object",
                "properties": {
                    "analysis_type": {
                        "$ref": "#/components/schemas/AnalysisTypeEnum"
                    },
                    "image_id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "A `ready` image in this team."
                    },
                    "parameters": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Validated against the analysis's `parameters_schema` from List analysis types."
                    }
                },
                "required": [
                    "analysis_type",
                    "image_id",
                    "parameters"
                ]
            },
            "AnalysisType": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string",
                        "description": "The `analysis_type` to send when submitting."
                    },
                    "label": {
                        "type": "string",
                        "description": "Human-readable name."
                    },
                    "contract_version": {
                        "type": "integer",
                        "description": "Version of the analysis's input and output contract."
                    },
                    "expected_duration_seconds": {
                        "type": "integer",
                        "description": "A typical run time. A job still running after twice this is cancelled."
                    },
                    "required_solution_keys": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Keys always present in the result's `solution`."
                    },
                    "parameters_schema": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "JSON Schema for the job's `parameters`."
                    }
                },
                "required": [
                    "contract_version",
                    "expected_duration_seconds",
                    "label",
                    "parameters_schema",
                    "required_solution_keys",
                    "slug"
                ]
            },
            "AnalysisTypeEnum": {
                "enum": [
                    "network_extraction",
                    "network_validation",
                    "permeability",
                    "diffusivity",
                    "conductivity",
                    "poresize",
                    "hg_porosimetry",
                    "radial_density",
                    "chord_length_distribution",
                    "porosity_profile",
                    "porosity_connectivity",
                    "rev_porosity",
                    "sem_view",
                    "xray_view",
                    "interfacial_surface_area"
                ],
                "type": "string",
                "description": "* `network_extraction` - network_extraction\n* `network_validation` - network_validation\n* `permeability` - permeability\n* `diffusivity` - diffusivity\n* `conductivity` - conductivity\n* `poresize` - poresize\n* `hg_porosimetry` - hg_porosimetry\n* `radial_density` - radial_density\n* `chord_length_distribution` - chord_length_distribution\n* `porosity_profile` - porosity_profile\n* `porosity_connectivity` - porosity_connectivity\n* `rev_porosity` - rev_porosity\n* `sem_view` - sem_view\n* `xray_view` - xray_view\n* `interfacial_surface_area` - interfacial_surface_area"
            },
            "AnalysisTypeList": {
                "type": "object",
                "properties": {
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/AnalysisType"
                        }
                    }
                },
                "required": [
                    "results"
                ]
            },
            "AnalysisUnavailableResponse": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Error envelope with code analysis_unavailable, a message, and details."
                    }
                },
                "required": [
                    "error"
                ]
            },
            "Image": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "format": "uuid"
                    },
                    "name": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string",
                        "description": "`processing` while ingestion runs, then `ready` or `failed`. New values may be added."
                    },
                    "file_size": {
                        "type": "integer",
                        "description": "Bytes in the uploaded file."
                    },
                    "dimensions": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "nullable": true,
                        "description": "The array shape, NumPy axes 0, 1 and 2. Null until ingestion ends."
                    },
                    "voxel_size": {
                        "type": "number",
                        "format": "double",
                        "nullable": true,
                        "description": "Edge length of one voxel in micrometres."
                    },
                    "metrics": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "What ingestion measured: always `shape`, `data_type` and `range`; for binary images also `porosity` and `segmentation_phase_state`. Other keys may appear."
                    },
                    "processing_error": {
                        "type": "string",
                        "description": "Why ingestion failed. Empty otherwise."
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "updated_at": {
                        "type": "string",
                        "format": "date-time"
                    }
                },
                "required": [
                    "created_at",
                    "description",
                    "dimensions",
                    "file_size",
                    "id",
                    "metrics",
                    "name",
                    "processing_error",
                    "status",
                    "updated_at",
                    "voxel_size"
                ]
            },
            "ImageList": {
                "type": "object",
                "properties": {
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Image"
                        }
                    }
                },
                "required": [
                    "results"
                ]
            },
            "JobCancelRefusedResponse": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Error envelope. Its code is `job_started` when the job is already running, `job_ended` when it has finished, or `cancel_unconfirmed` when the cancel could not be confirmed yet, so try again."
                    }
                },
                "required": [
                    "error"
                ]
            },
            "UploadCompletionRequest": {
                "type": "object",
                "properties": {
                    "filename": {
                        "type": "string",
                        "description": "The same filename the upload session was created with.",
                        "maxLength": 255
                    },
                    "name": {
                        "type": "string",
                        "description": "Display name. Defaults to the filename.",
                        "maxLength": 200
                    },
                    "description": {
                        "type": "string",
                        "description": "Free text."
                    },
                    "voxel_size": {
                        "type": "number",
                        "format": "double",
                        "description": "Edge length of one voxel in micrometres, a positive finite number. Results are in physical units only when it is set."
                    },
                    "raw_metadata": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Required for .raw files: `width`, `height`, `depth` and `dtype`, such as `uint8`."
                    },
                    "compute_tier": {
                        "type": "string",
                        "description": "`auto` (the default), or the key of a guarded compute tier this team has been given to ingest on.",
                        "maxLength": 100
                    }
                },
                "required": [
                    "filename"
                ]
            },
            "UploadSession": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "The upload session's ID, used to complete the upload."
                    },
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Where to POST the file, as multipart form data. Do not send your API key."
                    },
                    "fields": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Form fields to send, exactly as given, before the file field `file`."
                    },
                    "storage_key": {
                        "type": "string",
                        "description": "Where the file will be stored."
                    },
                    "expires_in_seconds": {
                        "type": "integer",
                        "description": "How long the form stays valid."
                    },
                    "max_file_size": {
                        "type": "integer",
                        "description": "The largest file the form accepts, in bytes."
                    }
                },
                "required": [
                    "expires_in_seconds",
                    "fields",
                    "id",
                    "max_file_size",
                    "storage_key",
                    "url"
                ]
            },
            "UploadSessionRequest": {
                "type": "object",
                "properties": {
                    "filename": {
                        "type": "string",
                        "description": "The file's name. Its extension picks the decoder: .npy, .npz, .zip, .raw, .tif or .tiff.",
                        "maxLength": 255
                    },
                    "name": {
                        "type": "string",
                        "description": "Display name. Defaults to the filename.",
                        "maxLength": 200
                    },
                    "description": {
                        "type": "string",
                        "description": "Free text."
                    },
                    "voxel_size": {
                        "type": "number",
                        "format": "double",
                        "description": "Edge length of one voxel in micrometres, a positive finite number. Results are in physical units only when it is set."
                    },
                    "raw_metadata": {
                        "type": "object",
                        "additionalProperties": {},
                        "description": "Required for .raw files: `width`, `height`, `depth` and `dtype`, such as `uint8`."
                    }
                },
                "required": [
                    "filename"
                ]
            }
        },
        "securitySchemes": {
            "ApiKeyAuth": {
                "type": "apiKey",
                "in": "header",
                "name": "Authorization"
            },
            "cookieAuth": {
                "type": "apiKey",
                "in": "cookie",
                "name": "sessionid"
            }
        }
    }
}
